Skip to content

Commit 96e2ad7

Browse files
committed
Split APIv3 tests on different files
1 parent e022b6d commit 96e2ad7

File tree

5 files changed

+438
-414
lines changed

5 files changed

+438
-414
lines changed

readthedocs/api/v3/tests/mixins.py

Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import datetime
2+
import json
3+
from pathlib import Path
4+
5+
import django_dynamic_fixture as fixture
6+
from django.contrib.auth.models import User
7+
from django.core.cache import cache
8+
from django.test import TestCase
9+
from django.utils.timezone import make_aware
10+
from rest_framework.authtoken.models import Token
11+
from rest_framework.test import APIClient
12+
13+
from readthedocs.builds.models import Build, Version
14+
from readthedocs.projects.models import Project
15+
from readthedocs.redirects.models import Redirect
16+
17+
18+
class APIEndpointMixin(TestCase):
19+
20+
fixtures = []
21+
22+
def setUp(self):
23+
created = make_aware(datetime.datetime(2019, 4, 29, 10, 0, 0))
24+
modified = make_aware(datetime.datetime(2019, 4, 29, 12, 0, 0))
25+
26+
self.me = fixture.get(
27+
User,
28+
date_joined=created,
29+
username='testuser',
30+
projects=[],
31+
)
32+
self.token = fixture.get(Token, key='me', user=self.me)
33+
# Defining all the defaults helps to avoid creating ghost / unwanted
34+
# objects (like a Project for translations/subprojects)
35+
self.project = fixture.get(
36+
Project,
37+
pub_date=created,
38+
modified_date=modified,
39+
description='Project description',
40+
repo='https://github.com/rtfd/project',
41+
project_url='http://project.com',
42+
name='project',
43+
slug='project',
44+
related_projects=[],
45+
main_language_project=None,
46+
users=[self.me],
47+
versions=[],
48+
)
49+
for tag in ('tag', 'project', 'test'):
50+
self.project.tags.add(tag)
51+
52+
self.redirect = fixture.get(
53+
Redirect,
54+
create_dt=created,
55+
update_dt=modified,
56+
from_url='/docs/',
57+
to_url='/documentation/',
58+
redirect_type='page',
59+
project=self.project,
60+
)
61+
62+
self.subproject = fixture.get(
63+
Project,
64+
pub_date=created,
65+
modified_date=modified,
66+
description='SubProject description',
67+
repo='https://github.com/rtfd/subproject',
68+
project_url='http://subproject.com',
69+
name='subproject',
70+
slug='subproject',
71+
related_projects=[],
72+
main_language_project=None,
73+
users=[],
74+
versions=[],
75+
)
76+
# self.translation = fixture.get(Project, slug='translation')
77+
78+
self.project.add_subproject(self.subproject)
79+
# self.project.add_translation(self.translation)
80+
81+
self.version = fixture.get(
82+
Version,
83+
slug='v1.0',
84+
verbose_name='v1.0',
85+
identifier='a1b2c3',
86+
project=self.project,
87+
active=True,
88+
built=True,
89+
type='tag',
90+
)
91+
92+
self.build = fixture.get(
93+
Build,
94+
date=created,
95+
type='html',
96+
state='finished',
97+
error='',
98+
success=True,
99+
_config = {'property': 'test value'},
100+
version=self.version,
101+
project=self.project,
102+
builder='builder01',
103+
commit='a1b2c3',
104+
length=60,
105+
)
106+
107+
self.other = fixture.get(User, projects=[])
108+
self.others_token = fixture.get(Token, key='other', user=self.other)
109+
self.others_project = fixture.get(
110+
Project,
111+
slug='others_project',
112+
related_projects=[],
113+
main_language_project=None,
114+
users=[self.other],
115+
versions=[],
116+
)
117+
118+
self.client = APIClient()
119+
120+
def tearDown(self):
121+
# Cleanup cache to avoid throttling on tests
122+
cache.clear()
123+
124+
def _get_response_dict(self, view_name):
125+
filename = Path(__file__).absolute().parent / 'responses' / f'{view_name}.json'
126+
return json.load(open(filename))
127+
128+
def assertDictEqual(self, d1, d2):
129+
"""
130+
Show the differences between the dicts in a human readable way.
131+
132+
It's just a helper for debugging API responses.
133+
"""
134+
import datadiff
135+
return super().assertDictEqual(d1, d2, datadiff.diff(d1, d2))
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
from .mixins import APIEndpointMixin
2+
from django.urls import reverse
3+
4+
5+
class BuildsEndpointTests(APIEndpointMixin):
6+
7+
def test_projects_builds_list(self):
8+
self.client.credentials(HTTP_AUTHORIZATION=f'Token {self.token.key}')
9+
response = self.client.get(
10+
reverse(
11+
'projects-builds-list',
12+
kwargs={
13+
'parent_lookup_project__slug': self.project.slug,
14+
}),
15+
)
16+
self.assertEqual(response.status_code, 200)
17+
18+
def test_projects_builds_detail(self):
19+
self.client.credentials(HTTP_AUTHORIZATION=f'Token {self.token.key}')
20+
response = self.client.get(
21+
reverse(
22+
'projects-builds-detail',
23+
kwargs={
24+
'parent_lookup_project__slug': self.project.slug,
25+
'build_pk': self.build.pk,
26+
}),
27+
)
28+
self.assertEqual(response.status_code, 200)
29+
30+
self.assertDictEqual(
31+
response.json(),
32+
self._get_response_dict('projects-builds-detail'),
33+
)
34+
35+
def test_projects_versions_builds_list_post(self):
36+
self.client.credentials(HTTP_AUTHORIZATION=f'Token {self.token.key}')
37+
self.assertEqual(self.project.builds.count(), 1)
38+
response = self.client.post(
39+
reverse(
40+
'projects-versions-builds-list',
41+
kwargs={
42+
'parent_lookup_project__slug': self.project.slug,
43+
'parent_lookup_version__slug': self.version.slug,
44+
}),
45+
)
46+
self.assertEqual(response.status_code, 202)
47+
self.assertEqual(self.project.builds.count(), 2)
48+
49+
response_json = response.json()
50+
response_json['build']['created'] = '2019-04-29T14:00:00Z'
51+
self.assertDictEqual(
52+
response_json,
53+
self._get_response_dict('projects-versions-builds-list_POST'),
54+
)

0 commit comments

Comments
 (0)