Skip to content

Commit

Permalink
chore: updates test to better reflect requirements (code-differently#332
Browse files Browse the repository at this point in the history
)

* chore: updates test to better reflect requirements

* chore: refactors media collection class
  • Loading branch information
anthonydmays authored Oct 17, 2024
1 parent fae9353 commit 96abdcd
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 36 deletions.
8 changes: 8 additions & 0 deletions lesson_10/libraries/src/lesson10.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@ describe('Lesson10Test', () => {
}
const items = await loader.loadData();
expect(items.filter((i) => i.getCredits().length).length).toBe(100);

// Every item that has credits should have the right credits.
const itemsWithCredits = items.filter((i) => i.getCredits().length);
expect(
itemsWithCredits.every((i) =>
i.getCredits().every((c) => c.getMediaItemId() === i.getId()),
),
).toBe(true);
}
});
});
18 changes: 15 additions & 3 deletions lesson_10/libraries/src/models/credit.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
import { Role } from './role.js';

export class Credit {
mediaItemId: string;
name: string;
role: Role;
private mediaItemId: string;
private name: string;
private role: Role;

constructor(mediaItemId: string, name: string, role: Role) {
this.mediaItemId = mediaItemId;
this.name = name;
this.role = role;
}

getMediaItemId(): string {
return this.mediaItemId;
}

getName(): string {
return this.name;
}

getRole(): Role {
return this.role;
}
}
70 changes: 37 additions & 33 deletions lesson_10/libraries/src/models/media_collection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,55 +13,59 @@ export class MediaCollection {
}

search(criteria?: SearchCriteria): ReadonlySet<MediaItem> {
const items = [...this.items.values()];
if (!criteria) {
return new Set(items);
if (criteria?.title) {
return this.searchByTitle(criteria.title);
}
const title = criteria.title;
if (title) {
return new Set(items.filter((item) => item.getTitle().includes(title)));
if (criteria?.releaseYear) {
return this.searchByReleaseYear(criteria.releaseYear);
}
if (criteria.releaseYear) {
return new Set(
items.filter((item) => item.getReleaseYear() === criteria.releaseYear),
);
if (criteria?.type) {
return this.searchByType(criteria.type);
}
if (criteria.type) {
return new Set(items.filter((item) => item.getType() === criteria.type));
if (criteria?.creditName) {
return this.searchByCreditName(criteria.creditName);
}
if (criteria.creditName) {
return new Set(
items.filter((item) =>
[...item.getCredits()].some(
(credit) => credit.name === criteria.creditName,
),
),
);
}
return new Set(items);
return new Set(this.getItems());
}

searchByTitle(title: string): MediaItem[] {
return [...this.items.values()].filter((item) =>
item.getTitle().includes(title),
searchByTitle(title: string): ReadonlySet<MediaItem> {
return new Set(
this.getItems().filter((item) =>
item
.getTitle()
.toLowerCase()
.includes(title?.toLowerCase() ?? ''),
),
);
}

searchByReleaseYear(releaseYear: number): MediaItem[] {
return [...this.items.values()].filter(
(item) => item.getReleaseYear() === releaseYear,
searchByReleaseYear(releaseYear: number): ReadonlySet<MediaItem> {
return new Set(
this.getItems().filter((item) => item.getReleaseYear() === releaseYear),
);
}

searchByType(type: string): MediaItem[] {
return [...this.items.values()].filter((item) => item.getType() === type);
searchByType(type: string): ReadonlySet<MediaItem> {
return new Set(this.getItems().filter((item) => item.getType() === type));
}

searchByCreditName(name: string): MediaItem[] {
return [...this.items.values()].filter((item) =>
[...item.getCredits()].some((credit) => credit.name === name),
searchByCreditName(name: string): ReadonlySet<MediaItem> {
return new Set(
this.getItems().filter((item) =>
item.getCredits().some((credit) =>
credit
.getName()
.toLowerCase()
.includes(name?.toLowerCase() ?? ''),
),
),
);
}

private getItems(): readonly MediaItem[] {
return [...this.items.values()];
}

getInfo() {
return {
getItems: () => [...this.items] as readonly [string, MediaItem][],
Expand Down

0 comments on commit 96abdcd

Please sign in to comment.