Skip to content

Commit 338da90

Browse files
committed
feat(02-1): add example
1 parent 9317f48 commit 338da90

10 files changed

+104
-28
lines changed

02-demeter_tell_dont_ask/1-demeter/src/Codelyber.ts

-9
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { UserFullName } from "./UserFullName";
2+
import { UserId } from "./UserId";
3+
4+
export class User {
5+
constructor(
6+
public readonly id: UserId,
7+
public readonly fullName: UserFullName,
8+
) {}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { UserLastName } from "./UserLastName";
2+
import { UserName } from "./UserName";
3+
4+
export class UserFullName {
5+
constructor(
6+
public readonly name: UserName,
7+
public readonly lastName: UserLastName,
8+
) {}
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { UserRepository } from "./UserRepository";
2+
3+
export class UserFullNameByIdFinder {
4+
constructor(private readonly repository: UserRepository) {}
5+
6+
find(id: string): string {
7+
const user = this.repository.search(id);
8+
9+
if (user === null) {
10+
throw new Error(`The user ${id} does not exist`);
11+
}
12+
13+
return `${user.fullName.name.value} ${user.fullName.lastName.value}`;
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export class UserId {
2+
constructor(public readonly value: string) {
3+
if (value.length !== 36) {
4+
throw new Error("The user id must be a valid uuid");
5+
}
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export class UserLastName {
2+
constructor(public readonly value: string) {
3+
if (value.length < 3) {
4+
throw new Error("The user last must be at least 3 characters long");
5+
}
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export class UserName {
2+
constructor(public readonly value: string) {
3+
if (value.length < 3) {
4+
throw new Error("The user name must be at least 3 characters long");
5+
}
6+
}
7+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { User } from "./User";
2+
3+
export interface UserRepository {
4+
search(id: string): User | null;
5+
}

02-demeter_tell_dont_ask/1-demeter/tests/Codelyber.test.ts

-19
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import { User } from "../src/User";
2+
import { UserFullName } from "../src/UserFullName";
3+
import { UserFullNameByIdFinder } from "../src/UserFullNameByIdFinder";
4+
import { UserId } from "../src/UserId";
5+
import { UserLastName } from "../src/UserLastName";
6+
import { UserName } from "../src/UserName";
7+
import { UserRepository } from "../src/UserRepository";
8+
9+
describe("UserFullNameByIdFinder", () => {
10+
const validUuid = "550e8400-e29b-41d4-a716-446655440000";
11+
12+
const mockUserRepository: UserRepository = {
13+
search: jest.fn((id: string) => {
14+
if (id === validUuid) {
15+
return new User(
16+
new UserId(validUuid),
17+
new UserFullName(new UserName("Javier"), new UserLastName("Ferrer")),
18+
);
19+
}
20+
21+
return null;
22+
}),
23+
};
24+
25+
it("throw an error searching a non existing user", () => {
26+
const nonExistingUuid = "550e8400-e29b-41d4-a716-446655440001";
27+
28+
const finder = new UserFullNameByIdFinder(mockUserRepository);
29+
30+
expect(() => {
31+
finder.find(nonExistingUuid);
32+
}).toThrow(`The user ${nonExistingUuid} does not exist`);
33+
34+
expect(mockUserRepository.search).toHaveBeenCalledWith(nonExistingUuid);
35+
});
36+
37+
it("return an existing user full name", () => {
38+
const finder = new UserFullNameByIdFinder(mockUserRepository);
39+
40+
const result = finder.find(validUuid);
41+
42+
expect(result).toBe("Javier Ferrer");
43+
expect(mockUserRepository.search).toHaveBeenCalledWith(validUuid);
44+
});
45+
});

0 commit comments

Comments
 (0)