Skip to content

Commit 96abdcd

Browse files
authored
chore: updates test to better reflect requirements (#332)
* chore: updates test to better reflect requirements * chore: refactors media collection class
1 parent fae9353 commit 96abdcd

File tree

3 files changed

+60
-36
lines changed

3 files changed

+60
-36
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: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,55 +13,59 @@ export class MediaCollection {
1313
}
1414

1515
search(criteria?: SearchCriteria): ReadonlySet<MediaItem> {
16-
const items = [...this.items.values()];
17-
if (!criteria) {
18-
return new Set(items);
16+
if (criteria?.title) {
17+
return this.searchByTitle(criteria.title);
1918
}
20-
const title = criteria.title;
21-
if (title) {
22-
return new Set(items.filter((item) => item.getTitle().includes(title)));
19+
if (criteria?.releaseYear) {
20+
return this.searchByReleaseYear(criteria.releaseYear);
2321
}
24-
if (criteria.releaseYear) {
25-
return new Set(
26-
items.filter((item) => item.getReleaseYear() === criteria.releaseYear),
27-
);
22+
if (criteria?.type) {
23+
return this.searchByType(criteria.type);
2824
}
29-
if (criteria.type) {
30-
return new Set(items.filter((item) => item.getType() === criteria.type));
25+
if (criteria?.creditName) {
26+
return this.searchByCreditName(criteria.creditName);
3127
}
32-
if (criteria.creditName) {
33-
return new Set(
34-
items.filter((item) =>
35-
[...item.getCredits()].some(
36-
(credit) => credit.name === criteria.creditName,
37-
),
38-
),
39-
);
40-
}
41-
return new Set(items);
28+
return new Set(this.getItems());
4229
}
4330

44-
searchByTitle(title: string): MediaItem[] {
45-
return [...this.items.values()].filter((item) =>
46-
item.getTitle().includes(title),
31+
searchByTitle(title: string): ReadonlySet<MediaItem> {
32+
return new Set(
33+
this.getItems().filter((item) =>
34+
item
35+
.getTitle()
36+
.toLowerCase()
37+
.includes(title?.toLowerCase() ?? ''),
38+
),
4739
);
4840
}
4941

50-
searchByReleaseYear(releaseYear: number): MediaItem[] {
51-
return [...this.items.values()].filter(
52-
(item) => item.getReleaseYear() === releaseYear,
42+
searchByReleaseYear(releaseYear: number): ReadonlySet<MediaItem> {
43+
return new Set(
44+
this.getItems().filter((item) => item.getReleaseYear() === releaseYear),
5345
);
5446
}
5547

56-
searchByType(type: string): MediaItem[] {
57-
return [...this.items.values()].filter((item) => item.getType() === type);
48+
searchByType(type: string): ReadonlySet<MediaItem> {
49+
return new Set(this.getItems().filter((item) => item.getType() === type));
5850
}
5951

60-
searchByCreditName(name: string): MediaItem[] {
61-
return [...this.items.values()].filter((item) =>
62-
[...item.getCredits()].some((credit) => credit.name === name),
52+
searchByCreditName(name: string): ReadonlySet<MediaItem> {
53+
return new Set(
54+
this.getItems().filter((item) =>
55+
item.getCredits().some((credit) =>
56+
credit
57+
.getName()
58+
.toLowerCase()
59+
.includes(name?.toLowerCase() ?? ''),
60+
),
61+
),
6362
);
6463
}
64+
65+
private getItems(): readonly MediaItem[] {
66+
return [...this.items.values()];
67+
}
68+
6569
getInfo() {
6670
return {
6771
getItems: () => [...this.items] as readonly [string, MediaItem][],

0 commit comments

Comments
 (0)