|
1 | 1 | from django.test import TestCase
|
2 | 2 |
|
3 | 3 | from django.contrib.auth.models import User
|
4 |
| -from allauth.socialaccount.models import SocialToken |
| 4 | +from mock import Mock |
5 | 5 |
|
| 6 | +from readthedocs.projects import constants |
6 | 7 | from readthedocs.projects.models import Project
|
7 | 8 |
|
8 |
| -from readthedocs.oauth.services import GitHubService, BitbucketService |
9 | 9 | from readthedocs.oauth.models import RemoteRepository, RemoteOrganization
|
| 10 | +from readthedocs.oauth.services import GitHubService, BitbucketService, GitLabService |
10 | 11 |
|
11 | 12 |
|
12 | 13 | class GitHubOAuthTests(TestCase):
|
@@ -279,3 +280,133 @@ def test_import_with_no_token(self):
|
279 | 280 | '''User without a Bitbucket SocialToken does not return a service'''
|
280 | 281 | services = BitbucketService.for_user(self.user)
|
281 | 282 | self.assertEqual(services, [])
|
| 283 | + |
| 284 | + |
| 285 | +class GitLabOAuthTests(TestCase): |
| 286 | + |
| 287 | + fixtures = ["eric", "test_data"] |
| 288 | + |
| 289 | + repo_response_data = { |
| 290 | + 'forks_count': 12, |
| 291 | + 'container_registry_enabled': None, |
| 292 | + 'web_url': 'https://gitlab.com/testorga/testrepo', |
| 293 | + 'wiki_enabled': True, |
| 294 | + 'public_builds': True, |
| 295 | + 'id': 2, |
| 296 | + 'merge_requests_enabled': True, |
| 297 | + 'archived': False, |
| 298 | + 'snippets_enabled': False, |
| 299 | + 'http_url_to_repo': 'https://gitlab.com/testorga/testrepo.git', |
| 300 | + 'namespace': { |
| 301 | + 'share_with_group_lock': False, |
| 302 | + 'name': 'Test Orga', |
| 303 | + 'created_at': '2014-07-11T13:38:53.510Z', |
| 304 | + 'description': '', |
| 305 | + 'updated_at': '2014-07-11T13:38:53.510Z', |
| 306 | + 'avatar': { |
| 307 | + 'url': None |
| 308 | + }, |
| 309 | + 'path': 'testorga', |
| 310 | + 'visibility_level': 20, |
| 311 | + 'id': 5, |
| 312 | + 'owner_id': None |
| 313 | + }, |
| 314 | + 'star_count': 0, |
| 315 | + 'avatar_url': 'http://placekitten.com/50/50', |
| 316 | + 'issues_enabled': True, |
| 317 | + 'path_with_namespace': 'testorga/testrepo', |
| 318 | + 'public': True, |
| 319 | + 'description': 'Test Repo', |
| 320 | + 'default_branch': 'master', |
| 321 | + 'ssh_url_to_repo': '[email protected]:testorga/testrepo.git', |
| 322 | + 'path': 'testrepo', |
| 323 | + 'visibility_level': 20, |
| 324 | + 'permissions': { |
| 325 | + 'group_access': { |
| 326 | + 'notification_level': 3, |
| 327 | + 'access_level': 40 |
| 328 | + }, |
| 329 | + 'project_access': None |
| 330 | + }, |
| 331 | + 'open_issues_count': 2, |
| 332 | + 'last_activity_at': '2016-03-01T09:22:34.344Z', |
| 333 | + 'name': 'testrepo', |
| 334 | + 'name_with_namespace': 'testorga / testrepo', |
| 335 | + 'created_at': '2015-11-02T13:52:42.821Z', |
| 336 | + 'builds_enabled': True, |
| 337 | + 'creator_id': 5, |
| 338 | + 'shared_runners_enabled': True, |
| 339 | + 'tag_list': [] |
| 340 | + } |
| 341 | + |
| 342 | + def setUp(self): |
| 343 | + self.client.login(username='eric', password='test') |
| 344 | + self.user = User.objects.get(pk=1) |
| 345 | + self.project = Project.objects.get(slug='pip') |
| 346 | + self.org = RemoteOrganization.objects.create(slug='testorga', json='') |
| 347 | + self.privacy = self.project.version_privacy_level |
| 348 | + self.service = GitLabService(user=self.user, account=None) |
| 349 | + |
| 350 | + def get_private_repo_data(self): |
| 351 | + """Manipulate repo response data to get private repo data.""" |
| 352 | + data = self.repo_response_data.copy() |
| 353 | + data.update({ |
| 354 | + 'visibility_level': 10, |
| 355 | + 'public': False, |
| 356 | + }) |
| 357 | + return data |
| 358 | + |
| 359 | + def test_make_project_pass(self): |
| 360 | + repo = self.service.create_repository( |
| 361 | + self.repo_response_data, organization=self.org, privacy=self.privacy) |
| 362 | + self.assertIsInstance(repo, RemoteRepository) |
| 363 | + self.assertEqual(repo.name, 'testrepo') |
| 364 | + self.assertEqual(repo.full_name, 'testorga / testrepo') |
| 365 | + self.assertEqual(repo.description, 'Test Repo') |
| 366 | + self.assertEqual(repo.avatar_url, 'http://placekitten.com/50/50') |
| 367 | + self.assertIn(self.user, repo.users.all()) |
| 368 | + self.assertEqual(repo.organization, self.org) |
| 369 | + self.assertEqual(repo.clone_url, 'https://gitlab.com/testorga/testrepo.git') |
| 370 | + self. assertEqual( repo. ssh_url, '[email protected]:testorga/testrepo.git') |
| 371 | + self.assertEqual(repo.html_url, 'https://gitlab.com/testorga/testrepo') |
| 372 | + |
| 373 | + def test_make_private_project_fail(self): |
| 374 | + repo = self.service.create_repository( |
| 375 | + self.get_private_repo_data(), organization=self.org, privacy=self.privacy) |
| 376 | + self.assertIsNone(repo) |
| 377 | + |
| 378 | + def test_make_private_project_success(self): |
| 379 | + repo = self.service.create_repository( |
| 380 | + self.get_private_repo_data(), organization=self.org, privacy=constants.PRIVATE) |
| 381 | + self.assertIsInstance(repo, RemoteRepository) |
| 382 | + self.assertTrue(repo.private, True) |
| 383 | + |
| 384 | + def test_make_organization(self): |
| 385 | + org = self.service.create_organization(self.repo_response_data['namespace']) |
| 386 | + self.assertIsInstance(org, RemoteOrganization) |
| 387 | + self.assertEqual(org.slug, 'testorga') |
| 388 | + self.assertEqual(org.name, 'Test Orga') |
| 389 | + self.assertEqual(org.avatar_url, '/media/images/fa-users.svg') |
| 390 | + self.assertEqual(org.url, 'https://gitlab.com/testorga') |
| 391 | + |
| 392 | + def test_sync_skip_archived_repo(self): |
| 393 | + data = self.repo_response_data |
| 394 | + data['archived'] = True |
| 395 | + create_repo_mock = Mock() |
| 396 | + create_orga_mock = Mock() |
| 397 | + setattr(self.service, 'paginate', Mock(return_value=[data])) |
| 398 | + setattr(self.service, 'create_repository', create_repo_mock) |
| 399 | + setattr(self.service, 'create_organization', create_orga_mock) |
| 400 | + self.service.sync() |
| 401 | + self.assertFalse(create_repo_mock.called) |
| 402 | + self.assertFalse(create_orga_mock.called) |
| 403 | + |
| 404 | + def test_sync_create_repo_and_orga(self): |
| 405 | + create_repo_mock = Mock() |
| 406 | + create_orga_mock = Mock(return_value=self.org) |
| 407 | + setattr(self.service, 'paginate', Mock(return_value=[self.repo_response_data])) |
| 408 | + setattr(self.service, 'create_repository', create_repo_mock) |
| 409 | + setattr(self.service, 'create_organization', create_orga_mock) |
| 410 | + self.service.sync() |
| 411 | + create_repo_mock.assert_called_once_with(self.repo_response_data, organization=self.org) |
| 412 | + create_orga_mock.assert_called_once_with(self.repo_response_data['namespace']) |
0 commit comments