diff --git a/awx/main/tests/functional/api/test_unified_jobs_stdout.py b/awx/main/tests/functional/api/test_unified_jobs_stdout.py index 962ec9b4b5..0ec3eb1e78 100644 --- a/awx/main/tests/functional/api/test_unified_jobs_stdout.py +++ b/awx/main/tests/functional/api/test_unified_jobs_stdout.py @@ -3,6 +3,7 @@ import base64 import json import re +from datetime import datetime from django.conf import settings from django.utils.encoding import smart_str @@ -26,14 +27,20 @@ from awx.main.models import ( ) -def _mk_project_update(): - project = Project() +def _mk_project_update(created=None): + kwargs = {} + if created: + kwargs['created'] = created + project = Project(**kwargs) project.save() return ProjectUpdate(project=project) -def _mk_inventory_update(): - source = InventorySource(source='ec2') +def _mk_inventory_update(created=None): + kwargs = {} + if created: + kwargs['created'] = created + source = InventorySource(source='ec2', **kwargs) source.save() iu = InventoryUpdate(inventory_source=source, source='e2') return iu @@ -139,10 +146,11 @@ def test_stdout_line_range(sqlite_copy_expert, Parent, Child, relation, view, ge @pytest.mark.django_db def test_text_stdout_from_system_job_events(sqlite_copy_expert, get, admin): - job = SystemJob() + created = datetime.utcnow() + job = SystemJob(created=created) job.save() for i in range(3): - SystemJobEvent(system_job=job, stdout='Testing {}\n'.format(i), start_line=i).save() + SystemJobEvent(system_job=job, stdout='Testing {}\n'.format(i), start_line=i, job_created=created).save() url = reverse('api:system_job_detail', kwargs={'pk': job.pk}) response = get(url, user=admin, expect=200) assert smart_str(response.data['result_stdout']).splitlines() == ['Testing %d' % i for i in range(3)] @@ -150,11 +158,12 @@ def test_text_stdout_from_system_job_events(sqlite_copy_expert, get, admin): @pytest.mark.django_db def test_text_stdout_with_max_stdout(sqlite_copy_expert, get, admin): - job = SystemJob() + created = datetime.utcnow() + job = SystemJob(created=created) job.save() total_bytes = settings.STDOUT_MAX_BYTES_DISPLAY + 1 large_stdout = 'X' * total_bytes - SystemJobEvent(system_job=job, stdout=large_stdout, start_line=0).save() + SystemJobEvent(system_job=job, stdout=large_stdout, start_line=0, job_created=created).save() url = reverse('api:system_job_detail', kwargs={'pk': job.pk}) response = get(url, user=admin, expect=200) assert response.data['result_stdout'] == ( @@ -176,11 +185,12 @@ def test_text_stdout_with_max_stdout(sqlite_copy_expert, get, admin): @pytest.mark.parametrize('fmt', ['txt', 'ansi']) @mock.patch('awx.main.redact.UriCleaner.SENSITIVE_URI_PATTERN', mock.Mock(**{'search.return_value': None})) # really slow for large strings def test_max_bytes_display(sqlite_copy_expert, Parent, Child, relation, view, fmt, get, admin): - job = Parent() + created = datetime.utcnow() + job = Parent(created=created) job.save() total_bytes = settings.STDOUT_MAX_BYTES_DISPLAY + 1 large_stdout = 'X' * total_bytes - Child(**{relation: job, 'stdout': large_stdout, 'start_line': 0}).save() + Child(**{relation: job, 'stdout': large_stdout, 'start_line': 0, 'job_created': created}).save() url = reverse(view, kwargs={'pk': job.pk}) response = get(url + '?format={}'.format(fmt), user=admin, expect=200) @@ -257,10 +267,11 @@ def test_text_with_unicode_stdout(sqlite_copy_expert, Parent, Child, relation, v @pytest.mark.django_db def test_unicode_with_base64_ansi(sqlite_copy_expert, get, admin): - job = Job() + created = datetime.utcnow() + job = Job(created=created) job.save() for i in range(3): - JobEvent(job=job, stdout='オ{}\n'.format(i), start_line=i).save() + JobEvent(job=job, stdout='オ{}\n'.format(i), start_line=i, job_created=created).save() url = reverse('api:job_stdout', kwargs={'pk': job.pk}) + '?format=json&content_encoding=base64' response = get(url, user=admin, expect=200) diff --git a/awx/main/tests/unit/api/serializers/test_unified_serializers.py b/awx/main/tests/unit/api/serializers/test_unified_serializers.py index f5353e3324..884b55b33b 100644 --- a/awx/main/tests/unit/api/serializers/test_unified_serializers.py +++ b/awx/main/tests/unit/api/serializers/test_unified_serializers.py @@ -55,6 +55,8 @@ def test_list_views_use_list_serializers(all_views): """ list_serializers = tuple(getattr(serializers, '{}ListSerializer'.format(cls.__name__)) for cls in (UnifiedJob.__subclasses__() + [UnifiedJob])) for View in all_views: + if type(View.model) is property: + continue # special case for JobEventChildrenList if hasattr(View, 'model') and issubclass(getattr(View, 'model'), UnifiedJob): if issubclass(View, ListAPIView): assert issubclass(View.serializer_class, list_serializers), 'View {} serializer {} is not a list serializer'.format(View, View.serializer_class) diff --git a/awx/main/tests/unit/test_views.py b/awx/main/tests/unit/test_views.py index 82f81ff968..e9e2c67baf 100644 --- a/awx/main/tests/unit/test_views.py +++ b/awx/main/tests/unit/test_views.py @@ -73,6 +73,8 @@ def test_global_creation_always_possible(all_views): views_by_model = {} for View in all_views: if not getattr(View, 'deprecated', False) and issubclass(View, ListAPIView) and hasattr(View, 'model'): + if type(View.model) is property: + continue # special case for JobEventChildrenList views_by_model.setdefault(View.model, []).append(View) for model, views in views_by_model.items(): creatable = False