Skip to content

Commit c8e89d7

Browse files
Merge pull request #4 from monikakonieczna/Task-4-Create-API-Tests-For-GET-Multiple-Characters
Task 4: Create API Tests For GET Multiple Characters
2 parents 646acd0 + e4f1e19 commit c8e89d7

15 files changed

+362
-135
lines changed

src/helpers/validateAllCharactersHelper.ts renamed to src/helpers/allCharactersHelper.ts

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as path from "path";
33

44
// Function to load JSON data from the file
55
const loadJsonData = (fileName: string): any => {
6-
const filePath = path.join(__dirname, "../test_data/get__all_characters", fileName);
6+
const filePath = path.join(__dirname, "../test_data/get_all_characters", fileName);
77
const data = fs.readFileSync(filePath, "utf-8");
88
return JSON.parse(data);
99
};
@@ -16,44 +16,38 @@ const notFoundPage = loadJsonData("not_found_page.json");
1616

1717
/**
1818
* A helper function to validate the structure of the response data for existing character - Page 1
19-
* @param character
2019
*/
21-
export function validatePage1Structure(characters: Characters) {
22-
expect(characters).toEqual(validCharactersPage1);
20+
export function validatePage1Structure(page: Page) {
21+
expect(page).toEqual(validCharactersPage1);
2322
}
2423

2524
/**
2625
* A helper function to validate the structure of the response data for existing character - Page 2
27-
* @param character
2826
*/
29-
export function validatePage2Structure(characters: Characters) {
30-
expect(characters).toEqual(validCharactersPage2);
27+
export function validatePage2Structure(page: Page) {
28+
expect(page).toEqual(validCharactersPage2);
3129
}
3230

3331
/**
3432
* A helper function to validate the structure of the response data for existing character - Page 42
35-
* @param character
3633
*/
37-
export function validatePage42Structure(characters: Characters) {
38-
expect(characters).toEqual(validCharactersPage42);
34+
export function validatePage42Structure(page: Page) {
35+
expect(page).toEqual(validCharactersPage42);
3936
}
4037

4138
/**
4239
* A helper function to validate that the response body contains the expected character data
43-
* @param character
4440
*/
4541

46-
export function validatePaginationInfo(characters: Characters, count: number, pages: number, next: string | null, prev: string | null) {
47-
expect(characters.info.count).toEqual(count);
48-
expect(characters.info.pages).toEqual(pages);
49-
expect(characters.info.next).toEqual(next);
50-
expect(characters.info.prev).toEqual(prev);
51-
42+
export function validatePaginationInfo(page: Page, count: number, pages: number, next: string | null, prev: string | null) {
43+
expect(page.info.count).toEqual(count);
44+
expect(page.info.pages).toEqual(pages);
45+
expect(page.info.next).toEqual(next);
46+
expect(page.info.prev).toEqual(prev);
5247
}
5348

5449
/**
5550
* A helper function to verify the error response message for not existing page
56-
* @param character
5751
*/
5852
export function validateNotFoundErrorMessage(error: Error) {
5953
expect(error.message).toEqual(notFoundPage.message);
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import * as fs from "fs";
2+
import * as path from "path";
3+
4+
5+
// Function to load JSON data from the file
6+
const loadJsonData = (fileName: string): any => {
7+
const filePath = path.join(__dirname, "../test_data/get_multiple_characters", fileName);
8+
const data = fs.readFileSync(filePath, "utf-8");
9+
return JSON.parse(data);
10+
};
11+
12+
// Load test data
13+
const validTwoCharactersStructure = loadJsonData("valid_two_characters.json");
14+
const errorMessageCastFailed = loadJsonData("non_integer_character.json");
15+
const errorMessageBadArray = loadJsonData("non_integer_character_array.json");
16+
17+
export function validateThreeCharactersIds(
18+
characters: Characters,
19+
id1: number,
20+
id2: number,
21+
id3: number
22+
) {
23+
expect(characters[0].id).toEqual(id1);
24+
expect(characters[1].id).toEqual(id2);
25+
expect(characters[2].id).toEqual(id3);
26+
}
27+
28+
export function validateTwoCharactersIds(
29+
characters: Characters,
30+
id1: number,
31+
id2: number
32+
) {
33+
expect(characters[0].id).toEqual(id1);
34+
expect(characters[1].id).toEqual(id2);
35+
}
36+
37+
export function validateResponseStructure(characters: Characters){
38+
expect(characters).toEqual(validTwoCharactersStructure);
39+
}
40+
41+
export function validateErrorMessageForNonInteger(characters: Characters){
42+
expect(characters).toEqual(errorMessageCastFailed);
43+
}
44+
45+
export function validateErrorMessageForNonIntegerArray(characters: Characters){
46+
expect(characters).toEqual(errorMessageBadArray);
47+
}

src/interfaces/character.interface.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,16 @@ interface Character {
55
species: string;
66
type: string;
77
gender: string;
8-
origin: object;
9-
location: object;
8+
origin: {
9+
name: string;
10+
url: string;
11+
};
12+
location: {
13+
name: string;
14+
url: string;
15+
};
1016
image: string;
1117
episode: Array<string>;
1218
url: string;
1319
created: string;
14-
}
20+
}
Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1 @@
1-
interface Characters {
2-
info: {
3-
count: number;
4-
pages: number;
5-
next: string;
6-
prev: number;
7-
};
8-
results: [
9-
{
10-
id: number;
11-
name: string;
12-
status: string;
13-
species: string;
14-
type: string;
15-
gender: string;
16-
origin: {
17-
name: string;
18-
url: string;
19-
};
20-
location: {
21-
name: string;
22-
url: string;
23-
};
24-
image: string;
25-
episode: Array<string>;
26-
url: string;
27-
created: string;
28-
}
29-
];
30-
}
1+
type Characters = Character[];

src/interfaces/page.interface.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
interface Page {
2+
info: {
3+
count: number;
4+
pages: number;
5+
next: string;
6+
prev: number;
7+
};
8+
results: Character[];
9+
}

src/test_data/get_all_characters/valid_characters_page_1.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"info": {
33
"count": 826,
44
"pages": 42,
5-
"next": "https://rickandmortyapi.com/api/character?page=2",
5+
"next": "https://rickandmortyapi.com/api/character/?page=2",
66
"prev": null
77
},
88
"results": [
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"error": "Cast to Number failed for value \"NaN\" at path \"id\" for model \"Character\""
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"error": "Bad... bad array :/"
3+
}
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
[
2+
{
3+
"id": 1,
4+
"name": "Rick Sanchez",
5+
"status": "Alive",
6+
"species": "Human",
7+
"type": "",
8+
"gender": "Male",
9+
"origin": {
10+
"name": "Earth (C-137)",
11+
"url": "https://rickandmortyapi.com/api/location/1"
12+
},
13+
"location": {
14+
"name": "Citadel of Ricks",
15+
"url": "https://rickandmortyapi.com/api/location/3"
16+
},
17+
"image": "https://rickandmortyapi.com/api/character/avatar/1.jpeg",
18+
"episode": [
19+
"https://rickandmortyapi.com/api/episode/1",
20+
"https://rickandmortyapi.com/api/episode/2",
21+
"https://rickandmortyapi.com/api/episode/3",
22+
"https://rickandmortyapi.com/api/episode/4",
23+
"https://rickandmortyapi.com/api/episode/5",
24+
"https://rickandmortyapi.com/api/episode/6",
25+
"https://rickandmortyapi.com/api/episode/7",
26+
"https://rickandmortyapi.com/api/episode/8",
27+
"https://rickandmortyapi.com/api/episode/9",
28+
"https://rickandmortyapi.com/api/episode/10",
29+
"https://rickandmortyapi.com/api/episode/11",
30+
"https://rickandmortyapi.com/api/episode/12",
31+
"https://rickandmortyapi.com/api/episode/13",
32+
"https://rickandmortyapi.com/api/episode/14",
33+
"https://rickandmortyapi.com/api/episode/15",
34+
"https://rickandmortyapi.com/api/episode/16",
35+
"https://rickandmortyapi.com/api/episode/17",
36+
"https://rickandmortyapi.com/api/episode/18",
37+
"https://rickandmortyapi.com/api/episode/19",
38+
"https://rickandmortyapi.com/api/episode/20",
39+
"https://rickandmortyapi.com/api/episode/21",
40+
"https://rickandmortyapi.com/api/episode/22",
41+
"https://rickandmortyapi.com/api/episode/23",
42+
"https://rickandmortyapi.com/api/episode/24",
43+
"https://rickandmortyapi.com/api/episode/25",
44+
"https://rickandmortyapi.com/api/episode/26",
45+
"https://rickandmortyapi.com/api/episode/27",
46+
"https://rickandmortyapi.com/api/episode/28",
47+
"https://rickandmortyapi.com/api/episode/29",
48+
"https://rickandmortyapi.com/api/episode/30",
49+
"https://rickandmortyapi.com/api/episode/31",
50+
"https://rickandmortyapi.com/api/episode/32",
51+
"https://rickandmortyapi.com/api/episode/33",
52+
"https://rickandmortyapi.com/api/episode/34",
53+
"https://rickandmortyapi.com/api/episode/35",
54+
"https://rickandmortyapi.com/api/episode/36",
55+
"https://rickandmortyapi.com/api/episode/37",
56+
"https://rickandmortyapi.com/api/episode/38",
57+
"https://rickandmortyapi.com/api/episode/39",
58+
"https://rickandmortyapi.com/api/episode/40",
59+
"https://rickandmortyapi.com/api/episode/41",
60+
"https://rickandmortyapi.com/api/episode/42",
61+
"https://rickandmortyapi.com/api/episode/43",
62+
"https://rickandmortyapi.com/api/episode/44",
63+
"https://rickandmortyapi.com/api/episode/45",
64+
"https://rickandmortyapi.com/api/episode/46",
65+
"https://rickandmortyapi.com/api/episode/47",
66+
"https://rickandmortyapi.com/api/episode/48",
67+
"https://rickandmortyapi.com/api/episode/49",
68+
"https://rickandmortyapi.com/api/episode/50",
69+
"https://rickandmortyapi.com/api/episode/51"
70+
],
71+
"url": "https://rickandmortyapi.com/api/character/1",
72+
"created": "2017-11-04T18:48:46.250Z"
73+
},
74+
{
75+
"id": 2,
76+
"name": "Morty Smith",
77+
"status": "Alive",
78+
"species": "Human",
79+
"type": "",
80+
"gender": "Male",
81+
"origin": {
82+
"name": "unknown",
83+
"url": ""
84+
},
85+
"location": {
86+
"name": "Citadel of Ricks",
87+
"url": "https://rickandmortyapi.com/api/location/3"
88+
},
89+
"image": "https://rickandmortyapi.com/api/character/avatar/2.jpeg",
90+
"episode": [
91+
"https://rickandmortyapi.com/api/episode/1",
92+
"https://rickandmortyapi.com/api/episode/2",
93+
"https://rickandmortyapi.com/api/episode/3",
94+
"https://rickandmortyapi.com/api/episode/4",
95+
"https://rickandmortyapi.com/api/episode/5",
96+
"https://rickandmortyapi.com/api/episode/6",
97+
"https://rickandmortyapi.com/api/episode/7",
98+
"https://rickandmortyapi.com/api/episode/8",
99+
"https://rickandmortyapi.com/api/episode/9",
100+
"https://rickandmortyapi.com/api/episode/10",
101+
"https://rickandmortyapi.com/api/episode/11",
102+
"https://rickandmortyapi.com/api/episode/12",
103+
"https://rickandmortyapi.com/api/episode/13",
104+
"https://rickandmortyapi.com/api/episode/14",
105+
"https://rickandmortyapi.com/api/episode/15",
106+
"https://rickandmortyapi.com/api/episode/16",
107+
"https://rickandmortyapi.com/api/episode/17",
108+
"https://rickandmortyapi.com/api/episode/18",
109+
"https://rickandmortyapi.com/api/episode/19",
110+
"https://rickandmortyapi.com/api/episode/20",
111+
"https://rickandmortyapi.com/api/episode/21",
112+
"https://rickandmortyapi.com/api/episode/22",
113+
"https://rickandmortyapi.com/api/episode/23",
114+
"https://rickandmortyapi.com/api/episode/24",
115+
"https://rickandmortyapi.com/api/episode/25",
116+
"https://rickandmortyapi.com/api/episode/26",
117+
"https://rickandmortyapi.com/api/episode/27",
118+
"https://rickandmortyapi.com/api/episode/28",
119+
"https://rickandmortyapi.com/api/episode/29",
120+
"https://rickandmortyapi.com/api/episode/30",
121+
"https://rickandmortyapi.com/api/episode/31",
122+
"https://rickandmortyapi.com/api/episode/32",
123+
"https://rickandmortyapi.com/api/episode/33",
124+
"https://rickandmortyapi.com/api/episode/34",
125+
"https://rickandmortyapi.com/api/episode/35",
126+
"https://rickandmortyapi.com/api/episode/36",
127+
"https://rickandmortyapi.com/api/episode/37",
128+
"https://rickandmortyapi.com/api/episode/38",
129+
"https://rickandmortyapi.com/api/episode/39",
130+
"https://rickandmortyapi.com/api/episode/40",
131+
"https://rickandmortyapi.com/api/episode/41",
132+
"https://rickandmortyapi.com/api/episode/42",
133+
"https://rickandmortyapi.com/api/episode/43",
134+
"https://rickandmortyapi.com/api/episode/44",
135+
"https://rickandmortyapi.com/api/episode/45",
136+
"https://rickandmortyapi.com/api/episode/46",
137+
"https://rickandmortyapi.com/api/episode/47",
138+
"https://rickandmortyapi.com/api/episode/48",
139+
"https://rickandmortyapi.com/api/episode/49",
140+
"https://rickandmortyapi.com/api/episode/50",
141+
"https://rickandmortyapi.com/api/episode/51"
142+
],
143+
"url": "https://rickandmortyapi.com/api/character/2",
144+
"created": "2017-11-04T18:50:21.651Z"
145+
}
146+
]

0 commit comments

Comments
 (0)