diff --git a/src/Contexts/Mooc/Courses/application/CourseCreator.ts b/src/Contexts/Mooc/Courses/application/CourseCreator.ts index 46425ac..1427955 100644 --- a/src/Contexts/Mooc/Courses/application/CourseCreator.ts +++ b/src/Contexts/Mooc/Courses/application/CourseCreator.ts @@ -2,6 +2,8 @@ import { CourseRepository } from '../domain/CourseRepository'; import { Course } from '../domain/Course'; import { CreateCourseRequest } from './CreateCourseRequest'; import { CourseId } from '../../Shared/domain/Courses/CourseId'; +import { CourseName } from '../domain/CourseName'; +import { CourseDuration } from '../domain/CourseDuration'; export class CourseCreator { private repository: CourseRepository; @@ -11,7 +13,11 @@ export class CourseCreator { } async run(request: CreateCourseRequest): Promise { - const course = new Course(new CourseId(request.id), request.name, request.duration); + const course = new Course( + new CourseId(request.id), + new CourseName(request.name), + new CourseDuration(request.duration) + ); return this.repository.save(course); } diff --git a/src/Contexts/Mooc/Courses/domain/Course.ts b/src/Contexts/Mooc/Courses/domain/Course.ts index 19514e7..96d9bd8 100644 --- a/src/Contexts/Mooc/Courses/domain/Course.ts +++ b/src/Contexts/Mooc/Courses/domain/Course.ts @@ -1,11 +1,13 @@ import { CourseId } from '../../Shared/domain/Courses/CourseId'; +import { CourseName } from './CourseName'; +import { CourseDuration } from './CourseDuration'; export class Course { readonly id: CourseId; - readonly name: string; - readonly duration: string; + readonly name: CourseName; + readonly duration: CourseDuration; - constructor(id: CourseId, name: string, duration: string) { + constructor(id: CourseId, name: CourseName, duration: CourseDuration) { this.id = id; this.name = name; this.duration = duration; diff --git a/src/Contexts/Mooc/Courses/domain/CourseDuration.ts b/src/Contexts/Mooc/Courses/domain/CourseDuration.ts new file mode 100644 index 0000000..e9cdec1 --- /dev/null +++ b/src/Contexts/Mooc/Courses/domain/CourseDuration.ts @@ -0,0 +1,3 @@ +import { StringValueObject } from '../../../Shared/domain/value-object/StringValueObject'; + +export class CourseDuration extends StringValueObject {} diff --git a/src/Contexts/Mooc/Courses/domain/CourseName.ts b/src/Contexts/Mooc/Courses/domain/CourseName.ts new file mode 100644 index 0000000..a7d92e4 --- /dev/null +++ b/src/Contexts/Mooc/Courses/domain/CourseName.ts @@ -0,0 +1,15 @@ +import { StringValueObject } from '../../../Shared/domain/value-object/StringValueObject'; +import { InvalidArgumentError } from '../../../Shared/domain/value-object/InvalidArgumentError'; + +export class CourseName extends StringValueObject { + constructor(value: string) { + super(value); + this.ensureLengthIsLessThan30Characters(value); + } + + private ensureLengthIsLessThan30Characters(value: string): void { + if (value.length > 30) { + throw new InvalidArgumentError(`The Course Name <${value}> has more than 30 characters`); + } + } +} diff --git a/src/Contexts/Shared/domain/value-object/IntValueObject.ts b/src/Contexts/Shared/domain/value-object/IntValueObject.ts new file mode 100644 index 0000000..7ac214f --- /dev/null +++ b/src/Contexts/Shared/domain/value-object/IntValueObject.ts @@ -0,0 +1,15 @@ +export abstract class NumberValueObject { + readonly value: number; + + constructor(value: number) { + this.value = value; + } + + equalsTo(other: NumberValueObject): boolean { + return this.value === other.value; + } + + isBiggerThan(other: NumberValueObject): boolean { + return this.value > other.value; + } +} diff --git a/src/Contexts/Shared/domain/value-object/StringValueObject.ts b/src/Contexts/Shared/domain/value-object/StringValueObject.ts new file mode 100644 index 0000000..a665333 --- /dev/null +++ b/src/Contexts/Shared/domain/value-object/StringValueObject.ts @@ -0,0 +1,11 @@ +export abstract class StringValueObject { + readonly value: string; + + constructor(value: string) { + this.value = value; + } + + toString(): string { + return this.value; + } +} diff --git a/tests/Contexts/Mooc/Courses/application/CourseCreator.test.ts b/tests/Contexts/Mooc/Courses/application/CourseCreator.test.ts index c1cb01c..4366d6a 100644 --- a/tests/Contexts/Mooc/Courses/application/CourseCreator.test.ts +++ b/tests/Contexts/Mooc/Courses/application/CourseCreator.test.ts @@ -2,6 +2,8 @@ import { Course } from '../../../../../src/Contexts/Mooc/Courses/domain/Course'; import { CourseCreator } from '../../../../../src/Contexts/Mooc/Courses/application/CourseCreator'; import { CourseRepository } from '../../../../../src/Contexts/Mooc/Courses/domain/CourseRepository'; import { CourseId } from '../../../../../src/Contexts/Mooc/Shared/domain/Courses/CourseId'; +import { CourseName } from '../../../../../src/Contexts/Mooc/Courses/domain/CourseName'; +import { CourseDuration } from '../../../../../src/Contexts/Mooc/Courses/domain/CourseDuration'; describe('Course Creator', () => { it('should create a valid course', async () => { @@ -17,7 +19,7 @@ describe('Course Creator', () => { const name = 'some-name'; const duration = 'some-duration'; - const course = new Course(new CourseId(id), name, duration); + const course = new Course(new CourseId(id), new CourseName(name), new CourseDuration(duration)); await createCourse.run({ id, name, duration }); diff --git a/tests/Contexts/Mooc/Courses/infrastructure/FileCourseRepository.test.ts b/tests/Contexts/Mooc/Courses/infrastructure/FileCourseRepository.test.ts index d51df17..fb2a364 100644 --- a/tests/Contexts/Mooc/Courses/infrastructure/FileCourseRepository.test.ts +++ b/tests/Contexts/Mooc/Courses/infrastructure/FileCourseRepository.test.ts @@ -1,12 +1,39 @@ import { FileCourseRepository } from '../../../../../src/Contexts/Mooc/Courses/infrastructure/FileCourseRepository'; import { Course } from '../../../../../src/Contexts/Mooc/Courses/domain/Course'; import { CourseId } from '../../../../../src/Contexts/Mooc/Shared/domain/Courses/CourseId'; +import { CourseName } from '../../../../../src/Contexts/Mooc/Courses/domain/CourseName'; +import { CourseDuration } from '../../../../../src/Contexts/Mooc/Courses/domain/CourseDuration'; describe('Save Course', () => { - it('should have a course', () => { + it('should have a course', async () => { const repository = new FileCourseRepository(); - const course = new Course(new CourseId('0766c602-d4d4-48b6-9d50-d3253123275e'), 'name', 'duration'); + const course = new Course( + new CourseId('0766c602-d4d4-48b6-9d50-d3253123275e'), + new CourseName('name'), + new CourseDuration('duration') + ); - repository.save(course); + await repository.save(course); + }); +}); + +describe('Search Course', () => { + it('should return an existing course', async () => { + const repository = new FileCourseRepository(); + const course = new Course( + new CourseId('0766c602-d4d4-48b6-9d50-d3253123275e'), + new CourseName('name'), + new CourseDuration('duration') + ); + + await repository.save(course); + + expect(course).toEqual(await repository.search(course.id)); + }); + + it('should not return a non existing course', async () => { + const repository = new FileCourseRepository(); + + expect(await repository.search(new CourseId('de8c20b5-1181-415b-bb82-1f15bf1b67f1'))).toBeFalsy(); }); }); diff --git a/tests/apps/mooc_backend/features/step_definitions/controller.steps.ts b/tests/apps/mooc_backend/features/step_definitions/controller.steps.ts index fdeaff0..7f81c3b 100644 --- a/tests/apps/mooc_backend/features/step_definitions/controller.steps.ts +++ b/tests/apps/mooc_backend/features/step_definitions/controller.steps.ts @@ -13,7 +13,7 @@ Given('I send a GET request to {string}', (route: string) => { Given('I send a PUT request to {string} with body:', (route: string, body: string) => { _request = request(app) .put(route) - .send(body); + .send(JSON.parse(body)); }); Then('the response status code should be {int}', async (status: number) => {