From f780bb1770846aa7e37a290843da0854dd88d114 Mon Sep 17 00:00:00 2001 From: Benoit Orihuela Date: Wed, 1 Jul 2026 18:22:52 +0200 Subject: [PATCH] feat: add TCs for missing behaviour in NGSI-LD Nulls --- .pre-commit-config.yaml | 2 +- .../Entities/CreateEntity/001_02.robot | 3 + .../Entities/MergeEntity/056_06.robot | 44 +++++++++++++ .../Entities/MergeEntity/056_07.robot | 55 ++++++++++++++++ .../Entities/MergeEntity/056_08.robot | 55 ++++++++++++++++ .../Entities/MergeEntity/056_09.robot | 55 ++++++++++++++++ .../Entities/MergeEntity/056_10.robot | 52 +++++++++++++++ .../Entities/ReplaceEntity/054_04.robot | 50 +++++++++++++++ .../AppendEntityAttributes/010_12.robot | 43 +++++++++++++ .../PartialAttributeUpdate/012_02.robot | 9 ++- .../PartialAttributeUpdate/012_10.robot | 63 +++++++++++++++++++ .../building-property-object-value.jsonld | 15 +++++ .../building-deleted-json-property-key.jsonld | 13 ++++ .../building-deleted-observedat.jsonld | 26 ++++++++ ...ding-deleted-property-object-merged.jsonld | 12 ++++ .../building-deleted-property-object.jsonld | 12 ++++ .../building-deleted-sub-attribute.jsonld | 23 +++++++ .../building-deleted-unitcode.jsonld | 26 ++++++++ .../building-languagemap-merged.jsonld | 12 ++++ .../building-null-datasetid-fragment.jsonld | 10 +++ .../building-null-json-property-key.jsonld | 11 ++++ .../building-null-languagemap-merge.jsonld | 13 ++++ .../building-null-languagemap-none.jsonld | 11 ++++ .../building-null-property-object-key.jsonld | 11 ++++ ...building-null-property-object-merge.jsonld | 13 ++++ ...ing-null-sub-property-sub-attribute.jsonld | 13 ++++ ...building-null-sub-property-unitcode.jsonld | 10 +++ .../building-null-value-property.jsonld | 9 +++ .../null-datasetid-fragment.jsonld | 8 +++ ...ll-sub-property-observedat-fragment.jsonld | 8 +++ ...sub-property-sub-attribute-fragment.jsonld | 11 ++++ ...null-sub-property-unitcode-fragment.jsonld | 8 +++ resources/AssertionUtils.resource | 2 +- 33 files changed, 705 insertions(+), 3 deletions(-) create mode 100644 TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_06.robot create mode 100644 TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_07.robot create mode 100644 TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_08.robot create mode 100644 TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_09.robot create mode 100644 TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_10.robot create mode 100644 TP/NGSI-LD/ContextInformation/Provision/Entities/ReplaceEntity/054_04.robot create mode 100644 TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/AppendEntityAttributes/010_12.robot create mode 100644 TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/PartialAttributeUpdate/012_10.robot create mode 100644 data/entities/building-property-object-value.jsonld create mode 100644 data/entities/expectations/ngsild-null/building-deleted-json-property-key.jsonld create mode 100644 data/entities/expectations/ngsild-null/building-deleted-observedat.jsonld create mode 100644 data/entities/expectations/ngsild-null/building-deleted-property-object-merged.jsonld create mode 100644 data/entities/expectations/ngsild-null/building-deleted-property-object.jsonld create mode 100644 data/entities/expectations/ngsild-null/building-deleted-sub-attribute.jsonld create mode 100644 data/entities/expectations/ngsild-null/building-deleted-unitcode.jsonld create mode 100644 data/entities/expectations/ngsild-null/building-languagemap-merged.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/building-null-datasetid-fragment.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/building-null-json-property-key.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/building-null-languagemap-merge.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/building-null-languagemap-none.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/building-null-property-object-key.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/building-null-property-object-merge.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/building-null-sub-property-sub-attribute.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/building-null-sub-property-unitcode.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/building-null-value-property.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/null-datasetid-fragment.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/null-sub-property-observedat-fragment.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/null-sub-property-sub-attribute-fragment.jsonld create mode 100644 data/entities/fragmentEntities/ngsild-null/null-sub-property-unitcode-fragment.jsonld diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 76544111..62c65f91 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -3,4 +3,4 @@ repos: rev: v6.9.2 hooks: - id: robocop-format - additional_dependencies: [typing_extensions] + additional_dependencies: [typing_extensions, click] diff --git a/TP/NGSI-LD/ContextInformation/Provision/Entities/CreateEntity/001_02.robot b/TP/NGSI-LD/ContextInformation/Provision/Entities/CreateEntity/001_02.robot index 47a71624..f273a138 100644 --- a/TP/NGSI-LD/ContextInformation/Provision/Entities/CreateEntity/001_02.robot +++ b/TP/NGSI-LD/ContextInformation/Provision/Entities/CreateEntity/001_02.robot @@ -20,6 +20,9 @@ Test Template Create Entity With Invalid Request Scenarios 001_02_04 EntityWithInvalidType [Tags] e-create 5_6_1 invalid-type.jsonld ${ERROR_TYPE_BAD_REQUEST_DATA} +001_02_05 EntityWithNullValueProperty + [Tags] e-create 5_6_1 since_v1.6.1 + fragmentEntities/ngsild-null/building-null-value-property.jsonld ${ERROR_TYPE_BAD_REQUEST_DATA} *** Keywords *** diff --git a/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_06.robot b/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_06.robot new file mode 100644 index 00000000..a8e1bcb4 --- /dev/null +++ b/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_06.robot @@ -0,0 +1,44 @@ +*** Settings *** +Documentation Check that a Merge Entity operation setting an NGSI-LD Null datasetId returns 400 BadRequestData + +Resource ${EXECDIR}/resources/ApiUtils/Common.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource +Resource ${EXECDIR}/resources/AssertionUtils.resource + +Test Setup Setup Initial Entity +Test Teardown Delete Initial Entity +Test Template Merge Entity With Null Reserved Field Scenarios + + +*** Variables *** +${entity_payload_filename}= building-simple-attributes.jsonld + + +*** Test Cases *** FILENAME +056_06_01 MergeEntitySettingDatasetIdToNull + [Tags] e-merge 5_6_17 since_v1.6.1 + fragmentEntities/ngsild-null/building-null-datasetid-fragment.jsonld + + +*** Keywords *** +Merge Entity With Null Reserved Field Scenarios + [Documentation] Check that a Merge Entity operation setting an NGSI-LD Null datasetId returns 400 BadRequestData + [Arguments] ${filename} + ${response}= Merge Entity + ... entity_id=${entity_id} + ... entity_filename=${filename} + ... content_type=${CONTENT_TYPE_LD_JSON} + Check Response Status Code 400 ${response.status_code} + Check Response Body Containing ProblemDetails Element Containing Type Element set to + ... ${response.json()} + ... ${ERROR_TYPE_BAD_REQUEST_DATA} + Check Response Body Containing ProblemDetails Element Containing Title Element ${response.json()} + +Setup Initial Entity + ${entity_id}= Generate Random Building Entity Id + ${response}= Create Entity ${entity_payload_filename} ${entity_id} + Set Test Variable ${entity_id} + Check Response Status Code 201 ${response.status_code} + +Delete Initial Entity + Delete Entity ${entity_id} diff --git a/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_07.robot b/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_07.robot new file mode 100644 index 00000000..60e3f06f --- /dev/null +++ b/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_07.robot @@ -0,0 +1,55 @@ +*** Settings *** +Documentation Check that sub-attributes set to NGSI-LD Null in a Merge Entity operation are removed + +Resource ${EXECDIR}/resources/ApiUtils/Common.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationConsumption.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource +Resource ${EXECDIR}/resources/AssertionUtils.resource +Resource ${EXECDIR}/resources/JsonUtils.resource + +Test Setup Setup Initial Entity +Test Teardown Delete Initial Entity +Test Template Merge Entity Scenarios + + +*** Variables *** +${entity_payload_filename}= building-relationship-of-property.jsonld + + +*** Test Cases *** FILENAME EXPECTATION_FILENAME +056_07_01 RemoveUnitCodeFromProperty + [Tags] e-merge 5_6_17 6_5_3_4 since_v1.6.1 + fragmentEntities/ngsild-null/building-null-sub-property-unitcode.jsonld ngsild-null/building-deleted-unitcode.jsonld +056_07_02 RemoveSubAttributeFromProperty + [Tags] e-merge 5_6_17 6_5_3_4 since_v1.6.1 + fragmentEntities/ngsild-null/building-null-sub-property-sub-attribute.jsonld ngsild-null/building-deleted-sub-attribute.jsonld + + +*** Keywords *** +Merge Entity Scenarios + [Documentation] Check that sub-attributes set to NGSI-LD Null in a Merge Entity operation are removed + [Arguments] ${filename} ${expectation_filename} + ${response}= Merge Entity + ... entity_id=${entity_id} + ... entity_filename=${filename} + ... content_type=${CONTENT_TYPE_LD_JSON} + Check Response Status Code 204 ${response.status_code} + Check Response Body Is Empty ${response} + + ${response1}= Retrieve Entity + ... id=${entity_id} + ... context=${ngsild_test_suite_context} + ... accept=${CONTENT_TYPE_LD_JSON} + Check Response Body Containing Entity element + ... expectation_filename=${expectation_filename} + ... entity_id=${entity_id} + ... response_body=${response1.json()} + +Setup Initial Entity + ${entity_id}= Generate Random Building Entity Id + ${response}= Create Entity ${entity_payload_filename} ${entity_id} + Set Test Variable ${entity_id} + Check Response Status Code 201 ${response.status_code} + +Delete Initial Entity + Delete Entity ${entity_id} diff --git a/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_08.robot b/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_08.robot new file mode 100644 index 00000000..9199e149 --- /dev/null +++ b/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_08.robot @@ -0,0 +1,55 @@ +*** Settings *** +Documentation Check that LanguageProperty entries can be merged and removed via NGSI-LD Null + +Resource ${EXECDIR}/resources/ApiUtils/Common.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationConsumption.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource +Resource ${EXECDIR}/resources/AssertionUtils.resource +Resource ${EXECDIR}/resources/JsonUtils.resource + +Test Setup Setup Initial Entity +Test Teardown Delete Initial Entity +Test Template Merge Entity Scenarios + + +*** Variables *** +${entity_payload_filename}= building-language-property.jsonld + + +*** Test Cases *** FILENAME EXPECTATION_FILENAME +056_08_01 RemoveLanguageMapProperty + [Tags] e-merge 5_6_17 6_5_3_4 4_5_18 since_v1.6.1 + fragmentEntities/ngsild-null/building-null-languagemap-none.jsonld building-no-attributes.jsonld +056_08_02 MergeLanguageMapPropertyEntries + [Tags] e-merge 5_6_17 6_5_3_4 4_5_18 since_v1.6.1 + fragmentEntities/ngsild-null/building-null-languagemap-merge.jsonld ngsild-null/building-languagemap-merged.jsonld + + +*** Keywords *** +Merge Entity Scenarios + [Documentation] Check that LanguageProperty entries can be merged and removed via NGSI-LD Null + [Arguments] ${filename} ${expectation_filename} + ${response}= Merge Entity + ... entity_id=${entity_id} + ... entity_filename=${filename} + ... content_type=${CONTENT_TYPE_LD_JSON} + Check Response Status Code 204 ${response.status_code} + Check Response Body Is Empty ${response} + + ${response1}= Retrieve Entity + ... id=${entity_id} + ... context=${ngsild_test_suite_context} + ... accept=${CONTENT_TYPE_LD_JSON} + Check Response Body Containing Entity element + ... expectation_filename=${expectation_filename} + ... entity_id=${entity_id} + ... response_body=${response1.json()} + +Setup Initial Entity + ${entity_id}= Generate Random Building Entity Id + ${response}= Create Entity ${entity_payload_filename} ${entity_id} + Set Test Variable ${entity_id} + Check Response Status Code 201 ${response.status_code} + +Delete Initial Entity + Delete Entity ${entity_id} diff --git a/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_09.robot b/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_09.robot new file mode 100644 index 00000000..303c3548 --- /dev/null +++ b/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_09.robot @@ -0,0 +1,55 @@ +*** Settings *** +Documentation Check that keys inside a Property object value can be merged and removed via NGSI-LD Null + +Resource ${EXECDIR}/resources/ApiUtils/Common.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationConsumption.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource +Resource ${EXECDIR}/resources/AssertionUtils.resource +Resource ${EXECDIR}/resources/JsonUtils.resource + +Test Setup Setup Initial Entity +Test Teardown Delete Initial Entity +Test Template Merge Entity Scenarios + + +*** Variables *** +${entity_payload_filename}= building-property-object-value.jsonld + + +*** Test Cases *** FILENAME EXPECTATION_FILENAME +056_09_01 RemoveKeyFromPropertyObjectValue + [Tags] e-merge 5_6_17 6_5_3_4 since_v1.6.1 + fragmentEntities/ngsild-null/building-null-property-object-key.jsonld ngsild-null/building-deleted-property-object.jsonld +056_09_02 MergeKeysInPropertyObjectValue + [Tags] e-merge 5_6_17 6_5_3_4 since_v1.6.1 + fragmentEntities/ngsild-null/building-null-property-object-merge.jsonld ngsild-null/building-deleted-property-object-merged.jsonld + + +*** Keywords *** +Merge Entity Scenarios + [Documentation] Check that keys inside a Property object value can be merged and removed via NGSI-LD Null + [Arguments] ${filename} ${expectation_filename} + ${response}= Merge Entity + ... entity_id=${entity_id} + ... entity_filename=${filename} + ... content_type=${CONTENT_TYPE_LD_JSON} + Check Response Status Code 204 ${response.status_code} + Check Response Body Is Empty ${response} + + ${response1}= Retrieve Entity + ... id=${entity_id} + ... context=${ngsild_test_suite_context} + ... accept=${CONTENT_TYPE_LD_JSON} + Check Response Body Containing Entity element + ... expectation_filename=${expectation_filename} + ... entity_id=${entity_id} + ... response_body=${response1.json()} + +Setup Initial Entity + ${entity_id}= Generate Random Building Entity Id + ${response}= Create Entity ${entity_payload_filename} ${entity_id} + Set Test Variable ${entity_id} + Check Response Status Code 201 ${response.status_code} + +Delete Initial Entity + Delete Entity ${entity_id} diff --git a/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_10.robot b/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_10.robot new file mode 100644 index 00000000..22ac89e8 --- /dev/null +++ b/TP/NGSI-LD/ContextInformation/Provision/Entities/MergeEntity/056_10.robot @@ -0,0 +1,52 @@ +*** Settings *** +Documentation Check that keys inside a JsonProperty json object are removed when set to NGSI-LD Null + +Resource ${EXECDIR}/resources/ApiUtils/Common.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationConsumption.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource +Resource ${EXECDIR}/resources/AssertionUtils.resource +Resource ${EXECDIR}/resources/JsonUtils.resource + +Test Setup Setup Initial Entity +Test Teardown Delete Initial Entity +Test Template Merge Entity Scenarios + + +*** Variables *** +${entity_payload_filename}= building-json-property-object.jsonld + + +*** Test Cases *** FILENAME EXPECTATION_FILENAME +056_10_01 RemoveKeyFromJsonPropertyObject + [Tags] e-merge 5_6_17 6_5_3_4 4_5_24 since_v1.6.1 + fragmentEntities/ngsild-null/building-null-json-property-key.jsonld ngsild-null/building-deleted-json-property-key.jsonld + + +*** Keywords *** +Merge Entity Scenarios + [Documentation] Check that keys inside a JsonProperty json object are removed when set to NGSI-LD Null + [Arguments] ${filename} ${expectation_filename} + ${response}= Merge Entity + ... entity_id=${entity_id} + ... entity_filename=${filename} + ... content_type=${CONTENT_TYPE_LD_JSON} + Check Response Status Code 204 ${response.status_code} + Check Response Body Is Empty ${response} + + ${response1}= Retrieve Entity + ... id=${entity_id} + ... context=${ngsild_test_suite_context} + ... accept=${CONTENT_TYPE_LD_JSON} + Check Response Body Containing Entity element + ... expectation_filename=${expectation_filename} + ... entity_id=${entity_id} + ... response_body=${response1.json()} + +Setup Initial Entity + ${entity_id}= Generate Random Building Entity Id + ${response}= Create Entity ${entity_payload_filename} ${entity_id} + Set Test Variable ${entity_id} + Check Response Status Code 201 ${response.status_code} + +Delete Initial Entity + Delete Entity ${entity_id} diff --git a/TP/NGSI-LD/ContextInformation/Provision/Entities/ReplaceEntity/054_04.robot b/TP/NGSI-LD/ContextInformation/Provision/Entities/ReplaceEntity/054_04.robot new file mode 100644 index 00000000..c142598c --- /dev/null +++ b/TP/NGSI-LD/ContextInformation/Provision/Entities/ReplaceEntity/054_04.robot @@ -0,0 +1,50 @@ +*** Settings *** +Documentation Check that replacing an entity with a payload containing an attribute whose value is NGSI-LD Null returns 400 BadRequestData + +Resource ${EXECDIR}/resources/ApiUtils/Common.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource +Resource ${EXECDIR}/resources/AssertionUtils.resource + +Test Setup Setup Initial Entity +Test Teardown Delete Initial Entity +Test Template Replace Entity With Null Value Scenarios + + +*** Variables *** +${entity_filename}= building-simple-attributes.jsonld + + +*** Test Cases *** REPLACEMENT_FILENAME +054_04_01 ReplaceEntityWithNullValueAttribute + [Tags] e-replace 5_6_18 since_v1.6.1 + fragmentEntities/ngsild-null/building-null-value-property.jsonld + + +*** Keywords *** +Replace Entity With Null Value Scenarios + [Documentation] Check that replacing an entity with a payload containing an attribute whose value is NGSI-LD Null returns 400 BadRequestData + [Arguments] ${replacement_filename} + ${entity}= Load Entity + ... entity_file_name=${replacement_filename} + ... entity_id=${entity_id} + ${response}= Replace Entity Selecting Content Type + ... entity_id=${entity_id} + ... entity_fragment=${entity} + ... content_type=${CONTENT_TYPE_LD_JSON} + Check Response Status Code 400 ${response.status_code} + Check Response Body Containing ProblemDetails Element Containing Type Element set to + ... ${response.json()} + ... ${ERROR_TYPE_BAD_REQUEST_DATA} + Check Response Body Containing ProblemDetails Element Containing Title Element ${response.json()} + +Setup Initial Entity + ${entity_id}= Generate Random Building Entity Id + Set Test Variable ${entity_id} + ${response}= Create Entity Selecting Content Type + ... ${entity_filename} + ... ${entity_id} + ... ${CONTENT_TYPE_LD_JSON} + Check Response Status Code 201 ${response.status_code} + +Delete Initial Entity + Delete Entity ${entity_id} diff --git a/TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/AppendEntityAttributes/010_12.robot b/TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/AppendEntityAttributes/010_12.robot new file mode 100644 index 00000000..27e621c5 --- /dev/null +++ b/TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/AppendEntityAttributes/010_12.robot @@ -0,0 +1,43 @@ +*** Settings *** +Documentation Check that appending an attribute whose value is NGSI-LD Null returns 400 BadRequestData + +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource +Resource ${EXECDIR}/resources/AssertionUtils.resource + +Test Setup Create Initial Entity +Test Teardown Delete Initial Entity +Test Template Append Attributes With Null Value + + +*** Variables *** +${filename}= building-minimal.jsonld + + +*** Test Cases *** FRAGMENT_FILENAME +010_12_01 AppendAttributeWithNullValue + [Tags] ea-append 5_6_3 since_v1.6.1 + ngsild-null/null-property.jsonld + + +*** Keywords *** +Append Attributes With Null Value + [Documentation] Check that appending an attribute whose value is NGSI-LD Null returns 400 BadRequestData + [Arguments] ${fragment_filename} + ${response}= Append Entity Attributes ${entity_id} ${fragment_filename} ${CONTENT_TYPE_LD_JSON} + Check Response Status Code 400 ${response.status_code} + Check Response Body Containing ProblemDetails Element Containing Type Element set to + ... ${response.json()} + ... ${ERROR_TYPE_BAD_REQUEST_DATA} + Check Response Body Containing ProblemDetails Element Containing Title Element ${response.json()} + +Create Initial Entity + ${entity_id}= Generate Random Vehicle Entity Id + ${response}= Create Entity Selecting Content Type + ... ${filename} + ... ${entity_id} + ... ${CONTENT_TYPE_LD_JSON} + Check Response Status Code 201 ${response.status_code} + Set Suite Variable ${entity_id} + +Delete Initial Entity + Delete Entity ${entity_id} diff --git a/TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/PartialAttributeUpdate/012_02.robot b/TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/PartialAttributeUpdate/012_02.robot index d937356f..586ba400 100644 --- a/TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/PartialAttributeUpdate/012_02.robot +++ b/TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/PartialAttributeUpdate/012_02.robot @@ -19,22 +19,29 @@ ${status_code}= 400 *** Test Cases *** ENTITY_ID ATTRIBUTE_ID FRAGMENT_FILENAME 012_02_01 Make A Partial Attribute Update If The Entity Id Is Not Present [Documentation] Check that one cannot perform a partial update on an entity attribute with missing entity id + [Tags] ea-partial-update 5_6_4 ${EMPTY} speed vehicle-speed-equal-datasetid-fragment.jsonld 012_02_02 Make A Partial Attribute Update If The Entity Id Is Not A Valid URI [Documentation] Check that one cannot perform a partial update on an entity attribute with invalid entity id + [Tags] ea-partial-update 5_6_4 thisisaninvaliduri speed vehicle-speed-equal-datasetid-fragment.jsonld 012_02_03 Make A Partial Attribute Update If The Attribute Type Does Not Match [Documentation] Check that one cannot perform a partial update on an entity attribute with a different attribute type + [Tags] ea-partial-update 5_6_4 ${valid_entity_id} speed vehicle-speed-equal-datasetid-different-type-fragment.jsonld 012_02_04 Make A Partial Attribute Update If The Entity Fragment Is Empty [Documentation] Check that one cannot perform a partial update on an entity attribute with an empty fragment + [Tags] ea-partial-update 5_6_4 ${valid_entity_id} speed empty-fragment.json +012_02_05 PartialUpdateSettingDatasetIdToNull + [Documentation] Check that one cannot perform a partial update on an entity attribute with a null datasetId + [Tags] ea-partial-update 5_6_4 since_v1.6.1 + ${valid_entity_id} speed ngsild-null/null-datasetid-fragment.jsonld *** Keywords *** Update Attributes [Documentation] Check that one cannot perform a partial update on an entity attribute in some conditions - [Tags] ea-partial-update 5_6_4 [Arguments] ${entity_id} ${attribute_id} ${fragment_filename} ${response}= Partial Update Entity Attributes ... entityId=${entity_id} diff --git a/TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/PartialAttributeUpdate/012_10.robot b/TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/PartialAttributeUpdate/012_10.robot new file mode 100644 index 00000000..e162b118 --- /dev/null +++ b/TP/NGSI-LD/ContextInformation/Provision/EntityAttributes/PartialAttributeUpdate/012_10.robot @@ -0,0 +1,63 @@ +*** Settings *** +Documentation Check that sub-attributes set to NGSI-LD Null in a Partial Attribute Update are removed + +Resource ${EXECDIR}/resources/ApiUtils/Common.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationConsumption.resource +Resource ${EXECDIR}/resources/ApiUtils/ContextInformationProvision.resource +Resource ${EXECDIR}/resources/AssertionUtils.resource +Resource ${EXECDIR}/resources/JsonUtils.resource + +Test Setup Initiate Test Case +Test Teardown Delete Initial Entities +Test Template Update Attributes + + +*** Variables *** +${filename}= building-relationship-of-property.jsonld + + +*** Test Cases *** FRAGMENT_FILENAME ATTRIBUTE_ID EXPECTATION_FILENAME +012_10_01 RemoveObservedAtFromAirQualityLevel + [Tags] ea-partial-update 5_6_4 6_7_3_1 since_v1.6.1 + ngsild-null/null-sub-property-observedat-fragment.jsonld airQualityLevel ngsild-null/building-deleted-observedat.jsonld +012_10_02 RemoveUnitCodeFromAirQualityLevel + [Tags] ea-partial-update 5_6_4 6_7_3_1 since_v1.6.1 + ngsild-null/null-sub-property-unitcode-fragment.jsonld airQualityLevel ngsild-null/building-deleted-unitcode.jsonld +012_10_03 RemoveSubAttributeFromAirQualityLevel + [Tags] ea-partial-update 5_6_4 6_7_3_1 since_v1.6.1 + ngsild-null/null-sub-property-sub-attribute-fragment.jsonld airQualityLevel ngsild-null/building-deleted-sub-attribute.jsonld + + +*** Keywords *** +Update Attributes + [Documentation] Check that sub-attributes set to NGSI-LD Null in a Partial Attribute Update are removed + [Arguments] ${fragment_filename} ${attribute_id} ${expectation_filename} + ${response}= Partial Update Entity Attributes + ... entityId=${entity_id} + ... attributeId=${attribute_id} + ... fragment_filename=${fragment_filename} + ... content_type=${CONTENT_TYPE_LD_JSON} + Check Response Status Code 204 ${response.status_code} + Check Response Body Is Empty ${response} + ${entity_expectation_payload}= Load Test Sample entities/expectations/${expectation_filename} ${entity_id} + ${response1}= Retrieve Entity + ... id=${entity_id} + ... context=${ngsild_test_suite_context} + ... accept=${CONTENT_TYPE_LD_JSON} + ${ignored_attributes}= Create List @context + Check Updated Resource Set To + ... updated_resource=${entity_expectation_payload} + ... response_body=${response1.json()} + ... ignored_keys=${ignored_attributes} + +Initiate Test Case + ${entity_id}= Generate Random Building Entity Id + Set Test Variable ${entity_id} + ${response}= Create Entity Selecting Content Type + ... ${filename} + ... ${entity_id} + ... ${CONTENT_TYPE_LD_JSON} + Check Response Status Code 201 ${response.status_code} + +Delete Initial Entities + Delete Entity ${entity_id} diff --git a/data/entities/building-property-object-value.jsonld b/data/entities/building-property-object-value.jsonld new file mode 100644 index 00000000..66c527b5 --- /dev/null +++ b/data/entities/building-property-object-value.jsonld @@ -0,0 +1,15 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "buildingDetails": { + "type": "Property", + "value": { + "category": "commercial", + "floors": 5, + "deprecated": true + } + }, + "@context": [ + "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" + ] +} diff --git a/data/entities/expectations/ngsild-null/building-deleted-json-property-key.jsonld b/data/entities/expectations/ngsild-null/building-deleted-json-property-key.jsonld new file mode 100644 index 00000000..59055a97 --- /dev/null +++ b/data/entities/expectations/ngsild-null/building-deleted-json-property-key.jsonld @@ -0,0 +1,13 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "jsonProperty": { + "type": "JsonProperty", + "json": { + "id": "some-id", + "type": "some-type", + "null": null + } + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/expectations/ngsild-null/building-deleted-observedat.jsonld b/data/entities/expectations/ngsild-null/building-deleted-observedat.jsonld new file mode 100644 index 00000000..1da0e0d0 --- /dev/null +++ b/data/entities/expectations/ngsild-null/building-deleted-observedat.jsonld @@ -0,0 +1,26 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "name": { + "type": "Property", + "value": "Eiffel Tower" + }, + "subCategory": { + "type": "Property", + "value": "tourism" + }, + "airQualityLevel": { + "type": "Property", + "value": 4, + "unitCode": "C62", + "hasWeatherObserved": { + "type": "Relationship", + "object": "urn:ngsi-ld:Sensor:43a1af27-4aa7-44fe-bee9-fe76d56978a4" + } + }, + "almostFull": { + "type": "Property", + "value": false + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/expectations/ngsild-null/building-deleted-property-object-merged.jsonld b/data/entities/expectations/ngsild-null/building-deleted-property-object-merged.jsonld new file mode 100644 index 00000000..b4bef269 --- /dev/null +++ b/data/entities/expectations/ngsild-null/building-deleted-property-object-merged.jsonld @@ -0,0 +1,12 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "buildingDetails": { + "type": "Property", + "value": { + "category": "leisure", + "deprecated": false + } + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/expectations/ngsild-null/building-deleted-property-object.jsonld b/data/entities/expectations/ngsild-null/building-deleted-property-object.jsonld new file mode 100644 index 00000000..596da22c --- /dev/null +++ b/data/entities/expectations/ngsild-null/building-deleted-property-object.jsonld @@ -0,0 +1,12 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "buildingDetails": { + "type": "Property", + "value": { + "category": "commercial", + "floors": 5 + } + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/expectations/ngsild-null/building-deleted-sub-attribute.jsonld b/data/entities/expectations/ngsild-null/building-deleted-sub-attribute.jsonld new file mode 100644 index 00000000..d2d38222 --- /dev/null +++ b/data/entities/expectations/ngsild-null/building-deleted-sub-attribute.jsonld @@ -0,0 +1,23 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "name": { + "type": "Property", + "value": "Eiffel Tower" + }, + "subCategory": { + "type": "Property", + "value": "tourism" + }, + "airQualityLevel": { + "type": "Property", + "value": 4, + "observedAt": "2020-09-09T16:40:00.000Z", + "unitCode": "C62" + }, + "almostFull": { + "type": "Property", + "value": false + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/expectations/ngsild-null/building-deleted-unitcode.jsonld b/data/entities/expectations/ngsild-null/building-deleted-unitcode.jsonld new file mode 100644 index 00000000..b4177fbd --- /dev/null +++ b/data/entities/expectations/ngsild-null/building-deleted-unitcode.jsonld @@ -0,0 +1,26 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "name": { + "type": "Property", + "value": "Eiffel Tower" + }, + "subCategory": { + "type": "Property", + "value": "tourism" + }, + "airQualityLevel": { + "type": "Property", + "value": 4, + "observedAt": "2020-09-09T16:40:00.000Z", + "hasWeatherObserved": { + "type": "Relationship", + "object": "urn:ngsi-ld:Sensor:43a1af27-4aa7-44fe-bee9-fe76d56978a4" + } + }, + "almostFull": { + "type": "Property", + "value": false + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/expectations/ngsild-null/building-languagemap-merged.jsonld b/data/entities/expectations/ngsild-null/building-languagemap-merged.jsonld new file mode 100644 index 00000000..536ded0c --- /dev/null +++ b/data/entities/expectations/ngsild-null/building-languagemap-merged.jsonld @@ -0,0 +1,12 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "street": { + "type": "LanguageProperty", + "languageMap": { + "de": "Grosser Platz", + "fr": "Grande Place" + } + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/fragmentEntities/ngsild-null/building-null-datasetid-fragment.jsonld b/data/entities/fragmentEntities/ngsild-null/building-null-datasetid-fragment.jsonld new file mode 100644 index 00000000..39002d24 --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/building-null-datasetid-fragment.jsonld @@ -0,0 +1,10 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "name": { + "type": "Property", + "value": "Eiffel Tower", + "datasetId": "urn:ngsi-ld:null" + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/fragmentEntities/ngsild-null/building-null-json-property-key.jsonld b/data/entities/fragmentEntities/ngsild-null/building-null-json-property-key.jsonld new file mode 100644 index 00000000..2ee375b9 --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/building-null-json-property-key.jsonld @@ -0,0 +1,11 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "jsonProperty": { + "type": "JsonProperty", + "json": { + "anythingElse": "urn:ngsi-ld:null" + } + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/fragmentEntities/ngsild-null/building-null-languagemap-merge.jsonld b/data/entities/fragmentEntities/ngsild-null/building-null-languagemap-merge.jsonld new file mode 100644 index 00000000..84bdcb02 --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/building-null-languagemap-merge.jsonld @@ -0,0 +1,13 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "street": { + "type": "LanguageProperty", + "languageMap": { + "de": "Grosser Platz", + "fr": "Grande Place", + "nl": "urn:ngsi-ld:null" + } + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/fragmentEntities/ngsild-null/building-null-languagemap-none.jsonld b/data/entities/fragmentEntities/ngsild-null/building-null-languagemap-none.jsonld new file mode 100644 index 00000000..d2d930dc --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/building-null-languagemap-none.jsonld @@ -0,0 +1,11 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "street": { + "type": "LanguageProperty", + "languageMap": { + "@none": "urn:ngsi-ld:null" + } + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/fragmentEntities/ngsild-null/building-null-property-object-key.jsonld b/data/entities/fragmentEntities/ngsild-null/building-null-property-object-key.jsonld new file mode 100644 index 00000000..cf2db5f2 --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/building-null-property-object-key.jsonld @@ -0,0 +1,11 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "buildingDetails": { + "type": "Property", + "value": { + "deprecated": "urn:ngsi-ld:null" + } + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/fragmentEntities/ngsild-null/building-null-property-object-merge.jsonld b/data/entities/fragmentEntities/ngsild-null/building-null-property-object-merge.jsonld new file mode 100644 index 00000000..cbc85a2b --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/building-null-property-object-merge.jsonld @@ -0,0 +1,13 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "buildingDetails": { + "type": "Property", + "value": { + "category": "leisure", + "floors": "urn:ngsi-ld:null", + "deprecated": false + } + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/fragmentEntities/ngsild-null/building-null-sub-property-sub-attribute.jsonld b/data/entities/fragmentEntities/ngsild-null/building-null-sub-property-sub-attribute.jsonld new file mode 100644 index 00000000..fd9d74fe --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/building-null-sub-property-sub-attribute.jsonld @@ -0,0 +1,13 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "airQualityLevel": { + "type": "Property", + "value": 4, + "hasWeatherObserved": { + "type": "Relationship", + "object": "urn:ngsi-ld:null" + } + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/fragmentEntities/ngsild-null/building-null-sub-property-unitcode.jsonld b/data/entities/fragmentEntities/ngsild-null/building-null-sub-property-unitcode.jsonld new file mode 100644 index 00000000..404a8e55 --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/building-null-sub-property-unitcode.jsonld @@ -0,0 +1,10 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "airQualityLevel": { + "type": "Property", + "value": 4, + "unitCode": "urn:ngsi-ld:null" + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/fragmentEntities/ngsild-null/building-null-value-property.jsonld b/data/entities/fragmentEntities/ngsild-null/building-null-value-property.jsonld new file mode 100644 index 00000000..cd1ab8b9 --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/building-null-value-property.jsonld @@ -0,0 +1,9 @@ +{ + "id": "urn:ngsi-ld:Building:randomUUID", + "type": "Building", + "name": { + "type": "Property", + "value": "urn:ngsi-ld:null" + }, + "@context": "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" +} diff --git a/data/entities/fragmentEntities/ngsild-null/null-datasetid-fragment.jsonld b/data/entities/fragmentEntities/ngsild-null/null-datasetid-fragment.jsonld new file mode 100644 index 00000000..86dfd26d --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/null-datasetid-fragment.jsonld @@ -0,0 +1,8 @@ +{ + "type": "Property", + "value": 56, + "datasetId": "urn:ngsi-ld:null", + "@context": [ + "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" + ] +} diff --git a/data/entities/fragmentEntities/ngsild-null/null-sub-property-observedat-fragment.jsonld b/data/entities/fragmentEntities/ngsild-null/null-sub-property-observedat-fragment.jsonld new file mode 100644 index 00000000..14db0d97 --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/null-sub-property-observedat-fragment.jsonld @@ -0,0 +1,8 @@ +{ + "type": "Property", + "value": 4, + "observedAt": "urn:ngsi-ld:null", + "@context": [ + "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" + ] +} diff --git a/data/entities/fragmentEntities/ngsild-null/null-sub-property-sub-attribute-fragment.jsonld b/data/entities/fragmentEntities/ngsild-null/null-sub-property-sub-attribute-fragment.jsonld new file mode 100644 index 00000000..45ab179d --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/null-sub-property-sub-attribute-fragment.jsonld @@ -0,0 +1,11 @@ +{ + "type": "Property", + "value": 4, + "hasWeatherObserved": { + "type": "Relationship", + "object": "urn:ngsi-ld:null" + }, + "@context": [ + "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" + ] +} diff --git a/data/entities/fragmentEntities/ngsild-null/null-sub-property-unitcode-fragment.jsonld b/data/entities/fragmentEntities/ngsild-null/null-sub-property-unitcode-fragment.jsonld new file mode 100644 index 00000000..c5241bb5 --- /dev/null +++ b/data/entities/fragmentEntities/ngsild-null/null-sub-property-unitcode-fragment.jsonld @@ -0,0 +1,8 @@ +{ + "type": "Property", + "value": 4, + "unitCode": "urn:ngsi-ld:null", + "@context": [ + "https://easy-global-market.github.io/ngsild-api-data-models/ngsildTestSuite/ngsildTestSuiteV1.8-compound.jsonld" + ] +} diff --git a/resources/AssertionUtils.resource b/resources/AssertionUtils.resource index c21eaa5c..629f8ee3 100755 --- a/resources/AssertionUtils.resource +++ b/resources/AssertionUtils.resource @@ -165,7 +165,7 @@ Check Response Body Containing Update Result Check Response Body Containing Entity element [Arguments] ${expectation_filename} ${entity_id} ${response_body} ${ignore_core_context_version}=False ${entity_payload}= Load JSON From File ${EXECDIR}/data/entities/expectations/${expectation_filename} - ${entity}= Update Value To JSON ${entity_payload} $..id ${entity_id} + ${entity}= Update Value To JSON ${entity_payload} $.id ${entity_id} ${comparison_result}= Compare Dictionaries Ignoring Keys ... ${entity} ... ${response_body} -- GitLab