Skip to content

Commit 0d59ef5

Browse files
authored
Bitbucket: mainbranch can be None (#7725)
For some reason the API sometimes doesn't have a mainbranch, and it doesn't have an empty dict but None as value...
1 parent 8118908 commit 0d59ef5

File tree

2 files changed

+135
-97
lines changed

2 files changed

+135
-97
lines changed

readthedocs/oauth/services/bitbucket.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,8 @@ def create_repository(self, fields, privacy=None, organization=None):
155155

156156
repo.html_url = fields['links']['html']['href']
157157
repo.vcs = fields['scm']
158-
repo.default_branch = fields.get('mainbranch', {}).get('name')
158+
mainbranch = fields.get('mainbranch') or {}
159+
repo.default_branch = mainbranch.get('name')
159160
repo.account = self.account
160161

161162
avatar_url = fields['links']['avatar']['href'] or ''

readthedocs/rtd_tests/tests/test_oauth.py

Lines changed: 133 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -442,101 +442,6 @@ def test_get_provider_data_attribute_error(self, session, mock_logger):
442442
class BitbucketOAuthTests(TestCase):
443443

444444
fixtures = ['eric', 'test_data']
445-
repo_response_data = {
446-
'scm': 'hg',
447-
'has_wiki': True,
448-
'description': 'Site for tutorial101 files',
449-
'links': {
450-
'watchers': {
451-
'href': 'https://api.bitbucket.org/2.0/repositories/tutorials/tutorials.bitbucket.org/watchers',
452-
},
453-
'commits': {
454-
'href': 'https://api.bitbucket.org/2.0/repositories/tutorials/tutorials.bitbucket.org/commits',
455-
},
456-
'self': {
457-
'href': 'https://api.bitbucket.org/2.0/repositories/tutorials/tutorials.bitbucket.org',
458-
},
459-
'html': {
460-
'href': 'https://bitbucket.org/tutorials/tutorials.bitbucket.org',
461-
},
462-
'avatar': {
463-
'href': 'https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2012/Nov/28/tutorials.bitbucket.org-logo-1456883302-9_avatar.png',
464-
},
465-
'forks': {
466-
'href': 'https://api.bitbucket.org/2.0/repositories/tutorials/tutorials.bitbucket.org/forks',
467-
},
468-
'clone': [
469-
{
470-
'href': 'https://[email protected]/tutorials/tutorials.bitbucket.org',
471-
'name': 'https',
472-
},
473-
{
474-
'href': 'ssh://[email protected]/tutorials/tutorials.bitbucket.org',
475-
'name': 'ssh',
476-
},
477-
],
478-
'pullrequests': {
479-
'href': 'https://api.bitbucket.org/2.0/repositories/tutorials/tutorials.bitbucket.org/pullrequests',
480-
},
481-
},
482-
'fork_policy': 'allow_forks',
483-
'name': 'tutorials.bitbucket.org',
484-
'language': 'html/css',
485-
'created_on': '2011-12-20T16:35:06.480042+00:00',
486-
'full_name': 'tutorials/tutorials.bitbucket.org',
487-
'has_issues': True,
488-
'owner': {
489-
'username': 'tutorials',
490-
'display_name': 'tutorials account',
491-
'uuid': '{c788b2da-b7a2-404c-9e26-d3f077557007}',
492-
'links': {
493-
'self': {
494-
'href': 'https://api.bitbucket.org/2.0/users/tutorials',
495-
},
496-
'html': {
497-
'href': 'https://bitbucket.org/tutorials',
498-
},
499-
'avatar': {
500-
'href': 'https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2013/Nov/25/tutorials-avatar-1563784409-6_avatar.png',
501-
},
502-
},
503-
},
504-
'updated_on': '2014-11-03T02:24:08.409995+00:00',
505-
'size': 76182262,
506-
'is_private': False,
507-
'uuid': '{9970a9b6-2d86-413f-8555-da8e1ac0e542}',
508-
}
509-
510-
team_response_data = {
511-
'username': 'teamsinspace',
512-
'website': None,
513-
'display_name': 'Teams In Space',
514-
'uuid': '{61fc5cf6-d054-47d2-b4a9-061ccf858379}',
515-
'links': {
516-
'self': {
517-
'href': 'https://api.bitbucket.org/2.0/teams/teamsinspace',
518-
},
519-
'repositories': {
520-
'href': 'https://api.bitbucket.org/2.0/repositories/teamsinspace',
521-
},
522-
'html': {'href': 'https://bitbucket.org/teamsinspace'},
523-
'followers': {
524-
'href': 'https://api.bitbucket.org/2.0/teams/teamsinspace/followers',
525-
},
526-
'avatar': {
527-
'href': 'https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2014/Sep/24/teamsinspace-avatar-3731530358-7_avatar.png',
528-
},
529-
'members': {
530-
'href': 'https://api.bitbucket.org/2.0/teams/teamsinspace/members',
531-
},
532-
'following': {
533-
'href': 'https://api.bitbucket.org/2.0/teams/teamsinspace/following',
534-
},
535-
},
536-
'created_on': '2014-04-08T00:00:14.070969+00:00',
537-
'location': None,
538-
'type': 'team',
539-
}
540445

541446
def setUp(self):
542447
self.client.login(username='eric', password='test')
@@ -567,9 +472,140 @@ def setUp(self):
567472
},
568473
'url': 'https://readthedocs.io/api/v2/webhook/test/99999999/',
569474
},]
570-
}
475+
}
476+
self.repo_response_data = {
477+
'scm': 'hg',
478+
'has_wiki': True,
479+
'description': 'Site for tutorial101 files',
480+
'links': {
481+
'watchers': {
482+
'href': 'https://api.bitbucket.org/2.0/repositories/tutorials/tutorials.bitbucket.org/watchers',
483+
},
484+
'commits': {
485+
'href': 'https://api.bitbucket.org/2.0/repositories/tutorials/tutorials.bitbucket.org/commits',
486+
},
487+
'self': {
488+
'href': 'https://api.bitbucket.org/2.0/repositories/tutorials/tutorials.bitbucket.org',
489+
},
490+
'html': {
491+
'href': 'https://bitbucket.org/tutorials/tutorials.bitbucket.org',
492+
},
493+
'avatar': {
494+
'href': 'https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2012/Nov/28/tutorials.bitbucket.org-logo-1456883302-9_avatar.png',
495+
},
496+
'forks': {
497+
'href': 'https://api.bitbucket.org/2.0/repositories/tutorials/tutorials.bitbucket.org/forks',
498+
},
499+
'clone': [
500+
{
501+
'href': 'https://[email protected]/tutorials/tutorials.bitbucket.org',
502+
'name': 'https',
503+
},
504+
{
505+
'href': 'ssh://[email protected]/tutorials/tutorials.bitbucket.org',
506+
'name': 'ssh',
507+
},
508+
],
509+
'pullrequests': {
510+
'href': 'https://api.bitbucket.org/2.0/repositories/tutorials/tutorials.bitbucket.org/pullrequests',
511+
},
512+
},
513+
'fork_policy': 'allow_forks',
514+
'name': 'tutorials.bitbucket.org',
515+
'language': 'html/css',
516+
'created_on': '2011-12-20T16:35:06.480042+00:00',
517+
'full_name': 'tutorials/tutorials.bitbucket.org',
518+
'has_issues': True,
519+
'owner': {
520+
'username': 'tutorials',
521+
'display_name': 'tutorials account',
522+
'uuid': '{c788b2da-b7a2-404c-9e26-d3f077557007}',
523+
'links': {
524+
'self': {
525+
'href': 'https://api.bitbucket.org/2.0/users/tutorials',
526+
},
527+
'html': {
528+
'href': 'https://bitbucket.org/tutorials',
529+
},
530+
'avatar': {
531+
'href': 'https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2013/Nov/25/tutorials-avatar-1563784409-6_avatar.png',
532+
},
533+
},
534+
},
535+
'updated_on': '2014-11-03T02:24:08.409995+00:00',
536+
'size': 76182262,
537+
'is_private': False,
538+
'uuid': '{9970a9b6-2d86-413f-8555-da8e1ac0e542}',
539+
'mainbranch': {
540+
'type': 'branch',
541+
'name': 'main',
542+
},
543+
}
544+
545+
self.team_response_data = {
546+
'username': 'teamsinspace',
547+
'website': None,
548+
'display_name': 'Teams In Space',
549+
'uuid': '{61fc5cf6-d054-47d2-b4a9-061ccf858379}',
550+
'links': {
551+
'self': {
552+
'href': 'https://api.bitbucket.org/2.0/teams/teamsinspace',
553+
},
554+
'repositories': {
555+
'href': 'https://api.bitbucket.org/2.0/repositories/teamsinspace',
556+
},
557+
'html': {'href': 'https://bitbucket.org/teamsinspace'},
558+
'followers': {
559+
'href': 'https://api.bitbucket.org/2.0/teams/teamsinspace/followers',
560+
},
561+
'avatar': {
562+
'href': 'https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2014/Sep/24/teamsinspace-avatar-3731530358-7_avatar.png',
563+
},
564+
'members': {
565+
'href': 'https://api.bitbucket.org/2.0/teams/teamsinspace/members',
566+
},
567+
'following': {
568+
'href': 'https://api.bitbucket.org/2.0/teams/teamsinspace/following',
569+
},
570+
},
571+
'created_on': '2014-04-08T00:00:14.070969+00:00',
572+
'location': None,
573+
'type': 'team',
574+
}
571575

