Loading .gitlab-ci.yml 0 → 100644 +17 −0 Original line number Diff line number Diff line # CI/CD: # # BUILD triggered by: # - any (branch commit) # # stages: - build Build api-tests docker image: stage: build before_script: cd api-tests script: docker build --tag stf583-rf-validation:miguel -f Dockerfile . rules: - changes: - api-tests/Dockerfile No newline at end of file api-tests/Dockerfile 0 → 100644 +60 −0 Original line number Diff line number Diff line FROM ubuntu:18.04 MAINTAINER ETSI STF 583 LABEL description="SFT583 Robot Framework Docker Image" ENV TERM=xterm ENV HOSTNAME docker-robot-STF583 ARG ssh_prv_key RUN DEBIAN_FRONTEND=noninteractive apt update \ && apt install python3 git -y \ && apt install python3-pip -y \ && DEBIAN_FRONTEND=noninteractive apt-get autoremove --purge -y \ && DEBIAN_FRONTEND=noninteractive apt-get autoclean \ && rm -rf /var/lib/apt/lists/* RUN echo "docker-robot-STF583" > /etc/hostname \ && echo "root:etsi" | chpasswd RUN useradd --create-home --shell /bin/bash --user-group etsi --groups sudo \ && echo "etsi:etsi" | chpasswd \ && adduser etsi sudo \ && echo "etsi ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers RUN DEBIAN_FRONTEND=noninteractive \ && mkdir -p /home/etsi/dev/robot \ && cd /home/etsi/dev/robot #RUN pip3 install robotframework ADD requirements.txt /home/etsi/dev/robot/ ADD extensions /home/etsi/dev/robot/extensions RUN ls /home/etsi/dev/robot #To avoid to use the cache when new commits are available ADD "https://forge.etsi.org/rep/api/v4/projects/224/repository/branches/master" /tmp/devalidateCache RUN DEBIAN_FRONTED=noninteractive \ cd /home/etsi/dev/ \ mkdir -p build \ && git clone https://forge.etsi.org/rep/forge-tools/robot2doc.git \ && cd robot2doc \ && pip3 install -r requirements.txt \ && python3 -m pip install -e . RUN DEBIAN_FRONTEND=noninteractive \ && cd /home/etsi/dev/robot \ && pip3 install -r requirements.txt #ADD . /home/etsi/dev/robot RUN chmod +x /home/etsi/dev/robot/scripts/* CMD tail -f /dev/null api-tests/extensions/__old__mockserverlibrary.patch 0 → 100644 +75 −0 Original line number Diff line number Diff line diff --git a/src/MockServerLibrary/library.py b/src/MockServerLibrary/library.py index a9e6227..7208e61 100644 --- a/src/MockServerLibrary/library.py +++ b/src/MockServerLibrary/library.py @@ -68,6 +68,31 @@ class MockServerLibrary(object): return req + def create_mock_request_matcher_schema(self, method, path, body_type='JSON_SCHEMA', body=None): + """Creates a mock request matcher to be used by mockserver. + + Returns the request matcher in a dictionary format. + + `method` is the HTTP method of the mocked endpoint + + `path` is the url of the mocked endpoint, e.g. /api + + `body_type` is the type of the request body, e.g. JSON + + `body` is a dictionary of the json attribute(s) to match + + `exact` is a boolean value which specifies whether the body should match fully (=true), + or if only specified fields should match (=false) + """ + req = {} + req['method'] = method + req['path'] = path + + req['body'] = {'type': body_type, 'jsonSchema': json.dumps(body)} + + return req + + def create_mock_response(self, status_code, headers=None, body_type='JSON', body=None): """Creates a mock response to be used by mockserver. @@ -97,6 +122,37 @@ class MockServerLibrary(object): return rsp + + def create_mock_response_schema(self, status_code, headers=None, body_type='JSON_SCHEMA', body=None): + """Creates a mock response to be used by mockserver. + + Returns the response in a dictionary format. + + `status_code` is the HTTP status code of the response + + `headers` is a dictionary of headers to be added to the response + + `body_type` is the type of the response body, e.g. JSON + + `body` is a dictonary of JSON attribute(s) to be added to the response body + """ + rsp = {} + rsp['statusCode'] = int(status_code) + + if headers: + rsp['headers'] = [] + + for key, value in headers.items(): + header = {'name': key, 'values': value.split(",")} + rsp['headers'].append(header) + logger.debug("Add header - header: {}".format(header)) + + if body_type is 'JSON_SCHEMA' and body: + rsp['body'] = json.dumps(body) + + return rsp + + def create_mock_expectation(self, request, response, count=1, unlimited=True): """Creates a mock expectation to be used by mockserver. api-tests/extensions/jsonlibrary.patch 0 → 100644 +59 −0 Original line number Diff line number Diff line diff --git a/JSONLibrary/JSONLibraryKeywords.py b/JSONLibrary/JSONLibraryKeywords.py index 6ceb6e1..20bfd45 100644 --- a/JSONLibrary/JSONLibraryKeywords.py +++ b/JSONLibrary/JSONLibraryKeywords.py @@ -1,7 +1,13 @@ # -*- coding: utf-8 -*- from robot.api import logger from robot.api.deco import keyword -from version import VERSION +#from version import VERSION +try: + from version import VERSION +except: + from JSONLibrary.version import VERSION + + import os.path import json from jsonpath_rw import Index, Fields diff --git a/JSONLibrary/__init__.py b/JSONLibrary/__init__.py index efc756e..79ad728 100644 --- a/JSONLibrary/__init__.py +++ b/JSONLibrary/__init__.py @@ -1,6 +1,12 @@ # -*- coding: utf-8 -*- -from JSONLibraryKeywords import JSONLibraryKeywords -from version import VERSION +# from JSONLibraryKeywords import JSONLibraryKeywords +# from version import VERSION +try: + from JSONLibraryKeywords import JSONLibraryKeywords + from version import VERSION +except: + from JSONLibrary.JSONLibraryKeywords import JSONLibraryKeywords + from JSONLibrary.version import VERSION __author__ = 'Traitanit Huangsri' __email__ = 'traitanit.hua@gmail.com' diff --git a/setup.py b/setup.py index 744e6f5..5082364 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,15 @@ # -*- coding: utf-8 -*- from setuptools import setup -from JSONLibrary.version import VERSION +# from JSONLibrary.version import VERSION + + +# importing this has the unwanted side-effect of importing +# other required packages that may not be installed yet +# resulting in an error +#from JSONLibrary.version import VERSION + +VERSION = '0.2' requirements = [ 'tox', api-tests/extensions/mockserverlibrary.patch 0 → 100644 +59 −0 Original line number Diff line number Diff line diff --git a/src/MockServerLibrary/library.py b/src/MockServerLibrary/library.py index a9e6227..7ba1eed 100644 --- a/src/MockServerLibrary/library.py +++ b/src/MockServerLibrary/library.py @@ -66,6 +66,9 @@ class MockServerLibrary(object): match_type = 'STRICT' if exact else 'ONLY_MATCHING_FIELDS' req['body'] = {'type': body_type, 'json': json.dumps(body), 'matchType': match_type} + if body_type is 'JSON_SCHEMA' and body: + req['body'] = {'type': body_type, 'json': json.dumps(body)} + return req def create_mock_response(self, status_code, headers=None, body_type='JSON', body=None): @@ -97,6 +100,42 @@ class MockServerLibrary(object): return rsp + def create_mock_http_forward(self, path, delay=1, unit='SECONDS'): + """Creates a mock http override forward to be used by mockserver. + + Returns the http forward in a dictionary format. + + `path` is the new url where to forward the request + + `delay` is the delay of the forward action + + `unit` is the unit of the delay time (default "SECONDS") + """ + fwd = {} + fwd['httpRequest'] = {'path': path} + fwd['delay'] = {'timeUnit': unit, 'value': delay} + + return fwd + + def create_mock_expectation_with_http_forward(self, request, forward, count=1, unlimited=True): + """Creates a mock expectation with request and forward action to be used by mockserver. + + `request` is a mock request matcher in a dictionary format. + + `forward` is a mock forward in a dictionary format. + + `count` is the number of expected requests + + `unlimited` is a boolean value which, if enabled, allows unspecified number of + requests to reply to + """ + data = {} + data['httpRequest'] = request + data['httpOverrideForwardedRequest'] = forward + data['times'] = {'remainingTimes': int(count), 'unlimited': unlimited} + + self.create_mock_expectation_with_data(data) + def create_mock_expectation(self, request, response, count=1, unlimited=True): """Creates a mock expectation to be used by mockserver. Loading
.gitlab-ci.yml 0 → 100644 +17 −0 Original line number Diff line number Diff line # CI/CD: # # BUILD triggered by: # - any (branch commit) # # stages: - build Build api-tests docker image: stage: build before_script: cd api-tests script: docker build --tag stf583-rf-validation:miguel -f Dockerfile . rules: - changes: - api-tests/Dockerfile No newline at end of file
api-tests/Dockerfile 0 → 100644 +60 −0 Original line number Diff line number Diff line FROM ubuntu:18.04 MAINTAINER ETSI STF 583 LABEL description="SFT583 Robot Framework Docker Image" ENV TERM=xterm ENV HOSTNAME docker-robot-STF583 ARG ssh_prv_key RUN DEBIAN_FRONTEND=noninteractive apt update \ && apt install python3 git -y \ && apt install python3-pip -y \ && DEBIAN_FRONTEND=noninteractive apt-get autoremove --purge -y \ && DEBIAN_FRONTEND=noninteractive apt-get autoclean \ && rm -rf /var/lib/apt/lists/* RUN echo "docker-robot-STF583" > /etc/hostname \ && echo "root:etsi" | chpasswd RUN useradd --create-home --shell /bin/bash --user-group etsi --groups sudo \ && echo "etsi:etsi" | chpasswd \ && adduser etsi sudo \ && echo "etsi ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers RUN DEBIAN_FRONTEND=noninteractive \ && mkdir -p /home/etsi/dev/robot \ && cd /home/etsi/dev/robot #RUN pip3 install robotframework ADD requirements.txt /home/etsi/dev/robot/ ADD extensions /home/etsi/dev/robot/extensions RUN ls /home/etsi/dev/robot #To avoid to use the cache when new commits are available ADD "https://forge.etsi.org/rep/api/v4/projects/224/repository/branches/master" /tmp/devalidateCache RUN DEBIAN_FRONTED=noninteractive \ cd /home/etsi/dev/ \ mkdir -p build \ && git clone https://forge.etsi.org/rep/forge-tools/robot2doc.git \ && cd robot2doc \ && pip3 install -r requirements.txt \ && python3 -m pip install -e . RUN DEBIAN_FRONTEND=noninteractive \ && cd /home/etsi/dev/robot \ && pip3 install -r requirements.txt #ADD . /home/etsi/dev/robot RUN chmod +x /home/etsi/dev/robot/scripts/* CMD tail -f /dev/null
api-tests/extensions/__old__mockserverlibrary.patch 0 → 100644 +75 −0 Original line number Diff line number Diff line diff --git a/src/MockServerLibrary/library.py b/src/MockServerLibrary/library.py index a9e6227..7208e61 100644 --- a/src/MockServerLibrary/library.py +++ b/src/MockServerLibrary/library.py @@ -68,6 +68,31 @@ class MockServerLibrary(object): return req + def create_mock_request_matcher_schema(self, method, path, body_type='JSON_SCHEMA', body=None): + """Creates a mock request matcher to be used by mockserver. + + Returns the request matcher in a dictionary format. + + `method` is the HTTP method of the mocked endpoint + + `path` is the url of the mocked endpoint, e.g. /api + + `body_type` is the type of the request body, e.g. JSON + + `body` is a dictionary of the json attribute(s) to match + + `exact` is a boolean value which specifies whether the body should match fully (=true), + or if only specified fields should match (=false) + """ + req = {} + req['method'] = method + req['path'] = path + + req['body'] = {'type': body_type, 'jsonSchema': json.dumps(body)} + + return req + + def create_mock_response(self, status_code, headers=None, body_type='JSON', body=None): """Creates a mock response to be used by mockserver. @@ -97,6 +122,37 @@ class MockServerLibrary(object): return rsp + + def create_mock_response_schema(self, status_code, headers=None, body_type='JSON_SCHEMA', body=None): + """Creates a mock response to be used by mockserver. + + Returns the response in a dictionary format. + + `status_code` is the HTTP status code of the response + + `headers` is a dictionary of headers to be added to the response + + `body_type` is the type of the response body, e.g. JSON + + `body` is a dictonary of JSON attribute(s) to be added to the response body + """ + rsp = {} + rsp['statusCode'] = int(status_code) + + if headers: + rsp['headers'] = [] + + for key, value in headers.items(): + header = {'name': key, 'values': value.split(",")} + rsp['headers'].append(header) + logger.debug("Add header - header: {}".format(header)) + + if body_type is 'JSON_SCHEMA' and body: + rsp['body'] = json.dumps(body) + + return rsp + + def create_mock_expectation(self, request, response, count=1, unlimited=True): """Creates a mock expectation to be used by mockserver.
api-tests/extensions/jsonlibrary.patch 0 → 100644 +59 −0 Original line number Diff line number Diff line diff --git a/JSONLibrary/JSONLibraryKeywords.py b/JSONLibrary/JSONLibraryKeywords.py index 6ceb6e1..20bfd45 100644 --- a/JSONLibrary/JSONLibraryKeywords.py +++ b/JSONLibrary/JSONLibraryKeywords.py @@ -1,7 +1,13 @@ # -*- coding: utf-8 -*- from robot.api import logger from robot.api.deco import keyword -from version import VERSION +#from version import VERSION +try: + from version import VERSION +except: + from JSONLibrary.version import VERSION + + import os.path import json from jsonpath_rw import Index, Fields diff --git a/JSONLibrary/__init__.py b/JSONLibrary/__init__.py index efc756e..79ad728 100644 --- a/JSONLibrary/__init__.py +++ b/JSONLibrary/__init__.py @@ -1,6 +1,12 @@ # -*- coding: utf-8 -*- -from JSONLibraryKeywords import JSONLibraryKeywords -from version import VERSION +# from JSONLibraryKeywords import JSONLibraryKeywords +# from version import VERSION +try: + from JSONLibraryKeywords import JSONLibraryKeywords + from version import VERSION +except: + from JSONLibrary.JSONLibraryKeywords import JSONLibraryKeywords + from JSONLibrary.version import VERSION __author__ = 'Traitanit Huangsri' __email__ = 'traitanit.hua@gmail.com' diff --git a/setup.py b/setup.py index 744e6f5..5082364 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,15 @@ # -*- coding: utf-8 -*- from setuptools import setup -from JSONLibrary.version import VERSION +# from JSONLibrary.version import VERSION + + +# importing this has the unwanted side-effect of importing +# other required packages that may not be installed yet +# resulting in an error +#from JSONLibrary.version import VERSION + +VERSION = '0.2' requirements = [ 'tox',
api-tests/extensions/mockserverlibrary.patch 0 → 100644 +59 −0 Original line number Diff line number Diff line diff --git a/src/MockServerLibrary/library.py b/src/MockServerLibrary/library.py index a9e6227..7ba1eed 100644 --- a/src/MockServerLibrary/library.py +++ b/src/MockServerLibrary/library.py @@ -66,6 +66,9 @@ class MockServerLibrary(object): match_type = 'STRICT' if exact else 'ONLY_MATCHING_FIELDS' req['body'] = {'type': body_type, 'json': json.dumps(body), 'matchType': match_type} + if body_type is 'JSON_SCHEMA' and body: + req['body'] = {'type': body_type, 'json': json.dumps(body)} + return req def create_mock_response(self, status_code, headers=None, body_type='JSON', body=None): @@ -97,6 +100,42 @@ class MockServerLibrary(object): return rsp + def create_mock_http_forward(self, path, delay=1, unit='SECONDS'): + """Creates a mock http override forward to be used by mockserver. + + Returns the http forward in a dictionary format. + + `path` is the new url where to forward the request + + `delay` is the delay of the forward action + + `unit` is the unit of the delay time (default "SECONDS") + """ + fwd = {} + fwd['httpRequest'] = {'path': path} + fwd['delay'] = {'timeUnit': unit, 'value': delay} + + return fwd + + def create_mock_expectation_with_http_forward(self, request, forward, count=1, unlimited=True): + """Creates a mock expectation with request and forward action to be used by mockserver. + + `request` is a mock request matcher in a dictionary format. + + `forward` is a mock forward in a dictionary format. + + `count` is the number of expected requests + + `unlimited` is a boolean value which, if enabled, allows unspecified number of + requests to reply to + """ + data = {} + data['httpRequest'] = request + data['httpOverrideForwardedRequest'] = forward + data['times'] = {'remainingTimes': int(count), 'unlimited': unlimited} + + self.create_mock_expectation_with_data(data) + def create_mock_expectation(self, request, response, count=1, unlimited=True): """Creates a mock expectation to be used by mockserver.