X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;f=test%2Fsrc%2Fdb%2Fsqlite.js;h=bd6612030b3cae08e5d1e1858e8234644033d598;hb=d5e7908d3e60ee0cb3149163d4749563cdfafeb3;hp=310e87ad3da7e1203b50de9f2ad3f1d19ed34405;hpb=9696c012e6b9a6c58904baa397ca0ebf78112316;p=websub-hub diff --git a/test/src/db/sqlite.js b/test/src/db/sqlite.js index 310e87a..bd66120 100644 --- a/test/src/db/sqlite.js +++ b/test/src/db/sqlite.js @@ -66,6 +66,38 @@ describe('DatabaseSQLite', function () { }); }); // Implementation + describe('_initTables', function () { + let preparedGet; + beforeEach(function () { + preparedGet = sinon.stub(); + sinon.stub(db.db, 'prepare').returns({ + pluck: () => ({ + bind: () => ({ + get: preparedGet, + }), + }), + }); + sinon.stub(db, '_currentSchema').returns(db.schemaVersionsSupported.min); + sinon.stub(db.db, 'exec'); + }); + it('covers migration', async function() { + preparedGet.returns({}); + await db._initTables(); + assert(db.db.exec.called); + }); + it('covers migration failure', async function() { + const expected = new Error('oh no'); + preparedGet.returns({}); + db.db.exec.throws(expected); + try { + await db._initTables(); + assert.fail(noExpectedException); + } catch (e) { + assert.deepStrictEqual(e, expected); + } + }); + }); // _initTables + describe('_currentSchema', function () { it('covers', async function () { const version = { major: 1, minor: 0, patch: 0 }; @@ -339,7 +371,7 @@ describe('DatabaseSQLite', function () { describe('subscriptionsByTopicId', function () { it('success', async function () { - const expected = { count: 3 }; + const expected = [{ id: 3 }]; sinon.stub(db.statement.subscriptionsByTopicId, 'all').returns(expected); const result = await db.subscriptionsByTopicId(dbCtx, topicUrl); assert.deepStrictEqual(result, expected); @@ -404,8 +436,34 @@ describe('DatabaseSQLite', function () { }); }); // subscriptionDelete + describe('subscriptionDeleteExpired', function () { + it('success', async function () { + const dbResult = { + changes: 1, + lastInsertRowid: undefined, + }; + const expected = { + changes: 1, + lastInsertRowid: undefined, + }; + sinon.stub(db.statement.subscriptionDeleteExpired, 'run').returns(dbResult); + const result = await db.subscriptionDeleteExpired(dbCtx, topicId); + assert.deepStrictEqual(result, expected); + }); + it('failure', async function () { + const expected = new Error(); + sinon.stub(db.statement.subscriptionDeleteExpired, 'run').throws(expected); + try { + await db.subscriptionDeleteExpired(dbCtx, topicId); + assert.fail(noExpectedException); + } catch (e) { + assert.deepStrictEqual(e, expected); + } + }); + }); + describe('subscriptionDeliveryClaim', function () { - it('success', async function() { + it('success', async function () { const dbAllResult = [ { id: 'c2e254c5-aa6e-4a8f-b1a1-e474b07392bb', @@ -468,13 +526,17 @@ describe('DatabaseSQLite', function () { }); // subscriptionDeliveryClaimById describe('subscriptionDeliveryComplete', function () { + let topicContentUpdated; + before(function () { + topicContentUpdated = new Date(); + }); it('success', async function() { const dbResult = { changes: 1, }; sinon.stub(db.statement.subscriptionDeliverySuccess, 'run').returns(dbResult); sinon.stub(db.statement.subscriptionDeliveryDone, 'run').returns(dbResult); - await db.subscriptionDeliveryComplete(dbCtx, callback, topicId); + await db.subscriptionDeliveryComplete(dbCtx, callback, topicId, topicContentUpdated); }); it('failure', async function () { const dbResult = { @@ -483,7 +545,7 @@ describe('DatabaseSQLite', function () { sinon.stub(db.statement.subscriptionDeliverySuccess, 'run').returns(dbResult); sinon.stub(db.statement.subscriptionDeliveryDone, 'run').returns(dbResult); try { - await db.subscriptionDeliveryComplete(dbCtx, callback, topicId); + await db.subscriptionDeliveryComplete(dbCtx, callback, topicId, topicContentUpdated); assert.fail(noExpectedException); } catch (e) { assert(e instanceof DBErrors.UnexpectedResult); @@ -499,7 +561,7 @@ describe('DatabaseSQLite', function () { sinon.stub(db.statement.subscriptionDeliverySuccess, 'run').returns(dbResult0); sinon.stub(db.statement.subscriptionDeliveryDone, 'run').returns(dbResult1); try { - await db.subscriptionDeliveryComplete(dbCtx, callback, topicId); + await db.subscriptionDeliveryComplete(dbCtx, callback, topicId, topicContentUpdated); assert.fail(noExpectedException); } catch (e) { assert(e instanceof DBErrors.UnexpectedResult); @@ -1021,6 +1083,76 @@ describe('DatabaseSQLite', function () { }); }); // topicGetContentById + describe('topicPendingDelete', function () { + beforeEach(function () { + sinon.stub(db.statement.topicGetById, 'get'); + sinon.stub(db.statement.subscriptionCountByTopicUrl, 'get'); + sinon.stub(db.statement.topicDeleteById, 'run'); + }); + it('success', async function () { + db.statement.topicGetById.get.returns({ + id: topicId, + isDeleted: true, + }); + db.statement.subscriptionCountByTopicUrl.get.returns({ + count: 0, + }); + db.statement.topicDeleteById.run.returns({ + changes: 1, + }); + db.topicPendingDelete(dbCtx, topicId); + assert(db.statement.topicDeleteById.run.called); + }); + it('does not delete non-deleted topic', async function () { + db.statement.topicGetById.get.returns({ + id: topicId, + isDeleted: false, + }); + db.statement.subscriptionCountByTopicUrl.get.returns({ + count: 0, + }); + db.statement.topicDeleteById.run.returns({ + changes: 1, + }); + db.topicPendingDelete(dbCtx, topicId); + assert(!db.statement.topicDeleteById.run.called); + }); + it('does not delete topic with active subscriptions', async function () { + db.statement.topicGetById.get.returns({ + id: topicId, + isDeleted: true, + }); + db.statement.subscriptionCountByTopicUrl.get.returns({ + count: 10, + }); + db.statement.topicDeleteById.run.returns({ + changes: 1, + }); + db.topicPendingDelete(dbCtx, topicId); + assert(!db.statement.topicDeleteById.run.called); + }); + it('covers no deletion', async function () { + db.statement.topicGetById.get.returns({ + id: topicId, + isDeleted: true, + }); + db.statement.subscriptionCountByTopicUrl.get.returns({ + count: 0, + }); + db.statement.topicDeleteById.run.returns({ + changes: 0, + }); + try { + db.topicPendingDelete(dbCtx, topicId); + assert.fail(noExpectedException); + + } catch (e) { + assert(e instanceof DBErrors.UnexpectedResult); + } + assert(db.statement.topicDeleteById.run.called); + }); + }); + describe('topicSet', function () { let data; beforeEach(function () { @@ -1501,4 +1633,4 @@ describe('DatabaseSQLite', function () { }); }); // verificationValidated -}); // DatabasePostgres +}); // DatabaseSQLite