Moved and renamed the starting and stopping scripts from the REST API tests to a common directory. This way the MaxCtrl tests can use the same scripts to start and stop MaxScale. Also moved the test configuration file into the `test/` directory and changed some of the default directory locations.
		
			
				
	
	
		
			440 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			440 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
var json_api_schema = {
 | 
						|
    "title": "JSON API Schema",
 | 
						|
    "description": "This is a schema for responses in the JSON API format. For more, see http://jsonapi.org",
 | 
						|
    "oneOf": [
 | 
						|
        {
 | 
						|
            "$ref": "#/definitions/success"
 | 
						|
        },
 | 
						|
        {
 | 
						|
            "$ref": "#/definitions/failure"
 | 
						|
        },
 | 
						|
        {
 | 
						|
            "$ref": "#/definitions/info"
 | 
						|
        }
 | 
						|
    ],
 | 
						|
    "definitions": {
 | 
						|
        "success": {
 | 
						|
            "type": "object",
 | 
						|
            "required": [
 | 
						|
                "data"
 | 
						|
            ],
 | 
						|
            "properties": {
 | 
						|
                "data": {
 | 
						|
                    "$ref": "#/definitions/data"
 | 
						|
                },
 | 
						|
                "included": {
 | 
						|
                    "description": "To reduce the number of HTTP requests, servers **MAY** allow responses that include related resources along with the requested primary resources. Such responses are called \"compound documents\".",
 | 
						|
                    "type": "array",
 | 
						|
                    "items": {
 | 
						|
                        "$ref": "#/definitions/resource"
 | 
						|
                    },
 | 
						|
                    "uniqueItems": true
 | 
						|
                },
 | 
						|
                "meta": {
 | 
						|
                    "$ref": "#/definitions/meta"
 | 
						|
                },
 | 
						|
                "links": {
 | 
						|
                    "description": "Link members related to the primary data.",
 | 
						|
                    "allOf": [
 | 
						|
                        {
 | 
						|
                            "$ref": "#/definitions/links"
 | 
						|
                        },
 | 
						|
                        {
 | 
						|
                            "$ref": "#/definitions/pagination"
 | 
						|
                        }
 | 
						|
                    ]
 | 
						|
                },
 | 
						|
                "jsonapi": {
 | 
						|
                    "$ref": "#/definitions/jsonapi"
 | 
						|
                }
 | 
						|
            },
 | 
						|
            "additionalProperties": false
 | 
						|
        },
 | 
						|
        "failure": {
 | 
						|
            "type": "object",
 | 
						|
            "required": [
 | 
						|
                "errors"
 | 
						|
            ],
 | 
						|
            "properties": {
 | 
						|
                "errors": {
 | 
						|
                    "type": "array",
 | 
						|
                    "items": {
 | 
						|
                        "$ref": "#/definitions/error"
 | 
						|
                    },
 | 
						|
                    "uniqueItems": true
 | 
						|
                },
 | 
						|
                "meta": {
 | 
						|
                    "$ref": "#/definitions/meta"
 | 
						|
                },
 | 
						|
                "jsonapi": {
 | 
						|
                    "$ref": "#/definitions/jsonapi"
 | 
						|
                },
 | 
						|
                "links": {
 | 
						|
                    "$ref": "#/definitions/links"
 | 
						|
                }
 | 
						|
            },
 | 
						|
            "additionalProperties": false
 | 
						|
        },
 | 
						|
        "info": {
 | 
						|
            "type": "object",
 | 
						|
            "required": [
 | 
						|
                "meta"
 | 
						|
            ],
 | 
						|
            "properties": {
 | 
						|
                "meta": {
 | 
						|
                    "$ref": "#/definitions/meta"
 | 
						|
                },
 | 
						|
                "links": {
 | 
						|
                    "$ref": "#/definitions/links"
 | 
						|
                },
 | 
						|
                "jsonapi": {
 | 
						|
                    "$ref": "#/definitions/jsonapi"
 | 
						|
                }
 | 
						|
            },
 | 
						|
            "additionalProperties": false
 | 
						|
        },
 | 
						|
        "meta": {
 | 
						|
            "description": "Non-standard meta-information that can not be represented as an attribute or relationship.",
 | 
						|
            "type": "object",
 | 
						|
            "additionalProperties": true
 | 
						|
        },
 | 
						|
        "data": {
 | 
						|
            "description": "The document's \"primary data\" is a representation of the resource or collection of resources targeted by a request.",
 | 
						|
            "oneOf": [
 | 
						|
                {
 | 
						|
                    "$ref": "#/definitions/resource"
 | 
						|
                },
 | 
						|
                {
 | 
						|
                    "description": "An array of resource objects, an array of resource identifier objects, or an empty array ([]), for requests that target resource collections.",
 | 
						|
                    "type": "array",
 | 
						|
                    "items": {
 | 
						|
                        "$ref": "#/definitions/resource"
 | 
						|
                    },
 | 
						|
                    "uniqueItems": true
 | 
						|
                },
 | 
						|
                {
 | 
						|
                    "description": "null if the request is one that might correspond to a single resource, but doesn't currently.",
 | 
						|
                    "type": "null"
 | 
						|
                }
 | 
						|
            ]
 | 
						|
        },
 | 
						|
        "resource": {
 | 
						|
            "description": "\"Resource objects\" appear in a JSON API document to represent resources.",
 | 
						|
            "type": "object",
 | 
						|
            "required": [
 | 
						|
                "type",
 | 
						|
                "id"
 | 
						|
            ],
 | 
						|
            "properties": {
 | 
						|
                "type": {
 | 
						|
                    "type": "string"
 | 
						|
                },
 | 
						|
                "id": {
 | 
						|
                    "type": "string"
 | 
						|
                },
 | 
						|
                "attributes": {
 | 
						|
                    "$ref": "#/definitions/attributes"
 | 
						|
                },
 | 
						|
                "relationships": {
 | 
						|
                    "$ref": "#/definitions/relationships"
 | 
						|
                },
 | 
						|
                "links": {
 | 
						|
                    "$ref": "#/definitions/links"
 | 
						|
                },
 | 
						|
                "meta": {
 | 
						|
                    "$ref": "#/definitions/meta"
 | 
						|
                }
 | 
						|
            },
 | 
						|
            "additionalProperties": false
 | 
						|
        },
 | 
						|
        "links": {
 | 
						|
            "description": "A resource object **MAY** contain references to other resource objects (\"relationships\"). Relationships may be to-one or to-many. Relationships can be specified by including a member in a resource's links object.",
 | 
						|
            "type": "object",
 | 
						|
            "properties": {
 | 
						|
                "self": {
 | 
						|
                    "description": "A `self` member, whose value is a URL for the relationship itself (a \"relationship URL\"). This URL allows the client to directly manipulate the relationship. For example, it would allow a client to remove an `author` from an `article` without deleting the people resource itself.",
 | 
						|
                    "type": "string",
 | 
						|
                    "format": "uri"
 | 
						|
                },
 | 
						|
                "related": {
 | 
						|
                    "$ref": "#/definitions/link"
 | 
						|
                }
 | 
						|
            },
 | 
						|
            "additionalProperties": true
 | 
						|
        },
 | 
						|
        "link": {
 | 
						|
            "description": "A link **MUST** be represented as either: a string containing the link's URL or a link object.",
 | 
						|
            "oneOf": [
 | 
						|
                {
 | 
						|
                    "description": "A string containing the link's URL.",
 | 
						|
                    "type": "string",
 | 
						|
                    "format": "uri"
 | 
						|
                },
 | 
						|
                {
 | 
						|
                    "type": "object",
 | 
						|
                    "required": [
 | 
						|
                        "href"
 | 
						|
                    ],
 | 
						|
                    "properties": {
 | 
						|
                        "href": {
 | 
						|
                            "description": "A string containing the link's URL.",
 | 
						|
                            "type": "string",
 | 
						|
                            "format": "uri"
 | 
						|
                        },
 | 
						|
                        "meta": {
 | 
						|
                            "$ref": "#/definitions/meta"
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            ]
 | 
						|
        },
 | 
						|
        "attributes": {
 | 
						|
            "description": "Members of the attributes object (\"attributes\") represent information about the resource object in which it's defined.",
 | 
						|
            "type": "object",
 | 
						|
            "patternProperties": {
 | 
						|
                "^(?!relationships$|links$)\\w[-\\w_]*$": {
 | 
						|
                    "description": "Attributes may contain any valid JSON value."
 | 
						|
                }
 | 
						|
            },
 | 
						|
            "additionalProperties": false
 | 
						|
        },
 | 
						|
        "relationships": {
 | 
						|
            "description": "Members of the relationships object (\"relationships\") represent references from the resource object in which it's defined to other resource objects.",
 | 
						|
            "type": "object",
 | 
						|
            "patternProperties": {
 | 
						|
                "^\\w[-\\w_]*$": {
 | 
						|
                    "properties": {
 | 
						|
                        "links": {
 | 
						|
                            "$ref": "#/definitions/links"
 | 
						|
                        },
 | 
						|
                        "data": {
 | 
						|
                            "description": "Member, whose value represents \"resource linkage\".",
 | 
						|
                            "oneOf": [
 | 
						|
                                {
 | 
						|
                                    "$ref": "#/definitions/relationshipToOne"
 | 
						|
                                },
 | 
						|
                                {
 | 
						|
                                    "$ref": "#/definitions/relationshipToMany"
 | 
						|
                                }
 | 
						|
                            ]
 | 
						|
                        },
 | 
						|
                        "meta": {
 | 
						|
                            "$ref": "#/definitions/meta"
 | 
						|
                        }
 | 
						|
                    },
 | 
						|
                    "anyOf": [
 | 
						|
                        {
 | 
						|
                            "required": [
 | 
						|
                                "data"
 | 
						|
                            ]
 | 
						|
                        },
 | 
						|
                        {
 | 
						|
                            "required": [
 | 
						|
                                "meta"
 | 
						|
                            ]
 | 
						|
                        },
 | 
						|
                        {
 | 
						|
                            "required": [
 | 
						|
                                "links"
 | 
						|
                            ]
 | 
						|
                        }
 | 
						|
                    ],
 | 
						|
                    "additionalProperties": false
 | 
						|
                }
 | 
						|
            },
 | 
						|
            "additionalProperties": false
 | 
						|
        },
 | 
						|
        "relationshipToOne": {
 | 
						|
            "description": "References to other resource objects in a to-one (\"relationship\"). Relationships can be specified by including a member in a resource's links object.",
 | 
						|
            "anyOf": [
 | 
						|
                {
 | 
						|
                    "$ref": "#/definitions/empty"
 | 
						|
                },
 | 
						|
                {
 | 
						|
                    "$ref": "#/definitions/linkage"
 | 
						|
                }
 | 
						|
            ]
 | 
						|
        },
 | 
						|
        "relationshipToMany": {
 | 
						|
            "description": "An array of objects each containing \"type\" and \"id\" members for to-many relationships.",
 | 
						|
            "type": "array",
 | 
						|
            "items": {
 | 
						|
                "$ref": "#/definitions/linkage"
 | 
						|
            },
 | 
						|
            "uniqueItems": true
 | 
						|
        },
 | 
						|
        "empty": {
 | 
						|
            "description": "Describes an empty to-one relationship.",
 | 
						|
            "type": "null"
 | 
						|
        },
 | 
						|
        "linkage": {
 | 
						|
            "description": "The \"type\" and \"id\" to non-empty members.",
 | 
						|
            "type": "object",
 | 
						|
            "required": [
 | 
						|
                "type",
 | 
						|
                "id"
 | 
						|
            ],
 | 
						|
            "properties": {
 | 
						|
                "type": {
 | 
						|
                    "type": "string"
 | 
						|
                },
 | 
						|
                "id": {
 | 
						|
                    "type": "string"
 | 
						|
                },
 | 
						|
                "meta": {
 | 
						|
                    "$ref": "#/definitions/meta"
 | 
						|
                }
 | 
						|
            },
 | 
						|
            "additionalProperties": false
 | 
						|
        },
 | 
						|
        "pagination": {
 | 
						|
            "type": "object",
 | 
						|
            "properties": {
 | 
						|
                "first": {
 | 
						|
                    "description": "The first page of data",
 | 
						|
                    "oneOf": [
 | 
						|
                        {
 | 
						|
                            "type": "string",
 | 
						|
                            "format": "uri"
 | 
						|
                        },
 | 
						|
                        {
 | 
						|
                            "type": "null"
 | 
						|
                        }
 | 
						|
                    ]
 | 
						|
                },
 | 
						|
                "last": {
 | 
						|
                    "description": "The last page of data",
 | 
						|
                    "oneOf": [
 | 
						|
                        {
 | 
						|
                            "type": "string",
 | 
						|
                            "format": "uri"
 | 
						|
                        },
 | 
						|
                        {
 | 
						|
                            "type": "null"
 | 
						|
                        }
 | 
						|
                    ]
 | 
						|
                },
 | 
						|
                "prev": {
 | 
						|
                    "description": "The previous page of data",
 | 
						|
                    "oneOf": [
 | 
						|
                        {
 | 
						|
                            "type": "string",
 | 
						|
                            "format": "uri"
 | 
						|
                        },
 | 
						|
                        {
 | 
						|
                            "type": "null"
 | 
						|
                        }
 | 
						|
                    ]
 | 
						|
                },
 | 
						|
                "next": {
 | 
						|
                    "description": "The next page of data",
 | 
						|
                    "oneOf": [
 | 
						|
                        {
 | 
						|
                            "type": "string",
 | 
						|
                            "format": "uri"
 | 
						|
                        },
 | 
						|
                        {
 | 
						|
                            "type": "null"
 | 
						|
                        }
 | 
						|
                    ]
 | 
						|
                }
 | 
						|
            }
 | 
						|
        },
 | 
						|
        "jsonapi": {
 | 
						|
            "description": "An object describing the server's implementation",
 | 
						|
            "type": "object",
 | 
						|
            "properties": {
 | 
						|
                "version": {
 | 
						|
                    "type": "string"
 | 
						|
                },
 | 
						|
                "meta": {
 | 
						|
                    "$ref": "#/definitions/meta"
 | 
						|
                }
 | 
						|
            },
 | 
						|
            "additionalProperties": false
 | 
						|
        },
 | 
						|
        "error": {
 | 
						|
            "type": "object",
 | 
						|
            "properties": {
 | 
						|
                "id": {
 | 
						|
                    "description": "A unique identifier for this particular occurrence of the problem.",
 | 
						|
                    "type": "string"
 | 
						|
                },
 | 
						|
                "links": {
 | 
						|
                    "$ref": "#/definitions/links"
 | 
						|
                },
 | 
						|
                "status": {
 | 
						|
                    "description": "The HTTP status code applicable to this problem, expressed as a string value.",
 | 
						|
                    "type": "string"
 | 
						|
                },
 | 
						|
                "code": {
 | 
						|
                    "description": "An application-specific error code, expressed as a string value.",
 | 
						|
                    "type": "string"
 | 
						|
                },
 | 
						|
                "title": {
 | 
						|
                    "description": "A short, human-readable summary of the problem. It **SHOULD NOT** change from occurrence to occurrence of the problem, except for purposes of localization.",
 | 
						|
                    "type": "string"
 | 
						|
                },
 | 
						|
                "detail": {
 | 
						|
                    "description": "A human-readable explanation specific to this occurrence of the problem.",
 | 
						|
                    "type": "string"
 | 
						|
                },
 | 
						|
                "source": {
 | 
						|
                    "type": "object",
 | 
						|
                    "properties": {
 | 
						|
                        "pointer": {
 | 
						|
                            "description": "A JSON Pointer [RFC6901] to the associated entity in the request document [e.g. \"/data\" for a primary data object, or \"/data/attributes/title\" for a specific attribute].",
 | 
						|
                            "type": "string"
 | 
						|
                        },
 | 
						|
                        "parameter": {
 | 
						|
                            "description": "A string indicating which query parameter caused the error.",
 | 
						|
                            "type": "string"
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                },
 | 
						|
                "meta": {
 | 
						|
                    "$ref": "#/definitions/meta"
 | 
						|
                }
 | 
						|
            },
 | 
						|
            "additionalProperties": false
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
function validate_json(data) {
 | 
						|
    return validate_func(JSON.parse(data))
 | 
						|
}
 | 
						|
 | 
						|
var child_process = require("child_process")
 | 
						|
 | 
						|
module.exports = function() {
 | 
						|
    this.fs = require("fs")
 | 
						|
    this.request = require("request-promise-native")
 | 
						|
    this.chai = require("chai")
 | 
						|
    this.assert = require("assert")
 | 
						|
    this.chaiAsPromised = require("chai-as-promised")
 | 
						|
    chai.use(chaiAsPromised)
 | 
						|
    this.should = chai.should()
 | 
						|
    this.expect = chai.expect
 | 
						|
    this.Ajv = require("ajv")
 | 
						|
    this.ajv = new Ajv({$data: true, allErrors: true, extendRefs: true, verbose: true})
 | 
						|
    this.validate_func = ajv.compile(json_api_schema)
 | 
						|
    this.validate = validate_json
 | 
						|
    this.host = "localhost:8989/v1"
 | 
						|
    this.base_url = "http://" + this.host
 | 
						|
    this.startMaxScale = function(done) {
 | 
						|
        child_process.execFile("./start_maxscale.sh", function(err, stdout, stderr) {
 | 
						|
            if (process.env.MAXSCALE_DIR == null) {
 | 
						|
                throw new Error("MAXSCALE_DIR is not set");
 | 
						|
            }
 | 
						|
 | 
						|
            done()
 | 
						|
        })
 | 
						|
    };
 | 
						|
    this.stopMaxScale = function(done) {
 | 
						|
        child_process.execFile("./stop_maxscale.sh", function(err, stdout, stderr) {
 | 
						|
            done()
 | 
						|
        })
 | 
						|
    };
 | 
						|
}
 |