Skip to content

Commit 0505a79

Browse files
committed
chore: updates test to better reflect requirements
1 parent fae9353 commit 0505a79

File tree

3 files changed

+55
-26
lines changed

3 files changed

+55
-26
lines changed

lesson_10/libraries/src/lesson10.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,14 @@ describe('Lesson10Test', () => {
6262
}
6363
const items = await loader.loadData();
6464
expect(items.filter((i) => i.getCredits().length).length).toBe(100);
65+
66+
// Every item that has credits should have the right credits.
67+
const itemsWithCredits = items.filter((i) => i.getCredits().length);
68+
expect(
69+
itemsWithCredits.every((i) =>
70+
i.getCredits().every((c) => c.getMediaItemId() === i.getId()),
71+
),
72+
).toBe(true);
6573
}
6674
});
6775
});
Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
import { Role } from './role.js';
22

33
export class Credit {
4-
mediaItemId: string;
5-
name: string;
6-
role: Role;
4+
private mediaItemId: string;
5+
private name: string;
6+
private role: Role;
77

88
constructor(mediaItemId: string, name: string, role: Role) {
99
this.mediaItemId = mediaItemId;
1010
this.name = name;
1111
this.role = role;
1212
}
13+
14+
getMediaItemId(): string {
15+
return this.mediaItemId;
16+
}
17+
18+
getName(): string {
19+
return this.name;
20+
}
21+
22+
getRole(): Role {
23+
return this.role;
24+
}
1325
}

lesson_10/libraries/src/models/media_collection.ts

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,49 +19,58 @@ export class MediaCollection {
1919
}
2020
const title = criteria.title;
2121
if (title) {
22-
return new Set(items.filter((item) => item.getTitle().includes(title)));
22+
return this.searchByTitle(title);
2323
}
2424
if (criteria.releaseYear) {
25-
return new Set(
26-
items.filter((item) => item.getReleaseYear() === criteria.releaseYear),
27-
);
25+
return this.searchByReleaseYear(criteria.releaseYear);
2826
}
2927
if (criteria.type) {
30-
return new Set(items.filter((item) => item.getType() === criteria.type));
28+
return this.searchByType(criteria.type);
3129
}
3230
if (criteria.creditName) {
33-
return new Set(
34-
items.filter((item) =>
35-
[...item.getCredits()].some(
36-
(credit) => credit.name === criteria.creditName,
37-
),
38-
),
39-
);
31+
return this.searchByCreditName(criteria.creditName);
4032
}
4133
return new Set(items);
4234
}
4335

44-
searchByTitle(title: string): MediaItem[] {
45-
return [...this.items.values()].filter((item) =>
46-
item.getTitle().includes(title),
36+
searchByTitle(title: string): ReadonlySet<MediaItem> {
37+
return new Set(
38+
[...this.items.values()].filter((item) =>
39+
item
40+
.getTitle()
41+
.toLowerCase()
42+
.includes(title?.toLowerCase() ?? ''),
43+
),
4744
);
4845
}
4946

50-
searchByReleaseYear(releaseYear: number): MediaItem[] {
51-
return [...this.items.values()].filter(
52-
(item) => item.getReleaseYear() === releaseYear,
47+
searchByReleaseYear(releaseYear: number): ReadonlySet<MediaItem> {
48+
return new Set(
49+
[...this.items.values()].filter(
50+
(item) => item.getReleaseYear() === releaseYear,
51+
),
5352
);
5453
}
5554

56-
searchByType(type: string): MediaItem[] {
57-
return [...this.items.values()].filter((item) => item.getType() === type);
55+
searchByType(type: string): ReadonlySet<MediaItem> {
56+
return new Set(
57+
[...this.items.values()].filter((item) => item.getType() === type),
58+
);
5859
}
5960

60-
searchByCreditName(name: string): MediaItem[] {
61-
return [...this.items.values()].filter((item) =>
62-
[...item.getCredits()].some((credit) => credit.name === name),
61+
searchByCreditName(name: string): ReadonlySet<MediaItem> {
62+
return new Set(
63+
[...this.items.values()].filter((item) =>
64+
item.getCredits().some((credit) =>
65+
credit
66+
.getName()
67+
.toLowerCase()
68+
.includes(name?.toLowerCase() ?? ''),
69+
),
70+
),
6371
);
6472
}
73+
6574
getInfo() {
6675
return {
6776
getItems: () => [...this.items] as readonly [string, MediaItem][],

0 commit comments

Comments
 (0)