When it comes to API testing schema validation is one the most important part. Using karate you can easily perform your scheme validation.
In this post I will validate the GitHub api which will fetch an requested API from the authenticated User and will validate the schema of the same.
First I will call the getRepo feature and store the response in a variable.

Now we will verify the schema of the response. You can do it in multiple ways. You need to first create your schema from your response.In my example response below I have a Owner Json object for which I have created a separate schema json file
{
"stargazers_count": 0,
"pushed_at": "2020-05-19T18:12:06Z",
"owner": {
"gists_url": "https://api.github.com/users/QAtechtools/gists{/gist_id}",
"repos_url": "https://api.github.com/users/QAtechtools/repos",
"following_url": "https://api.github.com/users/QAtechtools/following{/other_user}",
"starred_url": "https://api.github.com/users/QAtechtools/starred{/owner}{/repo}",
"login": "QAtechtools",
"followers_url": "https://api.github.com/users/QAtechtools/followers",
"type": "User",
"url": "https://api.github.com/users/QAtechtools",
"subscriptions_url": "https://api.github.com/users/QAtechtools/subscriptions",
"received_events_url": "https://api.github.com/users/QAtechtools/received_events",
"avatar_url": "https://avatars3.githubusercontent.com/u/65459490?v=4",
"events_url": "https://api.github.com/users/QAtechtools/events{/privacy}",
"html_url": "https://github.com/QAtechtools",
"site_admin": false,
"id": 65459490,
"gravatar_id": "",
"node_id": "MDQ6VXNlcjY1NDU5NDkw",
"organizations_url": "https://api.github.com/users/QAtechtools/orgs"
}
}
I have saved the schema of in the ownerSchema.json. and I will use this schema to validate the response.
{gists_url:'#string',repos_url:'#string',following_url:'#string',starred_url:'#string',login:'#string',followers_url:'#string',type:'#string',url: '#string',subscriptions_url:'#string',received_events_url:'#string',avatar_url:'#string',events_url:'#string',html_url:'#string',site_admin:'#string',id:'#number',gravatar_id:'#string',node_id:'#string',organizations_url:'#string'}
To understand more about the schema creation in Karate look at the below image.

Now the Validation code will look like something below.

Feature: Creating a repo in GIT using karate
Background: Set the baseURL and call the authentication file
* url baseURL
* header Authorization = call read('basic-auth.js')
Scenario: creating a repo and verifying the response
# change the endpoint to GET
* path '/user/repos'
* method get
#verify the status code
* status 200
* def allRepo = response
* print allRepo
#match the response with the name that was generated
* def filterandfind = function(x){ return x.name == 'yDCbu' }
#using karate.filter to find out repo
* def myRepo = karate.filter(allRepo, filterandfind)
* def myRepoName = $myRepo..name
#once found we will get the report details
* path '/repos/'+username+'/'+myRepoName[0]
* method get
* print myRepoName
#verify the status code
* print response
* status 200
#match the response with the name that was generated
* match response.name == myRepoName[0]
* def nameSchema = { name: '#string'}
* def ownerSchema = read('getRepoOwnerSchema.json')
* def finalSchema = { "owner" : '#(ownerSchema)' }
#Validate the owner part
* match response contains any '#(finalSchema)'
#alidating only the name
* match response contains nameSchema