diff options
Diffstat (limited to 'app/spec')
-rw-r--r-- | app/spec/persistence/sqlite.spec.js | 65 | ||||
-rw-r--r-- | app/spec/routes/addItem.spec.js | 30 | ||||
-rw-r--r-- | app/spec/routes/deleteItem.spec.js | 20 | ||||
-rw-r--r-- | app/spec/routes/getItems.spec.js | 19 | ||||
-rw-r--r-- | app/spec/routes/updateItem.spec.js | 33 |
5 files changed, 167 insertions, 0 deletions
diff --git a/app/spec/persistence/sqlite.spec.js b/app/spec/persistence/sqlite.spec.js new file mode 100644 index 0000000..996d451 --- /dev/null +++ b/app/spec/persistence/sqlite.spec.js @@ -0,0 +1,65 @@ +const db = require('../../src/persistence/sqlite'); +const fs = require('fs'); +const location = process.env.SQLITE_DB_LOCATION || '/etc/todos/todo.db'; + +const ITEM = { + id: '7aef3d7c-d301-4846-8358-2a91ec9d6be3', + name: 'Test', + completed: false, +}; + +beforeEach(() => { + if (fs.existsSync(location)) { + fs.unlinkSync(location); + } +}); + +test('it initializes correctly', async () => { + await db.init(); +}); + +test('it can store and retrieve items', async () => { + await db.init(); + + await db.storeItem(ITEM); + + const items = await db.getItems(); + expect(items.length).toBe(1); + expect(items[0]).toEqual(ITEM); +}); + +test('it can update an existing item', async () => { + await db.init(); + + const initialItems = await db.getItems(); + expect(initialItems.length).toBe(0); + + await db.storeItem(ITEM); + + await db.updateItem( + ITEM.id, + Object.assign({}, ITEM, { completed: !ITEM.completed }), + ); + + const items = await db.getItems(); + expect(items.length).toBe(1); + expect(items[0].completed).toBe(!ITEM.completed); +}); + +test('it can remove an existing item', async () => { + await db.init(); + await db.storeItem(ITEM); + + await db.removeItem(ITEM.id); + + const items = await db.getItems(); + expect(items.length).toBe(0); +}); + +test('it can get a single item', async () => { + await db.init(); + await db.storeItem(ITEM); + + const item = await db.getItem(ITEM.id); + expect(item).toEqual(ITEM); +}); diff --git a/app/spec/routes/addItem.spec.js b/app/spec/routes/addItem.spec.js new file mode 100644 index 0000000..0ec5e11 --- /dev/null +++ b/app/spec/routes/addItem.spec.js @@ -0,0 +1,30 @@ +const db = require('../../src/persistence'); +const addItem = require('../../src/routes/addItem'); +const ITEM = { id: 12345 }; +const uuid = require('uuid/v4'); + +jest.mock('uuid/v4', () => jest.fn()); + +jest.mock('../../src/persistence', () => ({ + removeItem: jest.fn(), + storeItem: jest.fn(), + getItem: jest.fn(), +})); + +test('it stores item correctly', async () => { + const id = 'something-not-a-uuid'; + const name = 'A sample item'; + const req = { body: { name } }; + const res = { send: jest.fn() }; + + uuid.mockReturnValue(id); + + await addItem(req, res); + + const expectedItem = { id, name, completed: false }; + + expect(db.storeItem.mock.calls.length).toBe(1); + expect(db.storeItem.mock.calls[0][0]).toEqual(expectedItem); + expect(res.send.mock.calls[0].length).toBe(1); + expect(res.send.mock.calls[0][0]).toEqual(expectedItem); +}); diff --git a/app/spec/routes/deleteItem.spec.js b/app/spec/routes/deleteItem.spec.js new file mode 100644 index 0000000..e553237 --- /dev/null +++ b/app/spec/routes/deleteItem.spec.js @@ -0,0 +1,20 @@ +const db = require('../../src/persistence'); +const deleteItem = require('../../src/routes/deleteItem'); +const ITEM = { id: 12345 }; + +jest.mock('../../src/persistence', () => ({ + removeItem: jest.fn(), + getItem: jest.fn(), +})); + +test('it removes item correctly', async () => { + const req = { params: { id: 12345 } }; + const res = { sendStatus: jest.fn() }; + + await deleteItem(req, res); + + expect(db.removeItem.mock.calls.length).toBe(1); + expect(db.removeItem.mock.calls[0][0]).toBe(req.params.id); + expect(res.sendStatus.mock.calls[0].length).toBe(1); + expect(res.sendStatus.mock.calls[0][0]).toBe(200); +}); diff --git a/app/spec/routes/getItems.spec.js b/app/spec/routes/getItems.spec.js new file mode 100644 index 0000000..0967ff1 --- /dev/null +++ b/app/spec/routes/getItems.spec.js @@ -0,0 +1,19 @@ +const db = require('../../src/persistence'); +const getItems = require('../../src/routes/getItems'); +const ITEMS = [{ id: 12345 }]; + +jest.mock('../../src/persistence', () => ({ + getItems: jest.fn(), +})); + +test('it gets items correctly', async () => { + const req = {}; + const res = { send: jest.fn() }; + db.getItems.mockReturnValue(Promise.resolve(ITEMS)); + + await getItems(req, res); + + expect(db.getItems.mock.calls.length).toBe(1); + expect(res.send.mock.calls[0].length).toBe(1); + expect(res.send.mock.calls[0][0]).toEqual(ITEMS); +}); diff --git a/app/spec/routes/updateItem.spec.js b/app/spec/routes/updateItem.spec.js new file mode 100644 index 0000000..640e56e --- /dev/null +++ b/app/spec/routes/updateItem.spec.js @@ -0,0 +1,33 @@ +const db = require('../../src/persistence'); +const updateItem = require('../../src/routes/updateItem'); +const ITEM = { id: 12345 }; + +jest.mock('../../src/persistence', () => ({ + getItem: jest.fn(), + updateItem: jest.fn(), +})); + +test('it updates items correctly', async () => { + const req = { + params: { id: 1234 }, + body: { name: 'New title', completed: false }, + }; + const res = { send: jest.fn() }; + + db.getItem.mockReturnValue(Promise.resolve(ITEM)); + + await updateItem(req, res); + + expect(db.updateItem.mock.calls.length).toBe(1); + expect(db.updateItem.mock.calls[0][0]).toBe(req.params.id); + expect(db.updateItem.mock.calls[0][1]).toEqual({ + name: 'New title', + completed: false, + }); + + expect(db.getItem.mock.calls.length).toBe(1); + expect(db.getItem.mock.calls[0][0]).toBe(req.params.id); + + expect(res.send.mock.calls[0].length).toBe(1); + expect(res.send.mock.calls[0][0]).toEqual(ITEM); +}); |