Skip to content

Commit 4bacbfa

Browse files
authored
Merge pull request #39 from CodelyTV/step-60661910
Step 60661910
2 parents b14761c + b29918e commit 4bacbfa

File tree

9 files changed

+90
-9
lines changed

9 files changed

+90
-9
lines changed

src/Contexts/Mooc/Courses/application/CourseCreator.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { CourseRepository } from '../domain/CourseRepository';
22
import { Course } from '../domain/Course';
33
import { CreateCourseRequest } from './CreateCourseRequest';
44
import { CourseId } from '../../Shared/domain/Courses/CourseId';
5+
import { CourseName } from '../domain/CourseName';
6+
import { CourseDuration } from '../domain/CourseDuration';
57

68
export class CourseCreator {
79
private repository: CourseRepository;
@@ -11,7 +13,11 @@ export class CourseCreator {
1113
}
1214

1315
async run(request: CreateCourseRequest): Promise<void> {
14-
const course = new Course(new CourseId(request.id), request.name, request.duration);
16+
const course = new Course(
17+
new CourseId(request.id),
18+
new CourseName(request.name),
19+
new CourseDuration(request.duration)
20+
);
1521

1622
return this.repository.save(course);
1723
}

src/Contexts/Mooc/Courses/domain/Course.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import { CourseId } from '../../Shared/domain/Courses/CourseId';
2+
import { CourseName } from './CourseName';
3+
import { CourseDuration } from './CourseDuration';
24

35
export class Course {
46
readonly id: CourseId;
5-
readonly name: string;
6-
readonly duration: string;
7+
readonly name: CourseName;
8+
readonly duration: CourseDuration;
79

8-
constructor(id: CourseId, name: string, duration: string) {
10+
constructor(id: CourseId, name: CourseName, duration: CourseDuration) {
911
this.id = id;
1012
this.name = name;
1113
this.duration = duration;
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { StringValueObject } from '../../../Shared/domain/value-object/StringValueObject';
2+
3+
export class CourseDuration extends StringValueObject {}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { StringValueObject } from '../../../Shared/domain/value-object/StringValueObject';
2+
import { InvalidArgumentError } from '../../../Shared/domain/value-object/InvalidArgumentError';
3+
4+
export class CourseName extends StringValueObject {
5+
constructor(value: string) {
6+
super(value);
7+
this.ensureLengthIsLessThan30Characters(value);
8+
}
9+
10+
private ensureLengthIsLessThan30Characters(value: string): void {
11+
if (value.length > 30) {
12+
throw new InvalidArgumentError(`The Course Name <${value}> has more than 30 characters`);
13+
}
14+
}
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
export abstract class NumberValueObject {
2+
readonly value: number;
3+
4+
constructor(value: number) {
5+
this.value = value;
6+
}
7+
8+
equalsTo(other: NumberValueObject): boolean {
9+
return this.value === other.value;
10+
}
11+
12+
isBiggerThan(other: NumberValueObject): boolean {
13+
return this.value > other.value;
14+
}
15+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
export abstract class StringValueObject {
2+
readonly value: string;
3+
4+
constructor(value: string) {
5+
this.value = value;
6+
}
7+
8+
toString(): string {
9+
return this.value;
10+
}
11+
}

tests/Contexts/Mooc/Courses/application/CourseCreator.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { Course } from '../../../../../src/Contexts/Mooc/Courses/domain/Course';
22
import { CourseCreator } from '../../../../../src/Contexts/Mooc/Courses/application/CourseCreator';
33
import { CourseRepository } from '../../../../../src/Contexts/Mooc/Courses/domain/CourseRepository';
44
import { CourseId } from '../../../../../src/Contexts/Mooc/Shared/domain/Courses/CourseId';
5+
import { CourseName } from '../../../../../src/Contexts/Mooc/Courses/domain/CourseName';
6+
import { CourseDuration } from '../../../../../src/Contexts/Mooc/Courses/domain/CourseDuration';
57

68
describe('Course Creator', () => {
79
it('should create a valid course', async () => {
@@ -17,7 +19,7 @@ describe('Course Creator', () => {
1719
const name = 'some-name';
1820
const duration = 'some-duration';
1921

20-
const course = new Course(new CourseId(id), name, duration);
22+
const course = new Course(new CourseId(id), new CourseName(name), new CourseDuration(duration));
2123

2224
await createCourse.run({ id, name, duration });
2325

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,39 @@
11
import { FileCourseRepository } from '../../../../../src/Contexts/Mooc/Courses/infrastructure/FileCourseRepository';
22
import { Course } from '../../../../../src/Contexts/Mooc/Courses/domain/Course';
33
import { CourseId } from '../../../../../src/Contexts/Mooc/Shared/domain/Courses/CourseId';
4+
import { CourseName } from '../../../../../src/Contexts/Mooc/Courses/domain/CourseName';
5+
import { CourseDuration } from '../../../../../src/Contexts/Mooc/Courses/domain/CourseDuration';
46

57
describe('Save Course', () => {
6-
it('should have a course', () => {
8+
it('should have a course', async () => {
79
const repository = new FileCourseRepository();
8-
const course = new Course(new CourseId('0766c602-d4d4-48b6-9d50-d3253123275e'), 'name', 'duration');
10+
const course = new Course(
11+
new CourseId('0766c602-d4d4-48b6-9d50-d3253123275e'),
12+
new CourseName('name'),
13+
new CourseDuration('duration')
14+
);
915

10-
repository.save(course);
16+
await repository.save(course);
17+
});
18+
});
19+
20+
describe('Search Course', () => {
21+
it('should return an existing course', async () => {
22+
const repository = new FileCourseRepository();
23+
const course = new Course(
24+
new CourseId('0766c602-d4d4-48b6-9d50-d3253123275e'),
25+
new CourseName('name'),
26+
new CourseDuration('duration')
27+
);
28+
29+
await repository.save(course);
30+
31+
expect(course).toEqual(await repository.search(course.id));
32+
});
33+
34+
it('should not return a non existing course', async () => {
35+
const repository = new FileCourseRepository();
36+
37+
expect(await repository.search(new CourseId('de8c20b5-1181-415b-bb82-1f15bf1b67f1'))).toBeFalsy();
1138
});
1239
});

tests/apps/mooc_backend/features/step_definitions/controller.steps.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Given('I send a GET request to {string}', (route: string) => {
1313
Given('I send a PUT request to {string} with body:', (route: string, body: string) => {
1414
_request = request(app)
1515
.put(route)
16-
.send(body);
16+
.send(JSON.parse(body));
1717
});
1818

1919
Then('the response status code should be {int}', async (status: number) => {

0 commit comments

Comments
 (0)