diff --git a/README.md b/README.md index 3458ff56ae8410a17056e42805b2ab2cddc5410a..a8c5dc5d75d1f884a55981f7821ac23b1dd1979e 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,19 @@ Launch the tests with the following command: For more running instructions please consult [scripts/run_tests.sh](./scripts/run_tests.sh). +## Redirect console output to have + +To have the whole messages it is necessary to modify the width of the test execution output with the option --consolewidth (-W). The default width is 78 characters. + +```$ robot --consolewidth 150 .``` + +The messages in the console are clear and without noise, only the strictly necessary (request and response to the CB and a nice message which shows the difference between two documents when they are). +However, it can be difficult to follow all the messages in the console when there is a lot of testing and a lot of CB calls. +This is why a command to redirect the console output to a file can be used. +You must add a chevron at the end of the test launch command followed by the file name. + +```$ robot . > 'results.log``` + ## Generate a documentation for the support keywords ```$ python3 -m robot.libdoc resources/ApiUtils.resource api_docs/ApiUtils.html``` diff --git a/libraries/assertionUtils.py b/libraries/assertionUtils.py index 36fbf0d112a7b6d3460be61d47c988ac61dca750..e0ac15dc3f127850996ec87057073d8ca1c00425 100644 --- a/libraries/assertionUtils.py +++ b/libraries/assertionUtils.py @@ -1,4 +1,14 @@ +from dataclasses import dataclass from deepdiff import DeepDiff +from prettydiff import get_annotated_lines_from_diff, diff_json, Flag +from robot.api import logger + + +@dataclass +class Theme: + added: str + removed: str + reset: str def compare_dictionaries_ignoring_keys(expected, actual, exclude_regex_paths, group_by=None): @@ -14,4 +24,25 @@ def compare_dictionaries_ignoring_keys(expected, actual, exclude_regex_paths, gr group_by=group_by) else: res = DeepDiff(expected, actual, exclude_regex_paths=exclude_regex_paths, ignore_order=True, verbose_level=1) + + if len(res) > 0: + output_pretty_diff(expected, actual, Theme(added="", removed="", reset="")) return res + + +def output_pretty_diff(a, b, theme, indent_size: int = 2, console=False): + logger.info("Dictionary comparison failed with -> ", also_console=True) + lines = get_annotated_lines_from_diff(diff_json(a, b)) + + msg = "" + for line in lines: + if Flag.ADDED in line.flags: + flags = f"{theme.added}+ " + elif Flag.REMOVED in line.flags: + flags = f"{theme.removed}- " + else: + flags = f"{theme.reset} " + + msg = msg + flags + " " * (indent_size * line.indent) + line.s + "\n" + + logger.info(msg, also_console=True) diff --git a/libraries/logUtils.py b/libraries/logUtils.py index dec7fef53c73ca2fdffd225949c4ef6d7e06d82b..9254bc599d6f592248d523684521aa184b0095c9 100644 --- a/libraries/logUtils.py +++ b/libraries/logUtils.py @@ -1,15 +1,15 @@ from __future__ import unicode_literals from __future__ import division -from pygments import highlight, lexers, formatters from json import dumps, JSONDecodeError, loads from robot.api import logger from robot.api.deco import keyword @keyword(name="Output", tags=("I/O",)) -def output(response, console=True): +def output(response, description, console=True): """*Request and response are output to terminal and file (in JSON).* :param response: response to a request + :param description: explains what request is being made :param console: If false, the JSON is not written to terminal. Default is true. """ @@ -34,16 +34,8 @@ def output(response, console=True): pretty_request_json = dumps(request_json, indent=4, sort_keys=False, separators=(",", ": ")) pretty_response_json = dumps(response_json, indent=4, sort_keys=False, separators=(",", ": ")) - logger.info(pretty_request_json) - logger.info(pretty_response_json) - - if console: - pretty_request_json_colored = highlight( - pretty_request_json, lexers.JsonLexer(), formatters.TerminalFormatter() - ) - pretty_response_json_colored = highlight( - pretty_response_json, lexers.JsonLexer(), formatters.TerminalFormatter() - ) - - logger.console(pretty_request_json_colored) - logger.console(pretty_response_json_colored) + logger.info("\n" + description, also_console=True) + logger.info("Request ->", also_console=True) + logger.info(pretty_request_json, also_console=True) + logger.info("Response ->", also_console=True) + logger.info(pretty_response_json, also_console=True) diff --git a/requirements.txt b/requirements.txt index f6f16821fd873447e183fb7c796a1747364e13dc..03455a4fc79385c4aab805fa7fc76eb4a7f680b5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,5 +3,6 @@ robotframework==6.0.2 robotframework-jsonlibrary==0.5 robotframework-requests==0.9.4 deepdiff==6.3.0 +prettydiff==0.1.0 robotframework-httpctrl==0.3.1 robotframework-tidy==4.2.1 diff --git a/resources/ApiUtils.resource b/resources/ApiUtils.resource index da6ba285b090fae9d13d9a5c300df487f80b1d87..377a9c853cf639388364431691bf956deb9f4313 100755 --- a/resources/ApiUtils.resource +++ b/resources/ApiUtils.resource @@ -44,13 +44,13 @@ ${response} ${EMPTY} Delete Entity by Id Returning Response [Arguments] ${id} ${response}= DELETE url=${url}/${ENTITIES_ENDPOINT_PATH}${id} expected_status=any - Output ${response} + Output ${response} Delete Entity by Id Returning Response RETURN ${response} Delete Entity by Id [Arguments] ${id} ${response}= DELETE url=${url}/${ENTITIES_ENDPOINT_PATH}${id} expected_status=any - Output ${response} + Output ${response} Delete Entity by Id RETURN ${response} Query Entity @@ -87,7 +87,7 @@ Query Entity ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Query Entity RETURN ${response} Query Entities @@ -149,7 +149,7 @@ Query Entities ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Query Entities RETURN ${response} Query Entities Via POST @@ -184,7 +184,7 @@ Query Entities Via POST ... json=${params} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Query Entities Via POST RETURN ${response} Retrieve Entity by Id @@ -197,7 +197,7 @@ Retrieve Entity by Id ... Link=<${context}>; rel="http://www.w3.org/ns/json-ld#context";type="application/ld+json" END ${response}= GET url=${url}/${ENTITIES_ENDPOINT_PATH}${id} headers=${headers} expected_status=any - Output ${response} + Output ${response} Retrieve Entity by Id RETURN ${response} Create Entity Selecting Content Type @@ -218,7 +218,7 @@ Create Entity Selecting Content Type ... json=${entity} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Entity Selecting Content Type RETURN ${response} Append Entity Attributes @@ -230,7 +230,7 @@ Append Entity Attributes ... data=${file_content} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Append Entity Attributes RETURN ${response} Append Entity Attributes With Parameters @@ -242,7 +242,7 @@ Append Entity Attributes With Parameters ... json=${fragment_payload} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Append Entity Attributes With Parameters RETURN ${response} Update Entity Attributes @@ -254,7 +254,7 @@ Update Entity Attributes ... data=${file_content} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Update Entity Attributes RETURN ${response} Delete Entity Attributes @@ -277,7 +277,7 @@ Delete Entity Attributes ... url=${url}/${ENTITIES_ENDPOINT_PATH}${entityId}/attrs/${attributeId}?${params_as_string} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Delete Entity Attributes RETURN ${response} Partial Update Entity Attributes @@ -303,7 +303,7 @@ Partial Update Entity Attributes ... json=${fragment_payload} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Partial Update Entity Attributes RETURN ${response} Retrieve Entity Types @@ -325,7 +325,7 @@ Retrieve Entity Types ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Retrieve Entity Types RETURN ${response} Retrieve Entity Type @@ -344,7 +344,7 @@ Retrieve Entity Type ... url=${url}/${ENTITIES_TYPES_ENDPOINT_PATH}/${type} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Retrieve Entity Type RETURN ${response} Retrieve Attributes @@ -366,7 +366,7 @@ Retrieve Attributes ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Retrieve Attributes RETURN ${response} Retrieve Attribute @@ -385,7 +385,7 @@ Retrieve Attribute ... url=${url}/${ATTRIBUTES_ENDPOINT_PATH}/${attribute_name} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Retrieve Attribute RETURN ${response} Create Context Source Registration With Return @@ -404,7 +404,7 @@ Create Context Source Registration With Return ... json=${payload} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Context Source Registration RETURN ${response} Update Context Source Registration With Return @@ -416,7 +416,7 @@ Update Context Source Registration With Return ... json=${fragment} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Update Context Source Registration RETURN ${response} Delete Context Source Registration With Return @@ -424,7 +424,7 @@ Delete Context Source Registration With Return ${response}= DELETE ... url=${url}/${CONTEXT_SOURCE_REGISTRATION_ENDPOINT_PATH}/${registration_id} ... expected_status=any - Output ${response} + Output ${response} Delete Context Source Registration RETURN ${response} Create Entity @@ -437,7 +437,7 @@ Create Entity ... json=${entity} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Entity RETURN ${response} Create Or Update Temporal Representation Of Entity Selecting Content Type @@ -456,7 +456,7 @@ Create Or Update Temporal Representation Of Entity Selecting Content Type ... json=${temporal_entity_representation} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Or Update Temporal Representation Of Entity Selecting Content Type RETURN ${response} Create Temporal Representation Of Entity Selecting Content Type @@ -468,7 +468,7 @@ Create Temporal Representation Of Entity Selecting Content Type ... data=${file_content} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Temporal Representation Of Entity Selecting Content Type RETURN ${response} Append Attribute To Temporal Entity @@ -480,7 +480,7 @@ Append Attribute To Temporal Entity ... data=${file_content} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Append Attribute To Temporal Entity RETURN ${response} Modify Attribute Instance From Temporal Entity @@ -503,7 +503,7 @@ Modify Attribute Instance From Temporal Entity ... json=${fragment_payload} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Modify Attribute Instance From Temporal Entity RETURN ${response} Delete Attribute From Temporal Entity @@ -532,7 +532,7 @@ Delete Attribute From Temporal Entity ... url=${url}/${TEMPORAL_ENTITIES_ENDPOINT_PATH}/${entityId}/attrs/${attributeId}?${params_as_string} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Delete Attribute From Temporal Entity RETURN ${response} Delete Temporal Representation Of Entity With Returning Response @@ -540,7 +540,7 @@ Delete Temporal Representation Of Entity With Returning Response ${response}= DELETE ... url=${url}/${TEMPORAL_ENTITIES_ENDPOINT_PATH}/${temporal_entity_representation_id} ... expected_status=any - Output ${response} + Output ${response} Delete Temporal Representation Of Entity RETURN ${response} Get Temporal Representation Of Entity @@ -568,7 +568,7 @@ Get Temporal Representation Of Entity ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Get Temporal Representation Of Entity RETURN ${response} Delete Attribute Instance From Temporal Entity @@ -583,7 +583,7 @@ Delete Attribute Instance From Temporal Entity ... url=${url}/${TEMPORAL_ENTITIES_ENDPOINT_PATH}/${temporal_entity_id}/attrs/${attributeId}/${instanceId} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Delete Attribute Instance From Temporal Entity RETURN ${response} Update Temporal Representation Of Entity Selecting Content Type @@ -601,7 +601,7 @@ Update Temporal Representation Of Entity Selecting Content Type ... json=${temporal_entity_fragment} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Update Temporal Representation Of Entity Selecting Content Type RETURN ${response} Batch Create Entities @@ -625,7 +625,7 @@ Batch Create Entities ... json=@{entities_to_be_created} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Batch Create Entities RETURN ${response} Batch Upsert Entities @@ -636,7 +636,7 @@ Batch Upsert Entities ... json=@{entities_to_be_upserted} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Batch Upsert Entities RETURN ${response} Batch Update Entities @@ -647,7 +647,7 @@ Batch Update Entities ... json=@{entities_to_be_updated} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Batch Update Entities RETURN ${response} Batch Delete Entities @@ -658,7 +658,7 @@ Batch Delete Entities ... json=@{entities_ids_to_be_deleted} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Batch Delete Entities RETURN ${response} Request Entity From File @@ -670,7 +670,7 @@ Request Entity From File ... data=${file_content} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Request Entity From File RETURN ${response} Batch Request Entities From File @@ -683,7 +683,7 @@ Batch Request Entities From File ... data=${file_content} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Batch Request Entities From File RETURN ${response} Create Temporal Representation Of Entity @@ -700,7 +700,7 @@ Create Temporal Representation Of Entity ... json=${temporal_entity_representation} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Temporal Representation Of Entity RETURN ${response} Retrieve Temporal Representation Of Entity @@ -743,7 +743,7 @@ Retrieve Temporal Representation Of Entity ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Retrieve Temporal Representation Of Entity RETURN ${response} Query Temporal Representation Of Entities @@ -811,7 +811,7 @@ Query Temporal Representation Of Entities ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Query Temporal Representation Of Entities RETURN ${response} Query Temporal Representation Of Entities Via Post @@ -827,7 +827,7 @@ Query Temporal Representation Of Entities Via Post ... json=${query_payload} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Query Temporal Representation Of Entities Via Post RETURN ${response} Delete Temporal Representation Of Entity @@ -836,7 +836,7 @@ Delete Temporal Representation Of Entity ${response}= DELETE ... url=${url}/${TEMPORAL_ENTITIES_ENDPOINT_PATH}/${temporal_entity_representation_id} ... expected_status=any - Output ${response} + Output ${response} Delete Temporal Representation Of Entity RETURN ${response} Create Context Source Registration @@ -848,7 +848,7 @@ Create Context Source Registration ... json=${context_source_registration_payload} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Context Source Registration RETURN ${response} Update Context Source Registration @@ -858,7 +858,7 @@ Update Context Source Registration ... url=${url}/${CONTEXT_SOURCE_REGISTRATION_ENDPOINT_PATH}/${context_source_registration_id} ... json=${update_fragment} ... expected_status=any - Output ${response} + Output ${response} Update Context Source Registration RETURN ${response} Query Context Source Registrations @@ -918,14 +918,14 @@ Query Context Source Registrations ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Query Context Source Registrations RETURN ${response} Delete Context Source Registration [Arguments] ${context_source_registration_id} ${response}= DELETE url=${url}/${CONTEXT_SOURCE_REGISTRATION_ENDPOINT_PATH}/${context_source_registration_id} - Output ${response} + Output ${response} Delete Context Source Registration RETURN ${response} Retrieve Context Source Registration @@ -942,7 +942,7 @@ Retrieve Context Source Registration ... url=${url}/${CONTEXT_SOURCE_REGISTRATION_ENDPOINT_PATH}/${context_source_registration_id} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Retrieve Context Source Registration RETURN ${response} Create Context Source Registration Subscription @@ -957,7 +957,7 @@ Create Context Source Registration Subscription ... json=${subscription_payload} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Context Source Registration Subscription RETURN ${response} Update Context Source Registration Subscription @@ -967,7 +967,7 @@ Update Context Source Registration Subscription ... url=${url}/${CONTEXT_SOURCE_REGISTRATION_SUBSCRIPTION_ENDPOINT_PATH}/${subscription_id} ... json=${subscription_update_fragment} ... expected_status=any - Output ${response} + Output ${response} Update Context Source Registration Subscription RETURN ${response} Retrieve Context Source Registration Subscription @@ -984,7 +984,7 @@ Retrieve Context Source Registration Subscription ... url=${url}/${CONTEXT_SOURCE_REGISTRATION_SUBSCRIPTION_ENDPOINT_PATH}/${subscription_id} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Retrieve Context Source Registration Subscription RETURN ${response} Query Context Source Registration Subscriptions @@ -1006,14 +1006,14 @@ Query Context Source Registration Subscriptions ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Query Context Source Registration Subscriptions RETURN ${response} Delete Context Source Registration Subscription [Arguments] ${subscription_id} ${response}= DELETE ${url}/${CONTEXT_SOURCE_REGISTRATION_SUBSCRIPTION_ENDPOINT_PATH}/${subscription_id} - Output ${response} + Output ${response} Delete Context Source Registration Subscription RETURN ${response} Update Context Source Registration Subscription From File @@ -1023,7 +1023,7 @@ Update Context Source Registration Subscription From File ... url=${url}/${CONTEXT_SOURCE_REGISTRATION_SUBSCRIPTION_ENDPOINT_PATH}/${subscription_id} ... data=${file_content} ... expected_status=any - Output ${response} + Output ${response} Update Context Source Registration Subscription From File RETURN ${response} Create Subscription @@ -1049,7 +1049,7 @@ Create Subscription ... json=${subscription} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Subscription RETURN ${response} Create Subscription From Subscription Payload @@ -1072,7 +1072,7 @@ Create Subscription From Subscription Payload ... json=${subscription_payload} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Subscription From Subscription Payload RETURN ${response} Create Subscription From File @@ -1084,7 +1084,7 @@ Create Subscription From File ... data=${file_content} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Create Subscription From File RETURN ${response} Update Subscription @@ -1109,7 +1109,7 @@ Update Subscription ... json=${subscription_update_fragment} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Update Subscription RETURN ${response} Update Subscription With Payload @@ -1128,13 +1128,13 @@ Update Subscription With Payload ... json=${payload} ... headers=${headers} ... expected_status=any - Output ${response} + Output ${response} Update Subscription With Payload RETURN ${response} Delete Subscription [Arguments] ${subscription_id} ${response}= DELETE url=${url}/${SUBSCRIPTION_ENDPOINT_PATH}${subscription_id} expected_status=any - Output ${response} + Output ${response} Delete Subscription RETURN ${response} Query Subscriptions @@ -1158,7 +1158,7 @@ Query Subscriptions ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Query Subscriptions RETURN ${response} Retrieve Subscription @@ -1175,7 +1175,7 @@ Retrieve Subscription END ${response}= GET url=${url}/${SUBSCRIPTION_ENDPOINT_PATH}${id} headers=${headers} expected_status=any - Output ${response} + Output ${response} Retrieve Subscription RETURN ${response} Query Context Source Registrations With Return @@ -1235,7 +1235,7 @@ Query Context Source Registrations With Return ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Query Context Source Registrations RETURN ${response} Query Temporal Representation Of Entities With Return @@ -1303,5 +1303,5 @@ Query Temporal Representation Of Entities With Return ... headers=${headers} ... params=${params} ... expected_status=any - Output ${response} + Output ${response} Query Temporal Representation Of Entities RETURN ${response} diff --git a/resources/AssertionUtils.resource b/resources/AssertionUtils.resource index c6dd0a8978806388d8f5620a2b8742e2c6d0fe13..52faa52c0cfb0a9d5145bff1296a6631ae0894f7 100755 --- a/resources/AssertionUtils.resource +++ b/resources/AssertionUtils.resource @@ -19,7 +19,10 @@ ${status_regex_expr}= root\\['status'\\] Check Response Status Code [Arguments] ${expected_status_code} ${response_status_code} ${response_status_code}= convert to string ${response_status_code} - Should Be Equal ${expected_status_code} ${response_status_code} + Should Be Equal + ... ${expected_status_code} + ... ${response_status_code} + ... HTTP status code comparison failed with (expected, actual) -> Check Response Body Containing Array Of URIs set to [Arguments] ${expected_entities_ids} ${response_body}