Skip to content
Snippets Groups Projects
Commit 328bdffa authored by Aleksandr's avatar Aleksandr Committed by GitHub
Browse files

Merge pull request #5 from microservices-demo/test/fix-test

Fixing tests; adding API tests
parents 68749804 4184df7a
No related branches found
No related tags found
No related merge requests found
......@@ -11,10 +11,10 @@ env:
script:
- set -e
- ./scripts/build.sh;
- travis_wait ./scripts/build.sh;
- ./test/test.sh unit.py
- ./test/test.sh component.py
# - ./test/test.sh container.py --tag $TAG
- ./test/test.sh container.py --tag $TAG
after_success:
- set -e;
......
{
"swagger": "2.0",
"info": {
"version": "",
"title": "Carts and items",
"description": "Carts and items resources",
"license": {
"name": "MIT",
"url": "http://github.com/gruntjs/grunt/blob/master/LICENSE-MIT"
}
},
"host": "carts",
"basePath": "/",
"securityDefinitions": {},
"schemes": [
"http"
],
"consumes": [
"application/json;charset=UTF-8",
"text/plain"
],
"produces": [
"application/json;charset=UTF-8",
"text/plain"
],
"paths": {
"/carts/{customerId}": {
"get": {
"description": "",
"operationId": "Get cart",
"produces": [
"application/json;charset=UTF-8"
],
"parameters": [
{
"name": "customerId",
"in": "path",
"required": true,
"type": "string",
"x-example": "1"
}
],
"responses": {
"200": {
"description": "Returns cart",
"schema": {
"$ref": "#/definitions/Getcartresponse"
}
}
}
},
"delete": {
"description": "",
"operationId": "Delete cart",
"produces": [
"application/json;charset=UTF-8"
],
"parameters": [
{
"name": "customerId",
"in": "path",
"required": true,
"type": "string",
"x-example": "1"
}
],
"responses": {
"202": {
"description": ""
}
}
}
},
"/carts/{customerId}/items": {
"post": {
"description": "",
"operationId": "Add an item to the cart",
"produces": [
"application/json;charset=UTF-8"
],
"parameters": [
{
"name": "customerId",
"in": "path",
"required": true,
"type": "string",
"x-example": "579f21ae98684924944651bf"
},
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/CartItem",
"example": {
"itemId":"819e1fbf-8b7e-4f6d-811f-693534916a8b",
"quantity": 20,
"unitPrice" : 99.0
}
}
}
],
"responses": {
"201": {
"description": "",
"schema": {
"$ref": "#/definitions/CartItem"
}
}
}
},
"patch": {
"description": "Update an item",
"operationId": "Update item",
"produces": [
"application/json;charset=UTF-8"
],
"parameters": [
{
"name": "customerId",
"in": "path",
"required": true,
"type": "string",
"x-example": "579f21ae98684924944651bf"
},
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"type": "object"
}
}
],
"responses": {
"200": {
"description": ""
}
}
}
},
"/carts/{customerId}/items/{itemId}": {
"delete": {
"description": "Delete cart item",
"operationId": "delete",
"parameters": [
{
"name": "itemId",
"in": "path",
"required": true,
"type": "string",
"x-example": "819e1fbf-8b7e-4f6d-811f-693534916a8b"
},
{
"name": "customerId",
"in": "path",
"required": true,
"type": "string",
"x-example": "579f21ae98684924944651bf"
}
],
"responses": {
"202": {
"description": "Delete response"
}
}
}
}
},
"definitions": {
"Getcartresponse": {
"title": "Get cart response",
"type": "object",
"properties": {
"customerId": {
"type": "string"
}
},
"required": [
"customerId"
]
},
"CartItem": {
"title": "Cart item",
"type": "object",
"properties": {
"itemId": {
"type": "string"
},
"quantity": {
"type": "integer"
},
"unitPrice": {
"type": "number"
}
},
"required": [
"itemId",
"quantity",
"unitPrice"
]
}
}
}
const hooks = require('hooks');
const {MongoClient} = require('mongodb');
const ObjectID = require('mongodb').ObjectID;
let db;
const address = [
{"_id":ObjectID("579f21ae98684924944651bd"),"_class":"works.weave.socks.accounts.entities.Address","number":"69","street":"Wilson Street","city":"Hartlepool","postcode":"TS26 8JU","country":"United Kingdom"},
{"_id":ObjectID("579f21ae98684924944651c0"),"_class":"works.weave.socks.accounts.entities.Address","number":"122","street":"Radstone WayNet","city":"Northampton","postcode":"NN2 8NT","country":"United Kingdom"},
{"_id":ObjectID("579f21ae98684924944651c3"),"_class":"works.weave.socks.accounts.entities.Address","number":"3","street":"Radstone Way","city":"Northampton","postcode":"NN2 8NT","country":"United Kingdom"}
];
const card = [
{"_id":ObjectID("579f21ae98684924944651be"),"_class":"works.weave.socks.accounts.entities.Card","longNum":"8575776807334952","expires":"08/19","ccv":"014"},
{"_id":ObjectID("579f21ae98684924944651c1"),"_class":"works.weave.socks.accounts.entities.Card","longNum":"8918468841895184","expires":"08/19","ccv":"597"},
{"_id":ObjectID("579f21ae98684924944651c4"),"_class":"works.weave.socks.accounts.entities.Card","longNum":"6426429851404909","expires":"08/19","ccv":"381"}
];
const cart = [
{"_id":ObjectID("579f21de98689ebf2bf1cd2f"),"_class":"works.weave.socks.cart.entities.Cart","customerId":"579f21ae98684924944651bf","items":[{"$ref":"item","$id":ObjectID("579f227698689ebf2bf1cd31")},{"$ref":"item","$id":ObjectID("579f22ac98689ebf2bf1cd32")}]},
{"_id":ObjectID("579f21e298689ebf2bf1cd30"),"_class":"works.weave.socks.cart.entities.Cart","customerId":"579f21ae98684924944651bfaa","items":[]}
];
const item = [
{"_id":ObjectID("579f227698689ebf2bf1cd31"),"_class":"works.weave.socks.cart.entities.Item","itemId":"819e1fbf-8b7e-4f6d-811f-693534916a8b","quantity":20,"unitPrice":99.0}
];
const customer = [
{"_id":"579f21ae98684924944651bf","_class":"works.weave.socks.accounts.entities.Customer","firstName":"Eve","lastName":"Berger","username":"Eve_Berger","addresses":[{"$ref":"address","$id":ObjectID("579f21ae98684924944651bd")}],"cards":[{"$ref":"card","$id":ObjectID("579f21ae98684924944651be")}]
},
{"_id":"579f21ae98684924944651c2","_class":"works.weave.socks.accounts.entities.Customer","firstName":"User","lastName":"Name","username":"user","addresses":[{"$ref":"address","$id":ObjectID("579f21ae98684924944651c0")}],"cards":[{"$ref":"card","$id":ObjectID("579f21ae98684924944651c1")}]},
{"_id":"579f21ae98684924944651c5","_class":"works.weave.socks.accounts.entities.Customer","firstName":"User1","lastName":"Name1","username":"user1","addresses":[{"$ref":"address","$id":ObjectID("579f21ae98684924944651c3")}],"cards":[{"$ref":"card","$id":ObjectID("579f21ae98684924944651c4")}]}
];
// Setup database connection before Dredd starts testing
hooks.beforeAll((transactions, done) => {
var MongoEndpoint = process.env.MONGO_ENDPOINT || 'mongodb://localhost:32769/data';
MongoClient.connect(MongoEndpoint, function(err, conn) {
if (err) {
console.error(err);
}
db = conn;
done(err);
});
});
hooks.beforeEach((transaction, done) => {
db.dropDatabase(function (err, res) {
var promisesToKeep = [
db.collection('customer').insertMany(customer),
db.collection('card').insertMany(card),
db.collection('cart').insertMany(cart),
db.collection('address').insertMany(address),
db.collection('item').insertMany(item)
];
Promise.all(promisesToKeep).then(function(vls) {
done();
}, function(vls) {
done();
});
})
});
hooks.before("/carts/{customerId}/items > POST", function(transaction, done) {
transaction.request.headers['Content-Type'] = 'application/json';
transaction.request.body = JSON.stringify(
{
"itemId":"819e1fbf-8b7e-4f6d-811f-693534916a8b",
"quantity": 20,
"unitPrice" : 99.0
}
);
done();
});
// TODO: Can't make POST and PUT work, skipping for now
// hooks.before("/carts/{customerId}/items > POST", function(transaction, done) {
// transaction.skip = true;
// done();
// });
hooks.before("/carts/{customerId}/items > PATCH", function(transaction, done) {
transaction.skip = true;
done();
});
......@@ -21,7 +21,7 @@ else
fi
CODE_DIR=$(cd $SCRIPT_DIR/..; pwd)
echo $CODE_DIR
$DOCKER_CMD run --rm -v $HOME/.m2:/root/.m2 -v $CODE_DIR:/usr/src/mymaven -w /usr/src/mymaven maven:3.2-jdk-8 mvn -DskipTests package
$DOCKER_CMD run --rm -v $HOME/.m2:/root/.m2 -v $CODE_DIR:/usr/src/mymaven -w /usr/src/mymaven maven:3.2-jdk-8 mvn -q -DskipTests package
cp $CODE_DIR/target/*.jar $CODE_DIR/docker/cart
......
import argparse
import sys
import unittest
from util.Api import Api
from time import sleep
from util.Api import Api
from util.Docker import Docker
from util.Dredd import Dredd
class CartContainerTest(unittest.TestCase):
TAG = "latest"
container_name = Docker().random_container_name('cart')
mongo_container_name = Docker().random_container_name('cart-db')
def __init__(self, methodName='runTest'):
super(CartContainerTest, self).__init__(methodName)
self.ip = ""
def setUp(self):
Docker().start_container(container_name=self.mongo_container_name, image="mongo", host="cart-db")
command = ['docker', 'run',
......@@ -34,20 +32,18 @@ class CartContainerTest(unittest.TestCase):
Docker().kill_and_remove(CartContainerTest.mongo_container_name)
def test_api_validated(self):
limit = 60
while Api().noResponse('http://' + self.ip + ':80/carts/579f21ae98684924944651bf'):
limit = 30
while Api().noResponse('http://' + self.ip + ':80/carts/'):
if limit == 0:
self.fail("Couldn't get the API running")
limit = limit - 1
sleep(1)
out = Dredd().test_against_endpoint("carts/carts.json", CartContainerTest.container_name, "http://cart/",
"mongodb://cart-db:27017/data", self.mongo_container_name)
out = Dredd().test_against_endpoint("cart", "http://cart/", links=[self.mongo_container_name, self.container_name], env=[("MONGO_ENDPOINT", "mongodb://cart-db:27017/data")])
self.assertGreater(out.find("0 failing"), -1)
self.assertGreater(out.find("0 errors"), -1)
print(out)
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--tag', default="latest", help='The tag of the image to use. (default: latest)')
......
......@@ -21,14 +21,14 @@ echo "Testing $1"
CODE_DIR=$(cd $SCRIPT_DIR/..; pwd)
echo "$@"
$DOCKER_CMD run \
--rm \
--name test \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $CODE_DIR:$CODE_DIR -w $CODE_DIR \
-e COVERALLS_TOKEN=$COVERALLS_TOKEN \
-e TRAVIS_JOB_ID=$TRAVIS_JOB_ID \
-e TRAVIS_BRANCH=$TRAVIS_BRANCH \
-e TRAVIS_PULL_REQUEST=$TRAVIS_PULL_REQUEST \
-e TRAVIS=$TRAVIS \
test-container \
sh -c export PYTHONPATH=\$PYTHONPATH:\$PWD/test ; python test/"$@"
--rm \
--name test \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $CODE_DIR:$CODE_DIR -w $CODE_DIR \
-e COVERALLS_TOKEN=$COVERALLS_TOKEN \
-e TRAVIS_JOB_ID=$TRAVIS_JOB_ID \
-e TRAVIS_BRANCH=$TRAVIS_BRANCH \
-e TRAVIS_PULL_REQUEST=$TRAVIS_PULL_REQUEST \
-e TRAVIS=$TRAVIS \
test-container \
sh -c "export PYTHONPATH=\$PYTHONPATH:\$PWD/test ; python test/$@"
import requests
class Api:
def noResponse(self, url):
try:
r = requests.get(url, timeout=5)
except requests.exceptions.ConnectionError:
return True
return r.status_code > 299
return False
import re
from random import random
from subprocess import Popen, PIPE
from random import random
# From http://blog.bordage.pro/avoid-docker-py/
class Docker:
......@@ -12,7 +11,7 @@ class Docker:
def random_container_name(self, prefix):
retstr = prefix + '-'
for i in range(5):
retstr += chr(int(round(random() * (122 - 97) + 97)))
retstr += chr(int(round(random() * (122-97) + 97)))
return retstr
def get_container_ip(self, ctr_name):
......
from util.Docker import Docker
from util.Api import Api
import os
import unittest
class Dredd:
image = 'weaveworksdemos/openapi'
image = 'weaveworksdemos/openapi:d18f10abf792775b21b1ac555c7c83dbec40119f'
container_name = ''
def test_against_endpoint(self, json_spec, endpoint_container_name, api_endpoint, mongo_endpoint_url,
mongo_container_name):
def test_against_endpoint(self, service, api_endpoint, links=[], env=[]):
self.container_name = Docker().random_container_name('openapi')
command = ['docker', 'run',
'-h', 'openapi',
'--name', self.container_name,
'--link', mongo_container_name,
'--link', endpoint_container_name,
'--env', "MONGO_ENDPOINT={0}".format(mongo_endpoint_url),
Dredd.image,
"/usr/src/app/{0}".format(json_spec),
api_endpoint,
"-f",
"/usr/src/app/hooks.js"
]
'-v', "{0}:{1}".format(os.getcwd() + "/api-spec/", "/tmp/specs/")]
if links != []:
[command.extend(["--link", x]) for x in links]
if env != []:
[command.extend(["--env", "{}={}".format(x[0], x[1])]) for x in env]
command.extend([Dredd.image,
"/tmp/specs/{0}.json".format(service),
api_endpoint,
"-f",
"/tmp/specs/hooks.js".format(service)])
out = Docker().execute(command)
Docker().kill_and_remove(self.container_name)
return out
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment