3

tv4.validate will always return true. No matter if schema is valid JSON or even just dummy string. I browse stackoverflow for related issues and banUnknownProperties does not help me

As i told i even tried to change schema variable to "dummy" and tv4 still does not find error. That`s my first post on stackoverflow. Sorry if my question not clear.

Valid response will be as following

[
  {
    "dayOfWeek": "sunday",
    "openTime": "10:00:00",
    "closeTime": "14:00:00"
  },
  {
    "dayOfWeek": "monday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  },
  {
    "dayOfWeek": "tuesday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  },
  {
    "dayOfWeek": "wednesday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  },
  {
    "dayOfWeek": "thursday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  },
  {
    "dayOfWeek": "friday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  },
  {
    "dayOfWeek": "saturday",
    "openTime": "7:00:00",
    "closeTime": "19:00:00"
  }
]

I got my schema variable using https://jsonschema.net/ which was suggested by multiple threads. You can paste valid response and infer this JSON to SChema. I`m not going to provide my schema here to save space.

Here is my test code:

var data = JSON.parse(responseBody);
var schema =pm.variables.get("getHoursSchema"); // copy paste schema from https://jsonschema.net/ and assigned to 'getHoursSchema' environment variable

tests["Valid 'Get business hours' schema"] = tv4.validate(data, schema, false, true);  
console.log("Schema error description, if any:" + tv4.error);

Actual response is :

{
    "error": {
        "name": "JsonWebTokenError",
        "message": "jwt malformed"
    }
}

And tv4 does not see any errors here

2 Answers2

1

Postman Variables are stored as strings. TV4 expects an Object.

So just try to wrap a JSON.parse over your pm.variables.get:

var schema = JSON.parse(pm.variables.get("getHoursSchema")); 

With this change, i've got a schema validation error as expected.

DieGraueEminenz
  • 830
  • 2
  • 8
  • 18
0

@DieGraueEminenz's suggestion could be helpful, but I think there might also be something else going on there, I'm curious how you could get a reference to "JsonWebTokenError" with what you're doing, you should investigate that.

But regarding your schema problem, lets remove a few unknowns by using the following code in either the pre-request or test scripts of a dummy request (eg GET google.com)

var data = [
  {
    "dayOfWeek": "sundayX",
    "openTime": "10:00:00",
    "closeTime": "14:00:00"
  },
  {
    "dayOfWeek": "monday",
    "openTime": "9:00:00",
    "closeTime": "16:00:00"
  }
];

const schema = {
  "definitions": {},
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "array",
  "items": {
    "type": "object",
    "required": [ "dayOfWeek", "openTime", "closeTime" ],
    "properties": {
      "dayOfWeek":  { "enum": [ "sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday",  ] },
      "openTime": { "type": "string", "pattern": "^\\d+:\\d\\d:\\d\\d$" },
      "closeTime": { "type": "string", "pattern": "^\\d+:\\d\\d:\\d\\d$" },
    }
  }
};

const result = tv4.validateResult(data, schema);  
console.log("Schema result:", result);

I reworked the schema you get from https://jsonschema.net/, (which actually only checks that you've got strings, nothing further) The enum above for dayOfWeek does a better check, the times values now need to be [n]n:nn:nn, and I removed a bunch of extra bits you don't need.

Also I'd use the tv4.validateResult(...) method because it gives you a lot more info on the errors.

The above example output is

postman console

to pick out the intentional error in data's first item.

Once you've got that going start connecting the data through from your response, and if you need to share the schema with other requests save it to the globals with

pm.globals.set("schemaJSON",JSON.stringify(schema));

and fetch it as follows

const schemaJSON = pm.globals.has("schemaJSON") && pm.globals.get("schemaJSON");
const schema = schemaJSON && JSON.parse(schemaJSON);
  • That`s is a very good explanation and your reworked schema test my request much better then testing just a string type. I think this answer worth lots of upvotes. I didn`t know "enum" and "pattern" before and think it will be valuable for everyone to look at your answer. But i`m going to accept @DieGraueEminenz answer since i think it will be helpful for community. He gave easy and quick solution to my problem. JsonWebToken error is intentional. I should have mention it, sorry. – Denys Moroz May 20 '19 at 19:49
  • I tried the same but, inside the 'items' tag elements are not validating. – Vineesh TP Dec 03 '21 at 07:17