Skip to content

Commit 8e3a7ba

Browse files
committed
chore: adds proper tests
1 parent b145aba commit 8e3a7ba

File tree

5 files changed

+102
-6
lines changed

5 files changed

+102
-6
lines changed

lesson_10/libraries/package-lock.json

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

lesson_10/libraries/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"devDependencies": {
2020
"@alfonso-presa/soft-assert": "^0.6.0",
2121
"@eslint/js": "^9.11.1",
22+
"@nestjs/testing": "^10.4.4",
2223
"@stylistic/eslint-plugin": "^2.8.0",
2324
"@types/eslint__js": "^8.42.3",
2425
"@types/jest": "^29.5.13",
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
import { beforeAll, describe, expect, it } from '@jest/globals';
2+
import { Test, TestingModule } from '@nestjs/testing';
3+
import { AppModule } from './app.module.js';
4+
import { Loader } from './loaders/loader.js';
5+
import { Loaders } from './loaders/loaders.module.js';
6+
7+
describe('Lesson10Test', () => {
8+
let moduleFixture: TestingModule;
9+
let loaders: Loader[];
10+
11+
beforeAll(async () => {
12+
moduleFixture = await Test.createTestingModule({
13+
imports: [AppModule],
14+
}).compile();
15+
16+
loaders = moduleFixture.get(Loaders);
17+
});
18+
19+
it('loads loaders that load all items', async () => {
20+
for (const loader of loaders) {
21+
const items = await loader.loadData();
22+
expect(items.length).toBe(200);
23+
}
24+
});
25+
26+
it('loads all properties correctly', async () => {
27+
for (const loader of loaders) {
28+
const items = await loader.loadData();
29+
30+
const itemsByType = items.reduce((acc, item) => {
31+
const count = acc.get(item.getType()) || 0;
32+
acc.set(item.getType(), count + 1);
33+
return acc;
34+
}, new Map());
35+
36+
expect(itemsByType.get('movie')).toBe(68);
37+
expect(itemsByType.get('tv_show')).toBe(66);
38+
expect(itemsByType.get('documentary')).toBe(66);
39+
40+
expect(items.every((i) => i.getId() !== undefined)).toBe(true);
41+
expect(items.every((i) => i.getReleaseYear() !== undefined)).toBe(true);
42+
expect(items.every((i) => i.getTitle() !== undefined)).toBe(true);
43+
expect(items.every((i) => i.getType() !== undefined)).toBe(true);
44+
}
45+
});
46+
47+
const maybeIt = process.env.LOADER_NAME ? it : it.skip;
48+
49+
maybeIt('loads credits correctly', async () => {
50+
for (const loader of loaders) {
51+
if (loader.getLoaderName() !== process.env.LOADER_NAME) {
52+
continue;
53+
}
54+
const items = await loader.loadData();
55+
expect(items.filter((i) => i.getCredits().length).length).toBe(100);
56+
}
57+
});
58+
});

lesson_10/libraries/src/loaders/anthony_mays_loader.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import csv from 'csv-parser';
12
import fs from 'fs';
23
import { Credit, MediaItem } from '../models/index.js';
34
import { Loader } from './loader.js';
@@ -19,14 +20,17 @@ export class AnthonyMaysLoader implements Loader {
1920
}
2021

2122
async loadMediaItems(): Promise<MediaItem[]> {
23+
// TODO: Implement this method.
2224
return [];
2325
}
2426

2527
async loadCredits(): Promise<Credit[]> {
2628
const credits = [];
27-
const readable = fs.createReadStream('data/credits.csv');
29+
const readable = fs
30+
.createReadStream('data/credits.csv', 'utf-8')
31+
.pipe(csv());
2832
for await (const row of readable) {
29-
const [, mediaItemId, role, name] = row.split(',');
33+
const { media_item_id: mediaItemId, role, name } = row;
3034
credits.push({ mediaItemId, name, role });
3135
}
3236
return credits;

lesson_10/libraries/src/models/media_item.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export class MediaItem {
55
private readonly id: string;
66
private readonly title: string;
77
private readonly releaseYear: number;
8-
private readonly credits: Iterable<Credit>;
8+
private readonly credits: Credit[];
99
private readonly type: MediaType;
1010

1111
constructor(
@@ -19,7 +19,7 @@ export class MediaItem {
1919
this.title = title;
2020
this.type = mediaType;
2121
this.releaseYear = releaseYear;
22-
this.credits = credits;
22+
this.credits = [...credits];
2323
}
2424

2525
getId(): string {
@@ -34,8 +34,12 @@ export class MediaItem {
3434
return this.releaseYear;
3535
}
3636

37-
getCredits(): Iterable<Credit> {
38-
return this.credits;
37+
getCredits(): readonly Credit[] {
38+
return [...this.credits];
39+
}
40+
41+
addCredit(credit: Credit): void {
42+
this.credits.push(credit);
3943
}
4044

4145
getType(): MediaType {

0 commit comments

Comments
 (0)