Skip to content

Commit 5839908

Browse files
nirizrshiftre
authored andcommitted
Fix asserteq to test more, fix tests (#244)
* Fix asserteq to test more, fix tests Signed-off-by: Nir Izraeli <nirizr@gmail.com> * Fix all tests, remove duplicated 'file' field for vectors Signed-off-by: Nir Izraeli <nirizr@gmail.com> * Use python-dateutil to parse dates for asserting Signed-off-by: Nir Izraeli <nirizr@gmail.com> * Support paginated response asserts, add paginated task resources Signed-off-by: Nir Izraeli <nirizr@gmail.com>
1 parent 44f2a5c commit 5839908

File tree

5 files changed

+63
-26
lines changed

5 files changed

+63
-26
lines changed

server/collab/models.py

-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ class Vector(models.Model):
8585
(TYPE_MNEMONIC_HIST, "Mnemonic Hist")]
8686

8787
instance = models.ForeignKey(Instance, related_name='vectors')
88-
file = models.ForeignKey(File, related_name='vectors')
8988
file_version = models.ForeignKey(FileVersion, related_name='vectors')
9089
type = models.CharField(max_length=16, choices=TYPE_CHOICES)
9190
type_version = models.IntegerField()

server/collab/serializers.py

-4
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,6 @@ class Meta:
127127
fields = ('id', 'file', 'file_version', 'instance', 'type', 'type_version',
128128
'data')
129129

130-
def create(self, validated_data):
131-
file = validated_data['file_version'].file
132-
return self.Meta.model.objects.create(file=file, **validated_data)
133-
134130

135131
class MatchSerializer(serializers.ModelSerializer):
136132
class Meta:

server/collab/tasks.py

+5-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def match(task_id):
2929
task.update(status=Task.STATUS_STARTED, progress=0,
3030
progress_max=len(requested_matchers), task_id=match.request.id)
3131

32-
source_filter = {'file_id': source_file,
32+
source_filter = {'file_version__file': source_file,
3333
'file_version_id': source_file_version}
3434
if source_start:
3535
source_filter['instance__offset__gte'] = source_start
@@ -39,11 +39,12 @@ def match(task_id):
3939

4040
target_filter = {}
4141
if target_project:
42-
target_filter = {'file__project_id': target_project}
42+
target_filter = {'file_version__file__project_id': target_project}
4343
elif target_file:
44-
target_filter = {'file_id': target_file}
44+
target_filter = {'file_version__file': target_file}
4545
base_target_vectors = Vector.objects.filter(**target_filter)
46-
base_target_vectors = base_target_vectors.exclude(file_id=source_file)
46+
self_exclude = {'file_version__file': source_file}
47+
base_target_vectors = base_target_vectors.exclude(**self_exclude)
4748

4849
print("Running task {}".format(match.request.id))
4950
# TODO: order might be important here

tests/requirements.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
pytest
22
pytest-django
3+
python-dateutil

tests/server/collab/test_all.py

+57-17
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,16 @@
88

99
import random
1010
import json
11+
import inspect
12+
from dateutil.parser import parse as parse_date
13+
14+
15+
try:
16+
strtypes = (str, unicode)
17+
inttypes = (int, long)
18+
except NameError:
19+
strtypes = str
20+
inttypes = int
1121

1222

1323
@pytest.fixture
@@ -57,8 +67,7 @@ def rand_hash(n):
5767
'source_file_version': 'file_versions'},
5868
'instances': {'file_version': 'file_versions'},
5969
'vectors': {'instance': 'instances',
60-
'file_version': 'file_versions',
61-
'file': 'files'}}
70+
'file_version': 'file_versions'}}
6271

6372

6473
def resolve_reqs(model_name, user):
@@ -103,31 +112,60 @@ def setup_model(model_name, user):
103112
return model_dict
104113

105114

115+
def simplify_object(obj):
116+
try:
117+
obj = parse_date(obj)
118+
except (AttributeError, ValueError, TypeError):
119+
pass
120+
try:
121+
obj = obj.replace(microsecond=0, tzinfo=None).isoformat()
122+
except (AttributeError, TypeError):
123+
pass
124+
return obj
125+
126+
106127
def assert_eq(a, b):
128+
a, b = simplify_object(a), simplify_object(b)
129+
print(a, b)
107130
if isinstance(a, list) and isinstance(b, list):
108131
assert len(a) == len(b)
109132
for a_item, b_item in zip(a, b):
110133
assert_eq(a_item, b_item)
111-
if isinstance(a, models.Model) and isinstance(b, dict):
134+
elif isinstance(a, dict) and isinstance(b, dict):
112135
for k in b:
113-
d_value = b.__getitem__(k)
114-
o_value = a.__getattribute__(k)
115-
d_type = type(d_value)
116-
o_type = type(o_value)
117-
if d_type == o_type:
118-
assert d_value == o_value
119-
else:
120-
print("Skipped matching {k}: {d_value}({d_type}) ?? "
121-
"{o_value}({o_type})".format(k=k, d_value=d_value,
122-
d_type=d_type, o_value=o_value,
123-
o_type=o_type))
136+
assert_eq(a[k], b[k])
137+
elif isinstance(b, dict) and (isinstance(a, models.Model) or
138+
inspect.isclass(a)):
139+
assert_eq(b, a)
140+
elif isinstance(a, dict) and (isinstance(b, models.Model) or
141+
inspect.isclass(b)):
142+
for k in a:
143+
# TODO: serializer-added values cannot be validated, so we'll have to
144+
# ignore any attribute that does not exist in Model object
145+
if not hasattr(b, k):
146+
print("Ignoring missing model parameter: {} in {}".format(k, b))
147+
continue
148+
a_value = a.__getitem__(k)
149+
b_value = getattr(b, k)
150+
assert_eq(a_value, b_value)
151+
elif isinstance(a, inttypes) and isinstance(b, models.Model):
152+
assert_eq(a, b.id)
153+
elif isinstance(a, strtypes) and isinstance(b, models.Model):
154+
assert_eq(a, b.username)
155+
elif b.__class__.__name__ == 'RelatedManager':
156+
assert_eq(a, list(b.all()))
157+
else:
158+
assert a == b
124159

125160

126161
def assert_response(response, status, data=None):
127162
print(response.content)
128163
assert response.status_code == status
129164
if isinstance(data, (list, dict)):
130-
assert_eq(response.json(), data)
165+
if 'results' in response.data:
166+
assert_eq(response.data['results'], data)
167+
else:
168+
assert_eq(response.data, data)
131169
elif data:
132170
assert_eq(response.content, data)
133171

@@ -202,13 +240,15 @@ def test_file_fileversion(admin_client, admin_user):
202240
assert_response(response, status.HTTP_200_OK, obj)
203241

204242

243+
@pytest.mark.parametrize('limit', [None, 10])
205244
@pytest.mark.parametrize('resource', ['locals', 'remotes', 'matches'])
206-
def test_task_resource_empty(resource, admin_client, admin_user):
245+
def test_task_resource_empty(resource, limit, admin_client, admin_user):
207246
task = create_model('tasks', admin_user)
208247
task.save()
209248

249+
data = {'limit': limit} if limit else {}
210250
response = admin_client.get('/collab/tasks/{}/{}/'.format(task.id, resource),
211-
content_type="application/json")
251+
data=data, content_type="application/json")
212252
assert_response(response, status.HTTP_200_OK, [])
213253

214254

0 commit comments

Comments
 (0)