Commit 2a22ae98 authored by Dan Jones's avatar Dan Jones
Browse files

Merge branch '1-import-features-and-fixtures-from-js-adapter' into 'dev'

Resolve "import-features-and-fixtures-from-js-adapter"

Closes #1

See merge request !1
2 merge requests!5Resolve "Release v0.1",!1Resolve "import-features-and-fixtures-from-js-adapter"
Copyright 2023 [NOC](https://noc.ac.uk)
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
include features/*.feature
include fixtures/*.json
# backbone-adapter-testsuite
Gherkin feature definitions and fixtures to run against all language ports of the adapter.
\ No newline at end of file
Gherkin feature definitions and fixtures to run against all language ports of the backbone-adapter.
## Contents
### /features
Gherkin `.feature` files describing a suite of tests which
should be run against all language ports of the adapter
### /fixtures
A set of fixtures to be used to configure the tests.
## Implementations
You can see existing implementations of the test suite here
- [JS-Cucumber](https://git.noc.ac.uk/communications-backbone-system/backbone-adapter-javascript)
Step definitions are in `test/cucumber`
## Installing
The intention is to install a tagged version of the testsuite into each adapter so that if we develop
the testsuite existing adapter implementations won't break.
In JS the target tag/branch/commit is specified with # after the git url
### NPM
```bash
npm install --saveDev git+https://git.noc.ac.uk/communications-backbone-system/backbone-adapter-testsuite.git#[tag|branch|commit]
```
### Yarn
```bash
yarn add --dev git+https://git.noc.ac.uk/communications-backbone-system/backbone-adapter-testsuite.git#[tag|branch|commit]
```
### PIP
In pip the target tag/branch/commit is specified with @ after the git url
```bash
echo
"git+https://git.noc.ac.uk/communications-backbone-system/backbone-adapter-testsuite.git@[tag|branch|commit]#egg=backbone-adapter-testsuite" >> requirements.txt
pip install -r reqiurements.txt
# copy features and fixtures into test directory
copy_tests
```
import os
from shutil import copytree
import site
def copy_directory(src, dest, directory):
copytree(os.path.join(src, directory), os.path.join(dest, directory))
def copy():
here = os.getcwd();
package_locations = site.getsitepackages()
for root_path in package_locations:
dirs = [x[0] for x in os.walk(root_path)]
for dirx in dirs:
if dirx.endswith('testsuite'):
src = dirx
dest = os.path.join(here, 'test')
copy_directory(src, dest, 'features')
copy_directory(src, dest, 'fixtures')
if __name__ == '__main__':
copy()
\ No newline at end of file
Feature: Does the adapter authenticate?
When an adapter instance is created it authenticates and receives a token
Scenario: A token is granted with valid config
Given valid config
When the adapter instance is created
When the auth method is called
Then the adapter credentials are populated
Scenario: Auth fails with invalid config
Given invalid config
When the adapter instance is created
Then the adapter auth fails
\ No newline at end of file
Feature: Can the adapter broadcast messages?
The adapter publish method works as expected
Scenario: A message can be published successfully
Given valid config
When the adapter instance is created
When the auth method is called
When a mock notify API response is configured to return success
When the broadcast method is called
Then a successful response is returned with status 200
Scenario: A failed publish returns a 403
Given valid config
When the adapter instance is created
When the auth method is called
When a mock notify API response is configured to return an error
When the broadcast method is called
Then an error response is returned with status 403
\ No newline at end of file
Feature: Can the adapter create an authorization header?
The adapter getAuthorizationHeader method works as expected
Scenario: getAuthorizationHeader returns a bearer token
Given valid config
When the adapter instance is created
When the auth method is called
When the getAuthorizationHeader method is called
Then a headers object is returned containing a bearer token authorization header
Scenario: getAuthorizationHeader implicitly calls auth if required
Given valid config
When the adapter instance is created
When the getAuthorizationHeader method is called
Then a headers object is returned containing a bearer token authorization header
Scenario: getAuthorizationHeader implicitly calls auth if required
Given invalid config
When the adapter instance is created
When the getAuthorizationHeader method is called
Then an error response is returned with status 403
\ No newline at end of file
# When the queue contains x messages
# only mocks the API response
# Testing how the API behaves with a full queue are defined in the API
Feature: Can the adapter receive messages?
The adapter poll method works as expected
Scenario: No messages are received successfully if the queue is empty
Given valid config
When the adapter instance is created
When the auth method is called
When a mock receive API response is configured to return 0 messages
When the poll method is called
Then a successful response is returned with 0 messages
Scenario: 2 messages are received successfully if the queue contains 2 messages
Given valid config
When the adapter instance is created
When the auth method is called
When a mock receive API response is configured to return 2 messages
When the poll method is called
Then a successful response is returned with 2 messages
Then the protocol "validate" method is called 2 times
Then the protocol "decode" method is called 2 times
Scenario: 10 messages are received successfully if the queue contains 10 messages
Given valid config
When the adapter instance is created
When the auth method is called
When a mock receive API response is configured to return 10 messages
When the poll method is called
Then a successful response is returned with 10 messages
Then the protocol "validate" method is called 10 times
Then the protocol "decode" method is called 10 times
Scenario: An invalid token returns a forbidden response
Given valid config
When the adapter instance is created
When the auth method is called
When a mock receive API response is configured to return an error
When the poll method is called
Then an error response is returned with status 403
Feature: Can the adapter publish messages?
The adapter publish method works as expected
Scenario: A message can be published successfully
Given valid config
When the adapter instance is created
When the auth method is called
When a mock send API response is configured to return success
When the publish method is called
Then a successful response is returned with status 200
Scenario: A failed publish returns a 403
Given valid config
When the adapter instance is created
When the auth method is called
When a mock send API response is configured to return an error
When the publish method is called
Then an error response is returned with status 403
# tokenValid returns true if there is a token and the expiry is in the future
# tokenValid returns false if the token expiry is in the past
# or if there is no token
# In the case where invalid credentials are supplied
# the auth will fail so there will be no token available
Feature: Is the token valid?
The adapter tokenValid method works as expected
Scenario: If adapter has not authed then the tokenValid returns false
Given valid config
When the adapter instance is created
Then tokenValid returns false
Scenario: If credentials.expiry is in the future then the token is valid
Given valid config
When the adapter instance is created
When the auth method is called
When the token expiry is in the future
Then tokenValid returns true
Scenario: If credentials.expiry is in the past then the token is invalid
Given valid config
When the adapter instance is created
When the auth method is called
When the token expiry is in the past
Then tokenValid returns false
Feature: Can the adapter validate messages?
The adapter validate method works as expected
Scenario: A valid message is successfully validated against the protocol schema
Given valid config
Given a valid message
When the adapter instance is created
When the validate method is called
Then the message is validated successfully
Scenario: An invalid message fails to validate against the protocol schema
Given valid config
Given an invalid message
When the adapter instance is created
When the validate method is called
Then the message fails to validate
\ No newline at end of file
# Decode and encode are provided as stubs which are intended to be overridden
# These can be used to translate the message or to invoke other functions
# to take action based on the type and content of messages
Feature: Decode stubs passthru message unchanged
The protocol decode method works as expected
Scenario: Decode passes the message through unaltered
Given a valid message
When the protocol.decode method is called
Then the message is returned unaltered
# Decode and encode are provided as stubs which are intended to be overridden
# These can be used to translate the message or to invoke other functions
# to take action based on the type and content of messages
Feature: Encode stubs passthru message unchanged
The protocol encode method works as expected
Scenario: Encode passes the message through unaltered
Given a valid message
When the protocol.encode method is called
Then the message is returned unaltered
\ No newline at end of file
Feature: Can the protocol determine message type
The protocol getType method works as expected
Scenario: A valid message is successfully typed
Given a valid message
When protocol getType is called
Then getType returns message.payload.message_type if present
Scenario: An invalid message returns type:null
Given an invalid message
When protocol getType is called
Then getType returns null if message.payload.message_type is not present
Feature: Can the protocol validate messages?
The adapter validate method works as expected
Scenario: A valid message is successfully validated against the protocol schema
Given a valid message
When the protocol.validate method is called
Then the message is validated successfully
Scenario: An invalid message fails to validate against the protocol schema
Given an invalid message
When the protocol.validate method is called
Then the message fails to validate
\ No newline at end of file
# If the mock schema fixture fails to validate
# it can cause invalid messages to show as valid
Feature: Is the mock schema valid?
The mock schema must validate in order for the adapter test to work
Scenario: The schema matches the OpenAPI specification
Given the test schema
When it is validated
Then it matches the OpenAPI specification
\ No newline at end of file
{
"api": "https://example.backbone.com/api",
"client_id": "invalid-client-id",
"client_name": "InvalidClientName",
"subscription": "dot.delimited.topic.subscription.#",
"secret": "TheCollaredDoveCoosInTheChimneyPot"
}
\ No newline at end of file
{
"api": "https://example.backbone.com/api",
"client_id": "unique-client-id",
"client_name": "UniqueClientName",
"subscription": "dot.delimited.topic.subscription.#",
"secret": "TheGeeseFlySouthInWinter"
}
\ No newline at end of file
{
"metadata": {
"source": "ae",
"destination": "soar.po.ecosub.eco1",
"delivery_type": "publish",
"message_id": "test"
},
"payload": {
"messagetype": "VehicleStatus",
"operatorID": 1,
"vehicleID": 12,
"coordinates": {
"latitude": "monkeys",
"longitude": "janvier",
"depth": "twenty five metres please",
"projection": 4326
},
"battery_percentage": "plenty"
}
}
\ No newline at end of file
{
"metadata": {
"source": "ae",
"destination": "soar.po.ecosub.eco1",
"delivery_type": "publish",
"message_id": "test"
},
"payload": {
"message_type": "VehicleStatus",
"operator_id": "po",
"vehicle_id": "eco1",
"coordinates": {
"latitude": 57.234,
"longitude": -8.432,
"depth": 50,
"projection": 4326
},
"battery_percentage": 64
}
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment