diff --git a/tests/Contexts/Mooc/Courses/infrastructure/FileCourseRepository.test.ts b/tests/Contexts/Mooc/Courses/infrastructure/FileCourseRepository.test.ts index fb2a364..20c7dc6 100644 --- a/tests/Contexts/Mooc/Courses/infrastructure/FileCourseRepository.test.ts +++ b/tests/Contexts/Mooc/Courses/infrastructure/FileCourseRepository.test.ts @@ -1,17 +1,10 @@ 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'; +import { CourseMother } from '../../../../Mooc/Courses/domain/CourseMother'; describe('Save Course', () => { it('should have a course', async () => { const repository = new FileCourseRepository(); - const course = new Course( - new CourseId('0766c602-d4d4-48b6-9d50-d3253123275e'), - new CourseName('name'), - new CourseDuration('duration') - ); + const course = CourseMother.random(); await repository.save(course); }); @@ -20,11 +13,7 @@ describe('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') - ); + const course = CourseMother.random(); await repository.save(course); @@ -34,6 +23,6 @@ describe('Search Course', () => { 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(); + expect(await repository.search(CourseMother.random().id)).toBeFalsy(); }); }); diff --git a/tests/Mooc/Courses/application/CourseCreator.test.ts b/tests/Mooc/Courses/application/CourseCreator.test.ts new file mode 100644 index 0000000..a8baea8 --- /dev/null +++ b/tests/Mooc/Courses/application/CourseCreator.test.ts @@ -0,0 +1,26 @@ +import { CourseCreator } from '../../../../src/Contexts/Mooc/Courses/application/CourseCreator'; +import { CourseMother } from '../domain/CourseMother'; +import { CreateCourseRequestMother } from './CreateCourseRequestMother'; +import { CourseRepository } from '../../../../src/Contexts/Mooc/Courses/domain/CourseRepository'; +import { Course } from '../../../../src/Contexts/Mooc/Courses/domain/Course'; + +let repository: CourseRepository; +let creator: CourseCreator; + +const createRepository = (): CourseRepository => ({ save: jest.fn(), search: jest.fn() }); +const shouldSave = (course: Course) => expect(repository.save).toHaveBeenCalledWith(course); + +beforeEach(() => { + repository = createRepository(); + creator = new CourseCreator(repository); +}); + +it('should create a valid course', async () => { + const request = CreateCourseRequestMother.random(); + + const course = CourseMother.fromRequest(request); + + await creator.run(request); + + shouldSave(course); +}); diff --git a/tests/Mooc/Courses/application/CreateCourseRequestMother.ts b/tests/Mooc/Courses/application/CreateCourseRequestMother.ts new file mode 100644 index 0000000..1995cb8 --- /dev/null +++ b/tests/Mooc/Courses/application/CreateCourseRequestMother.ts @@ -0,0 +1,17 @@ +import { CreateCourseRequest } from '../../../../src/Contexts/Mooc/Courses/application/CreateCourseRequest'; +import { CourseDuration } from '../../../../src/Contexts/Mooc/Courses/domain/CourseDuration'; +import { CourseId } from '../../../../src/Contexts/Mooc/Shared/domain/Courses/CourseId'; +import { CourseName } from '../../../../src/Contexts/Mooc/Courses/domain/CourseName'; +import { CourseDurationMother } from '../domain/CourseDurationMother'; +import { CourseIdMother } from '../../Shared/domain/Courses/CourseIdMother'; +import { CourseNameMother } from '../domain/CourseNameMother'; + +export class CreateCourseRequestMother { + static create(id: CourseId, name: CourseName, duration: CourseDuration): CreateCourseRequest { + return { id: id.value, name: name.value, duration: duration.value }; + } + + static random(): CreateCourseRequest { + return this.create(CourseIdMother.random(), CourseNameMother.random(), CourseDurationMother.random()); + } +} diff --git a/tests/Mooc/Courses/domain/CourseDurationMother.ts b/tests/Mooc/Courses/domain/CourseDurationMother.ts new file mode 100644 index 0000000..0082b7b --- /dev/null +++ b/tests/Mooc/Courses/domain/CourseDurationMother.ts @@ -0,0 +1,12 @@ +import { CourseDuration } from '../../../../src/Contexts/Mooc/Courses/domain/CourseDuration'; +import { WordMother } from '../../../Shared/domain/WordMother'; + +export class CourseDurationMother { + static create(value: string): CourseDuration { + return new CourseDuration(value); + } + + static random(): CourseDuration { + return this.create(WordMother.random()); + } +} diff --git a/tests/Mooc/Courses/domain/CourseMother.ts b/tests/Mooc/Courses/domain/CourseMother.ts new file mode 100644 index 0000000..9a8ad04 --- /dev/null +++ b/tests/Mooc/Courses/domain/CourseMother.ts @@ -0,0 +1,26 @@ +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'; +import { Course } from '../../../../src/Contexts/Mooc/Courses/domain/Course'; +import { CreateCourseRequest } from '../../../../src/Contexts/Mooc/Courses/application/CreateCourseRequest'; +import { CourseIdMother } from '../../Shared/domain/Courses/CourseIdMother'; +import { CourseNameMother } from './CourseNameMother'; +import { CourseDurationMother } from './CourseDurationMother'; + +export class CourseMother { + static create(id: CourseId, name: CourseName, duration: CourseDuration): Course { + return new Course(id, name, duration); + } + + static fromRequest(request: CreateCourseRequest): Course { + return this.create( + CourseIdMother.create(request.id), + CourseNameMother.create(request.name), + CourseDurationMother.create(request.duration) + ); + } + + static random(): Course { + return this.create(CourseIdMother.random(), CourseNameMother.random(), CourseDurationMother.random()); + } +} diff --git a/tests/Mooc/Courses/domain/CourseNameMother.ts b/tests/Mooc/Courses/domain/CourseNameMother.ts new file mode 100644 index 0000000..b894524 --- /dev/null +++ b/tests/Mooc/Courses/domain/CourseNameMother.ts @@ -0,0 +1,12 @@ +import { CourseName } from '../../../../src/Contexts/Mooc/Courses/domain/CourseName'; +import { WordMother } from '../../../Shared/domain/WordMother'; + +export class CourseNameMother { + static create(value: string): CourseName { + return new CourseName(value); + } + + static random(): CourseName { + return this.create(WordMother.random()); + } +} diff --git a/tests/Mooc/Shared/domain/Courses/CourseIdMother.ts b/tests/Mooc/Shared/domain/Courses/CourseIdMother.ts new file mode 100644 index 0000000..087258c --- /dev/null +++ b/tests/Mooc/Shared/domain/Courses/CourseIdMother.ts @@ -0,0 +1,12 @@ +import { CourseId } from '../../../../../src/Contexts/Mooc/Shared/domain/Courses/CourseId'; +import { UuidMother } from '../../../../Shared/domain/UuidMother'; + +export class CourseIdMother { + static create(value: string): CourseId { + return new CourseId(value); + } + + static random(): CourseId { + return this.create(UuidMother.random()); + } +} diff --git a/tests/Shared/domain/MotherCreator.ts b/tests/Shared/domain/MotherCreator.ts new file mode 100644 index 0000000..cdadb16 --- /dev/null +++ b/tests/Shared/domain/MotherCreator.ts @@ -0,0 +1,7 @@ +import * as faker from 'faker'; + +export class MotherCreator { + static random(): Faker.FakerStatic { + return faker; + } +} diff --git a/tests/Shared/domain/UuidMother.ts b/tests/Shared/domain/UuidMother.ts new file mode 100644 index 0000000..e751dd4 --- /dev/null +++ b/tests/Shared/domain/UuidMother.ts @@ -0,0 +1,7 @@ +import { MotherCreator } from './MotherCreator'; + +export class UuidMother { + static random(): string { + return MotherCreator.random().random.uuid(); + } +} diff --git a/tests/Shared/domain/WordMother.ts b/tests/Shared/domain/WordMother.ts new file mode 100644 index 0000000..e3f6a85 --- /dev/null +++ b/tests/Shared/domain/WordMother.ts @@ -0,0 +1,7 @@ +import { MotherCreator } from './MotherCreator'; + +export class WordMother { + static random(): string { + return MotherCreator.random().lorem.word(); + } +}