Skip to content

Commit

Permalink
test: use containers instead in memory repositories
Browse files Browse the repository at this point in the history
  • Loading branch information
sgomez committed Mar 24, 2024
1 parent 7fb7dc6 commit 54ec3ae
Show file tree
Hide file tree
Showing 13 changed files with 141 additions and 343 deletions.
31 changes: 15 additions & 16 deletions src/core/book/application/__tests__/create-book.use-case.spec.ts
Original file line number Diff line number Diff line change
@@ -1,52 +1,51 @@
import { describe, expect, it } from 'vitest'

import CreateBookUseCase from '@/core/book/application/create-book.use-case'
import BooksInMemory from '@/core/book/infrastructure/services/books-in-memory.repository'
import DuplicateIdError from '@/core/common/domain/errors/application/duplicate-id-error'
import ApplicationError from '@/core/common/domain/errors/application-error'
import container from '@/lib/container'
import prisma from '@/lib/prisma/prisma'
import unexpected from '@/lib/utils/unexpected'
import BooksExamples from '@/tests/examples/books.examples'
import bookRequestExamples from '@/tests/examples/books-request.examples'
import { createAvailableBook } from '@/tests/examples/factories'

describe('CreateBookUseCase', () => {
it('should create a new book', async () => {
// Arrange
const books = new BooksInMemory()

const command = bookRequestExamples.create()
const useCase = new CreateBookUseCase(books)

// Act
const result = await useCase.with(command)
const result = await container.createBook.with(command)

// Assert
result.match(
() => {
const savedBook = books.books.get(command.id)
async () => {
const savedBook = await prisma.book.findFirst({
where: {
id: command.id,
},
})
expect(savedBook?.version).toEqual(0)
expect(savedBook?.state).toEqual('AVAILABLE')
},
(error) => unexpected.error(error),
)
})

it('should rejects to create a book with the same id', async () => {
// Arrange
const book = BooksExamples.available()
const books = new BooksInMemory([book])

const book = await createAvailableBook()
const command = {
...bookRequestExamples.create(),
id: book.id.value,
}
const useCase = new CreateBookUseCase(books)

// Act
const result = await useCase.with(command)
const result = await container.createBook.with(command)

// Assert
result.match(
(success) => unexpected.success(success),
(error) => {
expect(error).toBeInstanceOf(DuplicateIdError)
expect(error).toBeInstanceOf(ApplicationError)
},
)
})
Expand Down
27 changes: 13 additions & 14 deletions src/core/book/application/__tests__/edit-book.use-case.spec.ts
Original file line number Diff line number Diff line change
@@ -1,35 +1,37 @@
import { describe, expect, it } from 'vitest'

import EditBookUseCase from '@/core/book/application/edit-book.use-case'
import EditBookRequest from '@/core/book/dto/requests/edit-book.request'
import BooksInMemory from '@/core/book/infrastructure/services/books-in-memory.repository'
import NotFoundError from '@/core/common/domain/errors/application/not-found-error'
import container from '@/lib/container'
import prisma from '@/lib/prisma/prisma'
import unexpected from '@/lib/utils/unexpected'
import BooksExamples from '@/tests/examples/books.examples'
import { createAvailableBook } from '@/tests/examples/factories'

describe('EditBookUseCase', () => {
it('should edit a book', async () => {
// Arrange
const book = BooksExamples.available()
const books = new BooksInMemory([book])

const book = await createAvailableBook()
const command = EditBookRequest.with({
authors: book.authors.map((author) => author.value),
id: book.id.value,
image: book.image.value,
title: 'A updated title',
})
const useCase = new EditBookUseCase(books)

// Act
const result = await useCase.with(command)
const result = await container.editBook.with(command)

// Assert
result.match(
() => {
const savedBook = books.books.get(command.id)
async () => {
const savedBook = await prisma.book.findFirst({
where: {
id: command.id,
},
})
expect(savedBook?.version).toEqual(1)
expect(savedBook?.title.value).toEqual(command.title)
expect(savedBook?.title).toEqual(command.title)
},
(error) => unexpected.error(error),
)
Expand All @@ -38,18 +40,15 @@ describe('EditBookUseCase', () => {
it('should returns an error if book does not exists', async () => {
// Arrange
const book = BooksExamples.available()
const books = new BooksInMemory()

const command = EditBookRequest.with({
authors: book.authors.map((author) => author.value),
id: book.id.value,
image: book.image.value,
title: 'A updated title',
})
const useCase = new EditBookUseCase(books)

// Act
const result = await useCase.with(command)
const result = await container.editBook.with(command)

// Assert
result.match(
Expand Down
49 changes: 17 additions & 32 deletions src/core/book/application/__tests__/loan-book.use-case.spec.ts
Original file line number Diff line number Diff line change
@@ -1,66 +1,51 @@
import { describe, expect, it } from 'vitest'

import LoanBookUseCase from '@/core/book/application/loan-book-use.case'
import LoanBookRequest from '@/core/book/dto/requests/loan-book.request'
import BooksInMemory from '@/core/book/infrastructure/services/books-in-memory.repository'
import ApplicationError from '@/core/common/domain/errors/application-error'
import LoanBookService from '@/core/loan/domain/services/loan-book.service'
import LoansInMemory from '@/core/loan/infrastructure/services/loans-in-memory.repository'
import container from '@/lib/container'
import prisma from '@/lib/prisma/prisma'
import unexpected from '@/lib/utils/unexpected'
import BooksExamples from '@/tests/examples/books.examples'
import LoansExamples from '@/tests/examples/loans.examples'
import UsersExamples from '@/tests/examples/users.examples'
import {
createAvailableBook,
createLoan,
createLoanedBook,
createUser,
} from '@/tests/examples/factories'

describe('Loan book', () => {
it('should loan a available book to a user', async () => {
// Arrange
const book = BooksExamples.available()
const books = new BooksInMemory([book])

const user = UsersExamples.basic()

const loans = new LoansInMemory([])

const loanBookService = new LoanBookService(loans)

const useCase = new LoanBookUseCase(books, loanBookService)
const book = await createAvailableBook()
const user = await createUser()
const request = LoanBookRequest.with({
bookId: book.id.value,
userId: user.id.value,
})

// Act
const result = useCase.with(request)
const result = container.loanBook.with(request)

// Assert
await result.match(
() => {
expect(loans.loans).toHaveLength(1)
async () => {
expect(await prisma.loan.count()).toBe(1)
},
(error) => unexpected.error(error),
)
})

it('should not loan an unavailable book to a user', async () => {
// Arrange
const book = BooksExamples.loaned()
const books = new BooksInMemory([book])

const user = UsersExamples.basic()

const loan = LoansExamples.ofBookAndUser(book, user)
const loans = new LoansInMemory([loan])

const loanBookService = new LoanBookService(loans)

const useCase = new LoanBookUseCase(books, loanBookService)
const book = await createLoanedBook()
const user = await createUser()
await createLoan(book, user)
const request = LoanBookRequest.with({
bookId: book.id.value,
userId: user.id.value,
})

// Act
const result = useCase.with(request)
const result = container.loanBook.with(request)

// Assert
await result.match(
Expand Down
36 changes: 14 additions & 22 deletions src/core/book/application/__tests__/return-book.use-case.spec.ts
Original file line number Diff line number Diff line change
@@ -1,40 +1,32 @@
import { describe, expect, it } from 'vitest'

import ReturnBookUseCase from '@/core/book/application/return-book.use-case'
import ReturnBookRequest from '@/core/book/dto/requests/return-book.request'
import BooksInMemory from '@/core/book/infrastructure/services/books-in-memory.repository'
import ReturnBookService from '@/core/loan/domain/services/return-book.service'
import LoansInMemory from '@/core/loan/infrastructure/services/loans-in-memory.repository'
import container from '@/lib/container'
import prisma from '@/lib/prisma/prisma'
import unexpected from '@/lib/utils/unexpected'
import BooksExamples from '@/tests/examples/books.examples'
import LoansExamples from '@/tests/examples/loans.examples'
import UsersExamples from '@/tests/examples/users.examples'
import {
createLoan,
createLoanedBook,
createUser,
} from '@/tests/examples/factories'

describe('Return book', () => {
it('should return a loaned book', async () => {
// Arrange
const book = BooksExamples.loaned()
const books = new BooksInMemory([book])

const user = UsersExamples.basic()

const loan = LoansExamples.ofBookAndUser(book, user)
const loans = new LoansInMemory([loan])

const returnBookService = new ReturnBookService(loans)

const useCase = new ReturnBookUseCase(books, returnBookService)
const loanedBook = await createLoanedBook()
const user = await createUser()
await createLoan(loanedBook, user)
const request = ReturnBookRequest.with({
bookId: book.id.value,
bookId: loanedBook.id.value,
})

// Act
const result = useCase.with(request)
const result = container.returnBook.with(request)

// Assert
await result.match(
() => {
expect(loans.loans).toHaveLength(0)
async () => {
expect(await prisma.loan.count()).toBe(0)
},
(error) => unexpected.error(error),
)
Expand Down
4 changes: 4 additions & 0 deletions src/core/book/application/return-book.use-case.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,7 @@ export default class ReturnBookUseCase {
.andThen(() => this.books.save(book))
}
}

export function add(...arguments_: number[]) {
return arguments_.reduce((a, b) => a + b, 0)
}

This file was deleted.

Loading

0 comments on commit 54ec3ae

Please sign in to comment.