Skip to content

Commit ee34596

Browse files
Merge pull request #5 from monikakonieczna/Task-5-Create-API-Tests-For-Filtering-Characters
Adding API Tests for Filtering Characters.
2 parents c8e89d7 + 49d1652 commit ee34596

File tree

7 files changed

+185
-6
lines changed

7 files changed

+185
-6
lines changed

package-lock.json

Lines changed: 15 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
"ts-node": "^10.9.2"
1717
},
1818
"dependencies": {
19+
"@types/chance": "^1.1.6",
20+
"chance": "^1.1.12",
1921
"dotenv": "^16.4.5"
2022
}
2123
}

src/helpers/dataGenerator.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import Chance from "chance";
2+
3+
const chance = new Chance();
4+
5+
export const generateRandomAnimal = (): string => {
6+
return chance.animal();
7+
};
8+
9+
export const generateRandomString = (length: number = 10): string => {
10+
return chance.string({ length });
11+
};
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import * as fs from "fs";
2+
import * as path from "path";
3+
4+
// Function to load JSON data from the file
5+
const loadJsonData = (fileName: string): any => {
6+
const filePath = path.join(
7+
__dirname,
8+
"../test_data/filter_characters",
9+
fileName
10+
);
11+
const data = fs.readFileSync(filePath, "utf-8");
12+
return JSON.parse(data);
13+
};
14+
15+
// Load test data
16+
const nonexistingCharacter = loadJsonData("not_existing_character.json");
17+
18+
/**
19+
* A helper function to verify the error response message for non-existing character
20+
* @param character
21+
*/
22+
export function validateNonExistingCaharcterErrorMessage(error: Error) {
23+
expect(error.message).toEqual(nonexistingCharacter.message);
24+
}

src/helpers/makeRequest.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import request, { Response } from "supertest";
2-
import { App } from "supertest/types";
32
/**
43
* A helper function to make HTTP requests, which can be used across different tests.
54
* @param method
@@ -14,17 +13,19 @@ export async function makeRequest(
1413
body?: any,
1514
headers?: Record<string, string>
1615
): Promise<Response> {
17-
let req = request(url)[method]("/");
16+
// Call the method with the path (which is the url in this case)
17+
let req = request("")[method](url);
1818

19+
// Set headers if provided
1920
if (headers) {
2021
Object.keys(headers).forEach((key) => {
2122
req = req.set(key, headers[key]);
2223
});
2324
}
2425

26+
// Add body if provided
2527
if (body) {
2628
req = req.send(body);
2729
}
28-
2930
return req;
3031
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"error": "There is nothing here"
3+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
import request, { Response } from "supertest";
2+
import { API_KEY } from "../../../config";
3+
import { assertStatusCode } from "../../../helpers/assertionsHelper";
4+
import { makeRequest } from "../../../helpers/makeRequest";
5+
import { validateNonExistingCaharcterErrorMessage } from "../../../helpers/filterCharactersHelper";
6+
import { validatePage1Structure } from "../../../helpers/allCharactersHelper";
7+
import { generateRandomString } from "../../../helpers/dataGenerator";
8+
9+
const BASE_URL = "https://rickandmortyapi.com/api/character";
10+
const randomString = generateRandomString();
11+
console.log(randomString);
12+
13+
/**
14+
* Tests - Rick and Morty API - Filter Characters by name
15+
* @group filter_characters
16+
*/
17+
describe.each([["Rick", 200]])(
18+
"Rick and Morty API - Filter Characters by name",
19+
(name, statusCode) => {
20+
it("should filter characters by name", async () => {
21+
const response = await makeRequest("get", `${BASE_URL}/?name=${name}`);
22+
assertStatusCode(response, statusCode);
23+
response.body.results.forEach((character: Character) => {
24+
expect(character.name).toContain(`${name}`);
25+
});
26+
});
27+
}
28+
);
29+
30+
/**
31+
* Tests - Rick and Morty API - Filter Characters by status
32+
* @group filter_characters
33+
*/
34+
describe.each([["Alive", 200]])(
35+
"Rick and Morty API - Filter Characters by status",
36+
(status, statusCode) => {
37+
it("should filter characters by status", async () => {
38+
const response = await makeRequest(
39+
"get",
40+
`${BASE_URL}/?status=${status}`
41+
);
42+
assertStatusCode(response, statusCode);
43+
response.body.results.forEach((character: any) => {
44+
expect(character.status).toBe(`${status}`);
45+
});
46+
});
47+
}
48+
);
49+
50+
/**
51+
* Tests - Rick and Morty API - Filter Characters by species
52+
* @group filter_characters
53+
*/
54+
describe.each([["Human", 200]])(
55+
"Rick and Morty API - Filter Characters by species",
56+
(species, statusCode) => {
57+
it("should filter characters by species", async () => {
58+
const response = await makeRequest(
59+
"get",
60+
`${BASE_URL}/?species=${species}`
61+
);
62+
assertStatusCode(response, statusCode);
63+
response.body.results.forEach((character: any) => {
64+
expect(character.species).toBe(`${species}`);
65+
});
66+
});
67+
}
68+
);
69+
70+
/**
71+
* Tests - Rick and Morty API - Filter Characters by gender
72+
* @group filter_characters
73+
*/
74+
describe.each([["Male", 200]])(
75+
"Rick and Morty API - Filter Characters by gender",
76+
(gender, statusCode) => {
77+
it("should filter characters by gender", async () => {
78+
const response = await makeRequest(
79+
"get",
80+
`${BASE_URL}/?gender=${gender}`
81+
);
82+
assertStatusCode(response, statusCode);
83+
response.body.results.forEach((character: any) => {
84+
expect(character.gender).toBe(`${gender}`);
85+
});
86+
});
87+
}
88+
);
89+
90+
/**
91+
* Tests - Rick and Morty API - Negative Test Cases - Filter Characters by non-existing filter value
92+
* @group filter_characters
93+
*/
94+
describe.each([
95+
["name", "Male", 404],
96+
["status", "Male", 404],
97+
["species", "Male", 404],
98+
["gender", "halo", 404],
99+
])(
100+
"Rick and Morty API - Filter Characters by non-existing filter value",
101+
(filter, filter_value, statusCode) => {
102+
it("should filter characters by gender", async () => {
103+
const response = await makeRequest(
104+
"get",
105+
`${BASE_URL}/?${filter}=${filter_value}`
106+
);
107+
assertStatusCode(response, statusCode);
108+
validateNonExistingCaharcterErrorMessage(response.body);
109+
});
110+
}
111+
);
112+
113+
/**
114+
* Tests - Rick and Morty API - Filter Characters by non-existing filters
115+
* @group filter_characters
116+
*/
117+
describe("Rick and Morty API - Filter Characters by non-existing filters", () => {
118+
it("ignore unknown filters and return the first page", async () => {
119+
const response = await makeRequest(
120+
"get",
121+
`${BASE_URL}/?${randomString}=${randomString}`
122+
);
123+
assertStatusCode(response, 200);
124+
validatePage1Structure(response.body);
125+
});
126+
});

0 commit comments

Comments
 (0)