diff --git a/.gitattributes b/.gitattributes index 7e05dac0224b28a66d9e5fcea345eb88dd6dde1f..cbad3e19803df0a29ca8a7e578b34041e1b38ab9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4245,7 +4245,7 @@ SAS/LSMR/src/lsmr/lsmrapp/__init__.py -text SAS/LSMR/src/lsmr/lsmrapp/admin.py -text SAS/LSMR/src/lsmr/lsmrapp/apps.py -text SAS/LSMR/src/lsmr/lsmrapp/migrations/0001_initial.py -text -SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180905_1530.py -text +SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180910_0928.py -text SAS/LSMR/src/lsmr/lsmrapp/migrations/0003_populate.py -text SAS/LSMR/src/lsmr/lsmrapp/migrations/CMakeLists.txt -text SAS/LSMR/src/lsmr/lsmrapp/migrations/__init__.py -text diff --git a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180905_1530.py b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180910_0928.py similarity index 97% rename from SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180905_1530.py rename to SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180910_0928.py index 50cbdd8d9083a601e08dbd1021a65b8068388d8d..88cd23559a13e2a86f17341ec9c8f0a7d4367077 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180905_1530.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0002_auto_20180910_0928.py @@ -1,4 +1,4 @@ -# Generated by Django 2.0.6 on 2018-09-05 15:30 +# Generated by Django 2.0.6 on 2018-09-10 09:28 import django.contrib.postgres.fields import django.contrib.postgres.fields.jsonb @@ -35,7 +35,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='CopyReasonChoice', fields=[ - ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)), + ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)), ], options={ 'abstract': False, @@ -59,7 +59,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='DataformatChoice', fields=[ - ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)), + ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)), ], options={ 'abstract': False, @@ -115,7 +115,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='DatatypeChoice', fields=[ - ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)), + ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)), ], options={ 'abstract': False, @@ -238,7 +238,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='RoleChoice', fields=[ - ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)), + ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)), ], options={ 'abstract': False, @@ -314,7 +314,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='StationTypeChoice', fields=[ - ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)), + ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)), ], options={ 'abstract': False, @@ -360,7 +360,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='TaskStateChoice', fields=[ - ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)), + ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)), ], options={ 'abstract': False, @@ -387,7 +387,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='TaskTypeChoice', fields=[ - ('value', models.CharField(editable=False, max_length=30, primary_key=True, serialize=False, unique=True)), + ('value', models.CharField(max_length=30, primary_key=True, serialize=False, unique=True)), ], options={ 'abstract': False, @@ -586,7 +586,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='task', name='requested_state', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='task_requested_states', to='lsmrapp.TaskStateChoice'), + field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='task_requested_states', to='lsmrapp.TaskStateChoice'), ), migrations.AddField( model_name='task', diff --git a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0003_populate.py b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0003_populate.py index a04814750485b9a2c7a1ca87fe0d81e4dad227f3..9ae51284cc81835cdeb25d396332d8afcbec9da5 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/migrations/0003_populate.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/migrations/0003_populate.py @@ -6,7 +6,7 @@ from ..populate import * class Migration(migrations.Migration): dependencies = [ - ('lsmrapp', '0002_auto_20180905_1530'), + ('lsmrapp', '0002_auto_20180910_0928'), ] operations = [ migrations.RunPython(populate_choices) ] diff --git a/SAS/LSMR/src/lsmr/lsmrapp/models/scheduling.py b/SAS/LSMR/src/lsmr/lsmrapp/models/scheduling.py index 0723083f85029b3aedb5798f3ffa4eae96a90a9b..2639aa1bb2aa2ceff967a30d37b761bbed62b7ca 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/models/scheduling.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/models/scheduling.py @@ -97,7 +97,7 @@ class Task(BasicCommon): start_time = DateTimeField() stop_time = DateTimeField() state = ForeignKey('TaskStateChoice', null=False, on_delete=PROTECT, related_name='task_states') # set CANCELLED or ERROR instead? - requested_state = ForeignKey('TaskStateChoice', null=False, on_delete=CASCADE, related_name='task_requested_states') # set CANCELLED or ERROR instead? + requested_state = ForeignKey('TaskStateChoice', null=False, on_delete=PROTECT, related_name='task_requested_states') # set CANCELLED or ERROR instead? specification = JSONField() work_request_blueprint = ForeignKey('WorkRequestBlueprint', null=True, on_delete=SET_NULL) template = ForeignKey('TaskTemplate', null=False, on_delete=CASCADE) diff --git a/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py b/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py index 9d07fa22aa01df8a9d74ddaaddfba69c7b77a19f..bf634a919787aa944029f9fbd4f69abf9843f451 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/models/specification.py @@ -70,7 +70,7 @@ class AbstractChoice(Model): You can find the derived AbstractChoice classes being used as ForeignKey in other models, thus enforcing data consistency at database level. """ - value = CharField(max_length=30, editable=False, null=False, blank=False, unique=True, primary_key=True) + value = CharField(max_length=30, editable=True, null=False, blank=False, unique=True, primary_key=True) class Meta: abstract = True diff --git a/SAS/LSMR/src/lsmr/lsmrapp/serializers/scheduling.py b/SAS/LSMR/src/lsmr/lsmrapp/serializers/scheduling.py index 6469dc5888e5c3e16257af1e0d951d5cb2002624..f8c8581bb531c7ac089335779e8c54616eff51d4 100644 --- a/SAS/LSMR/src/lsmr/lsmrapp/serializers/scheduling.py +++ b/SAS/LSMR/src/lsmr/lsmrapp/serializers/scheduling.py @@ -12,19 +12,19 @@ class TaskIORoleSerializer(serializers.HyperlinkedModelSerializer): fields = '__all__' -class TaskStateChoiceSerializer(serializers.HyperlinkedModelSerializer): +class TaskStateChoiceSerializer(serializers.ModelSerializer): class Meta: model = models.TaskStateChoice fields = '__all__' -class TaskTypeChoiceSerializer(serializers.HyperlinkedModelSerializer): +class TaskTypeChoiceSerializer(serializers.ModelSerializer): class Meta: model = models.TaskTypeChoice fields = '__all__' -class StationTypeChoiceSerializer(serializers.HyperlinkedModelSerializer): +class StationTypeChoiceSerializer(serializers.ModelSerializer): class Meta: model = models.StationTypeChoice fields = '__all__' diff --git a/SAS/LSMR/src/lsmr/urls.py b/SAS/LSMR/src/lsmr/urls.py index 6a2bd93b01e26e6931ebc788c5073261bf1e62ae..5ce8b92ec29ea7afc85a5afedb9e48d2e9cbbae3 100644 --- a/SAS/LSMR/src/lsmr/urls.py +++ b/SAS/LSMR/src/lsmr/urls.py @@ -80,6 +80,8 @@ router.register(r'station_type_choice', viewsets.StationTypeChoiceViewSet) router.register(r'task_io_role', viewsets.TaskIORoleViewSet) router.register(r'task_template', viewsets.TaskTemplateViewSet) router.register(r'dataproduct_specification_template', viewsets.DataproductSpecificationTemplateViewSet) +router.register(r'default_task_template', viewsets.DefaultTaskTemplateViewSet) +router.register(r'default_dataproduct_specification_template', viewsets.DefaultDataproductSpecificationTemplateViewSet) # instances router.register(r'task', viewsets.TaskViewSet) diff --git a/SAS/LSMR/test/t_lsmrapp_scheduling_functional.py b/SAS/LSMR/test/t_lsmrapp_scheduling_functional.py index c1b9f857a5c255498ab7f95cda9902ba5666ea42..abb275dee58f38dd1d1dc3056d8663b32156ae69 100755 --- a/SAS/LSMR/test/t_lsmrapp_scheduling_functional.py +++ b/SAS/LSMR/test/t_lsmrapp_scheduling_functional.py @@ -184,6 +184,73 @@ class DataproductSpecificationTemplateTestCase(unittest.TestCase): DELETE_and_assert_gone(self, url) +class DefaultTemplates(unittest.TestCase): + + test_data_1 = {"name": "unique_name_post", + "template": None, + "tags": []} + + test_data_2 = {"name": "unique_name_protect", + "template": None, + "tags": []} + + def test_default_task_template_POST(self): + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/task_template/', + TaskTemplateTestCase.test_data_1, 201, + TaskTemplateTestCase.test_data_1) + url = r_dict['url'] + + test_data_1 = dict(self.test_data_1) + test_data_1['template'] = url + POST_and_assert_expected_response(self, BASE_URL + '/default_task_template/', test_data_1, 201, test_data_1) + + def test_default_dataproduct_specification_template_POST(self): + r_dict = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_specification_template/', + DataproductSpecificationTemplateTestCase.test_data_1, 201, + DataproductSpecificationTemplateTestCase.test_data_1) + url = r_dict['url'] + + test_data_1 = dict(self.test_data_1) + test_data_1['template'] = url + POST_and_assert_expected_response(self, BASE_URL + '/default_dataproduct_specification_template/', test_data_1, 201, test_data_1) + + def test_default_task_template_PROTECT_behavior_on_template_deleted(self): + + # POST with dependency + template_url = POST_and_assert_expected_response(self, BASE_URL + '/task_template/', + TaskTemplateTestCase.test_data_1, 201, + TaskTemplateTestCase.test_data_1)['url'] + test_data = dict(self.test_data_2) + test_data['template'] = template_url + POST_and_assert_expected_response(self, BASE_URL + '/default_task_template/', test_data, 201, test_data) + + # Try to DELETE dependency, verify that was not successful + # Unfortunately we don't get a nice error in json, but a Django debug page on error 500... + response = requests.delete(template_url) + self.assertEqual(500, response.status_code) + self.assertTrue("ProtectedError" in str(response.content)) + GET_and_assert_expected_response(self, template_url, 200, TaskTemplateTestCase.test_data_1) + + def test_default_dataproduct_specification_template_PROTECT_behavior_on_template_deleted(self): + + # POST with dependency + template_url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_specification_template/', + DataproductSpecificationTemplateTestCase.test_data_1, 201, + DataproductSpecificationTemplateTestCase.test_data_1)['url'] + test_data = dict(self.test_data_2) + test_data['template'] = template_url + POST_and_assert_expected_response(self, BASE_URL + '/default_dataproduct_specification_template/', test_data, 201, test_data) + + # Try to DELETE dependency, verify that was not successful + # Unfortunately we don't get a nice error in json, but a Django debug page on error 500... + response = requests.delete(template_url) + self.assertEqual(500, response.status_code) + self.assertTrue("ProtectedError" in str(response.content)) + GET_and_assert_expected_response(self, template_url, 200, DataproductSpecificationTemplateTestCase.test_data_1) + + + + class TaskTestCase(unittest.TestCase): def setUp(self): @@ -283,6 +350,91 @@ class TaskTestCase(unittest.TestCase): # DELETE and check it's gone DELETE_and_assert_gone(self, url) + def test_task_CASCADE_behavior_on_type_deleted(self): + + # create dependency that is safe to delete (enums are not populated / re-established between tests) + type_data = {'value': 'kickme'} + POST_and_assert_expected_response(self, BASE_URL + '/task_type_choice/', type_data, 201, type_data) + role_url = BASE_URL + '/task_type_choice/kickme/' + + # POST new item and verify + test_data = dict(self.test_data_1) + test_data['type'] = role_url + url = POST_and_assert_expected_response(self, BASE_URL + '/task/', test_data, 201, test_data)['url'] + GET_and_assert_expected_response(self, url, 200, test_data) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, role_url) + + # assert item gone + GET_and_assert_expected_response(self, url, 404, {}) + + def test_task_PROTECT_behavior_on_state_deleted(self): + + # create dependency that is safe to delete (enums are not populated / re-established between tests) + state_data = {'value': 'kickme'} + POST_and_assert_expected_response(self, BASE_URL + '/task_state_choice/', state_data, 201, state_data) + state_url = BASE_URL + '/task_state_choice/kickme/' + + # POST new item and verify + test_data = dict(self.test_data_1) + test_data['state'] = state_url + url = POST_and_assert_expected_response(self, BASE_URL + '/task/', test_data, 201, test_data)['url'] + GET_and_assert_expected_response(self, url, 200, test_data) + + # Try to DELETE dependency, verify that was not successful + # Unfortunately we don't get a nice error in json, but a Django debug page on error 500... + response = requests.delete(state_url) + self.assertEqual(500, response.status_code) + self.assertTrue("ProtectedError" in str(response.content)) + GET_and_assert_expected_response(self, state_url, 200, state_data) + + def test_task_PROTECT_behavior_on_requested_state_deleted(self): + + # create dependency that is safe to delete (enums are not populated / re-established between tests) + state_data = {'value': 'kickmemore'} + POST_and_assert_expected_response(self, BASE_URL + '/task_state_choice/', state_data, 201, state_data) + state_url = BASE_URL + '/task_state_choice/kickmemore/' + + # POST new item and verify + test_data = dict(self.test_data_1) + test_data['requested_state'] = state_url + url = POST_and_assert_expected_response(self, BASE_URL + '/task/', test_data, 201, test_data)['url'] + GET_and_assert_expected_response(self, url, 200, test_data) + + # Try to DELETE dependency, verify that was not successful + # Unfortunately we don't get a nice error in json, but a Django debug page on error 500... + response = requests.delete(state_url) + self.assertEqual(500, response.status_code) + self.assertTrue("ProtectedError" in str(response.content)) + GET_and_assert_expected_response(self, state_url, 200, state_data) + + def test_task_SET_NULL_behavior_on_work_request_blueprint_deleted(self): + + # POST new item and verify + url = POST_and_assert_expected_response(self, BASE_URL + '/task/', self.test_data_2, 201, self.test_data_2)['url'] + GET_and_assert_expected_response(self, url, 200, self.test_data_2) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, self.work_request_blueprint_url) + + # assert item reference is set null + expected_data = dict(self.test_data_2) + expected_data['work_request_blueprint'] = None + GET_and_assert_expected_response(self, url, 200, expected_data) + + def test_task_CASCADE_behavior_on_template_deleted(self): + + # POST new item and verify + url = POST_and_assert_expected_response(self, BASE_URL + '/task/', self.test_data_2, 201, self.test_data_2)['url'] + GET_and_assert_expected_response(self, url, 200, self.test_data_2) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, self.task_template_url) + + # assert item gone + GET_and_assert_expected_response(self, url, 404, {}) + class DataproductTestCase(unittest.TestCase): @@ -373,6 +525,36 @@ class DataproductTestCase(unittest.TestCase): # DELETE and check it's gone DELETE_and_assert_gone(self, url) + def test_dataproduct_CASCADE_behavior_on_dataformat_deleted(self): + + # create dependency that is safe to delete (enums are not populated / re-established between tests) + dataformat_data = {'value': 'kickme'} + POST_and_assert_expected_response(self, BASE_URL + '/dataformat_choice/', dataformat_data, 201, dataformat_data) + dataformat_url = BASE_URL + '/dataformat_choice/kickme/' + + # POST new item and verify + test_data = dict(self.test_data_1) + test_data['dataformat'] = dataformat_url + url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct/', test_data, 201, test_data)['url'] + GET_and_assert_expected_response(self, url, 200, test_data) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, dataformat_url) + + # assert item gone + GET_and_assert_expected_response(self, url, 404, {}) + + def test_dataproduct_CASCADE_behavior_on_specification_template_deleted(self): + + # POST new item, verify + url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct/', self.test_data_1, 201, self.test_data_1)['url'] + GET_and_assert_expected_response(self, url, 200, self.test_data_1) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, self.specification_template_url) + + # assert item gone + GET_and_assert_expected_response(self, url, 404, {}) class TaskIORoleTestCase(unittest.TestCase): @@ -450,6 +632,46 @@ class TaskIORoleTestCase(unittest.TestCase): # DELETE and check it's gone DELETE_and_assert_gone(self, url) + def test_task_io_role_CASCADE_behavior_on_role_deleted(self): + + # create dependency that is safe to delete (enums are not populated / re-established between tests) + role_data = {'value': 'kickme'} + POST_and_assert_expected_response(self, BASE_URL + '/role_choice/', role_data, 201, role_data) + role_url = BASE_URL + '/role_choice/kickme/' + + + # POST new item and verify + test_data = dict(self.test_data_1) + test_data['role'] = role_url + url = POST_and_assert_expected_response(self, BASE_URL + '/task_io_role/', test_data, 201, test_data)['url'] + GET_and_assert_expected_response(self, url, 200, test_data) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, role_url) + + # assert item gone + GET_and_assert_expected_response(self, url, 404, {}) + + + def test_task_io_role_CASCADE_behavior_on_datatype_deleted(self): + + # create new dependency that is safe to delete (enums are not populated / re-established between tests) + datatype_data = {'value': 'kickme'} + POST_and_assert_expected_response(self, BASE_URL + '/datatype_choice/', datatype_data, 201, datatype_data) + datatype_url = BASE_URL + '/datatype_choice/kickme/' + + # POST new item and verify + test_data = dict(self.test_data_1) + test_data['datatype'] = datatype_url + url = POST_and_assert_expected_response(self, BASE_URL + '/task_io_role/', test_data, 201, test_data)['url'] + GET_and_assert_expected_response(self, url, 200, test_data) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, datatype_url) + + # assert item gone + GET_and_assert_expected_response(self, url, 404, {}) + class DataproductRelationTestCase(unittest.TestCase): @@ -566,6 +788,74 @@ class DataproductRelationTestCase(unittest.TestCase): # DELETE and check it's gone DELETE_and_assert_gone(self, url) + def test_dataproduct_relation_CASCADE_behavior_on_task_deleted(self): + + # POST new item, verify + url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_relation/', self.test_data_1, 201, self.test_data_1)['url'] + GET_and_assert_expected_response(self, url, 200, self.test_data_1) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, self.task_url_1) + + # assert item gone + GET_and_assert_expected_response(self, url, 404, {}) + + def test_dataproduct_relation_SET_NULL_behavior_on_input_deleted(self): + + # POST new item, verify + url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_relation/', self.test_data_2, 201, self.test_data_2)['url'] + GET_and_assert_expected_response(self, url, 200, self.test_data_2) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, self.test_data_2['input']) + + # assert item reference is set null + expected_data = dict(self.test_data_2) + expected_data['input'] = None + GET_and_assert_expected_response(self, url, 200, expected_data) + + def test_dataproduct_relation_SET_NULL_behavior_on_output_deleted(self): + + # POST new item, verify + url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_relation/', self.test_data_2, 201, self.test_data_2)['url'] + GET_and_assert_expected_response(self, url, 200, self.test_data_2) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, self.test_data_2['output']) + + # assert item reference is set null + expected_data = dict(self.test_data_2) + expected_data['output'] = None + GET_and_assert_expected_response(self, url, 200, expected_data) + + def test_dataproduct_relation_SET_NULL_behavior_on_input_role_deleted(self): + + # POST new item, verify + url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_relation/', self.test_data_2, 201, self.test_data_2)['url'] + GET_and_assert_expected_response(self, url, 200, self.test_data_2) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, self.test_data_2['input_role']) + + # assert item reference is set null + expected_data = dict(self.test_data_2) + expected_data['input_role'] = None + GET_and_assert_expected_response(self, url, 200, expected_data) + + def test_dataproduct_relation_SET_NULL_behavior_on_output_role_deleted(self): + + # POST new item, verify + url = POST_and_assert_expected_response(self, BASE_URL + '/dataproduct_relation/', self.test_data_2, 201, self.test_data_2)['url'] + GET_and_assert_expected_response(self, url, 200, self.test_data_2) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, self.test_data_2['output_role']) + + # assert item reference is set null + expected_data = dict(self.test_data_2) + expected_data['output_role'] = None + GET_and_assert_expected_response(self, url, 200, expected_data) + class AntennaSetTestCase(unittest.TestCase): @@ -642,6 +932,26 @@ class AntennaSetTestCase(unittest.TestCase): # DELETE and check it's gone DELETE_and_assert_gone(self, url) + def test_antenna_set_CASCADE_behavior_on_station_type_choice_deleted(self): + + # create dependency that is safe to delete (enums are not populated / re-established between tests) + dataformat_data = {'value': 'kickme'} + POST_and_assert_expected_response(self, BASE_URL + '/station_type_choice/', dataformat_data, 201, dataformat_data) + dataformat_url = BASE_URL + '/station_type_choice/kickme/' + + # POST new item and verify + test_data = dict(self.test_data_1) + test_data['station_type'] = dataformat_url + url = POST_and_assert_expected_response(self, BASE_URL + '/antenna_set/', test_data, 201, test_data)['url'] + GET_and_assert_expected_response(self, url, 200, test_data) + + # DELETE dependency and check it's gone + DELETE_and_assert_gone(self, dataformat_url) + + # assert item gone + GET_and_assert_expected_response(self, url, 404, {}) + + if __name__ == "__main__": unittest.main() diff --git a/SAS/LSMR/test/t_lsmrapp_specification_functional.py b/SAS/LSMR/test/t_lsmrapp_specification_functional.py index 0af460e73fd636d493602a680c89d20986704847..fd1c32934768440b92d142fcaf22bc3082b2f5b8 100755 --- a/SAS/LSMR/test/t_lsmrapp_specification_functional.py +++ b/SAS/LSMR/test/t_lsmrapp_specification_functional.py @@ -55,7 +55,7 @@ def _call_API_and_assert_expected_response(self, url, call, data, expected_code, raise ValueError("The provided call '%s' is not a valid API method choice" % call) if response.status_code != expected_code: - print("!!! Unexpected: [%s] - %s %s: %s" % (self.id(), call, url, response.content)) + print("!!! Unexpected: [%s] - %s %s: %s" % (self.id(), call, url, response.content.decode('utf-8').strip())) self.assertEqual(response.status_code, expected_code) r_dict = json.loads(response.content.decode('utf-8')) for item in expected_content.items():