diff --git a/src/app/shared/state/__snapshots__/books.reducer.spec.ts.snap b/src/app/shared/state/__snapshots__/books.reducer.spec.ts.snap new file mode 100644 index 0000000..6edd607 --- /dev/null +++ b/src/app/shared/state/__snapshots__/books.reducer.spec.ts.snap @@ -0,0 +1,49 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Books Reducer should add a newly created book to the state 1`] = ` +Object { + "activeBookId": "1", + "entities": Object { + "1": Object { + "earnings": 200000000, + "id": "1", + "name": "Forrest Gump", + }, + }, + "ids": Array [ + "1", + ], +} +`; + +exports[`Books Reducer should load all books when the API loads them all successfully 1`] = ` +Object { + "activeBookId": null, + "entities": Object { + "1": Object { + "earnings": 1000000, + "id": "1", + "name": "Castaway", + }, + }, + "ids": Array [ + "1", + ], +} +`; + +exports[`Books Reducer should remove books from the state when they are deleted 1`] = ` +Object { + "activeBookId": "1", + "entities": Object { + "1": Object { + "earnings": 1000, + "id": "1", + "name": "Apollo 13", + }, + }, + "ids": Array [ + "1", + ], +} +`; diff --git a/src/app/shared/state/books.reducer.spec.ts b/src/app/shared/state/books.reducer.spec.ts index ace7bc5..9970453 100644 --- a/src/app/shared/state/books.reducer.spec.ts +++ b/src/app/shared/state/books.reducer.spec.ts @@ -1,9 +1,61 @@ -// import { BooksApiActions, BooksPageActions } from "src/app/books/actions"; -// import { Book } from "../models/book.model"; -// import { reducer, initialState } from "./book.reducer"; +import { BooksApiActions, BooksPageActions } from "src/app/books/actions"; +import { Book } from "../models/book.model"; +import { reducer, initialState, activeBookId, adapter, selectAll } from "./books.reducer"; describe("Books Reducer", () => { it("should return the initial state when initialized", () => { + const state = reducer(undefined, { type: "@@init" } as any); + expect(state).toBe(initialState); + }); + + it("should load all books when the API loads them all successfully", () => { + const books: Book[] = [{ id: "1", name: "Castaway", earnings: 1000000 }]; + const action = BooksApiActions.booksLoaded({ books }); + + const state = reducer(initialState, action); + + expect(state).toMatchSnapshot(); + }); + + it("should add a newly created book to the state", () => { + const book: Book = { id: "1", name: "Forrest Gump", earnings: 200000000 }; + const action = BooksApiActions.bookCreated({ book }); + + const state = reducer(initialState, action); + + expect(state).toMatchSnapshot(); + }); + + it("should remove books from the state when they are deleted", () => { + const book: Book = { id: "1", name: "Apollo 13", earnings: 1000 }; + const firstAction = BooksApiActions.bookCreated({ book }); + const secondAction = BooksPageActions.deleteBook({ book }); + + const state = [firstAction, secondAction].reduce(reducer, initialState); + + expect(state).toMatchSnapshot(); + }); + + describe("Selectors", () => { + const initialState = { activeBookId: "1", ids: [], entities: {} }; + + describe("activeBookId", () => { + it("should return the active book id", () => { + const result = activeBookId(initialState); + + expect(result).toBe("1"); + }); + }); + + describe("selectAll", () => { + it("should return all the loaded books", () => { + const books: Book[] = [{ id: "1", name: "Castaway", earnings: 1000000 }]; + const state = adapter.addAll(books, initialState); + const result = selectAll(state); + + expect(result.length).toBe(1); + }); + }); }); }); \ No newline at end of file