572576
def test_make_project_pass(self):
577+
repo = self.service.create_repository(
578+
self.repo_response_data, organization=self.org,
579+
privacy=self.privacy,
580+
)
581+
self.assertIsInstance(repo, RemoteRepository)
582+
self.assertEqual(repo.name, 'tutorials.bitbucket.org')
583+
self.assertEqual(repo.full_name, 'tutorials/tutorials.bitbucket.org')
584+
self.assertEqual(repo.description, 'Site for tutorial101 files')
585+
self.assertEqual(repo.default_branch, 'main')
586+
self.assertEqual(
587+
repo.avatar_url, (
588+
'https://bitbucket-assetroot.s3.amazonaws.com/c/photos/2012/Nov/28/'
589+
'tutorials.bitbucket.org-logo-1456883302-9_avatar.png'
590+
),
591+
)
592+
self.assertIn(self.user, repo.users.all())
593+
self.assertEqual(repo.organization, self.org)
594+
self.assertEqual(
595+
repo.clone_url,
596+
'https://bitbucket.org/tutorials/tutorials.bitbucket.org',
597+
)
598+
self.assertEqual(
599+
repo.ssh_url,
600+
'ssh://[email protected]/tutorials/tutorials.bitbucket.org',
601+
)
602+
self.assertEqual(
603+
repo.html_url,
604+
'https://bitbucket.org/tutorials/tutorials.bitbucket.org',
605+
)
606+
607+
def test_make_project_mainbranch_none(self):
608+
self.repo_response_data['mainbranch'] = None
573609
repo = self.service.create_repository(
574610
self.repo_response_data, organization=self.org,
575611
privacy=self.privacy,
@@ -598,6 +634,7 @@ def test_make_project_pass(self):
598634
repo.html_url,
599635
'https://bitbucket.org/tutorials/tutorials.bitbucket.org',
600636
)
637+
self.assertEqual(repo.default_branch, None)
601638

602639
def test_make_project_fail(self):
603640
data = self.repo_response_data.copy()

0 commit comments

Comments
 (0)