--- /dev/null
+/* eslint-disable security/detect-object-injection */
+'use strict';
+
+const sinon = require('sinon'); // eslint-disable-line node/no-unpublished-require
+
+const spyFns = [
+ 'context',
+ 'transaction',
+];
+
+const stubFns = [
+ 'authenticationSuccess',
+ 'authenticationGet',
+ 'authenticationUpsert',
+ 'healthCheck',
+ 'schemaCheck',
+ 'subscriptionsByTopicId',
+ 'subscriptionCountByTopicUrl',
+ 'subscriptionDelete',
+ 'subscriptionDeliveryClaim',
+ 'subscriptionDeliveryClaimById',
+ 'subscriptionDeliveryComplete',
+ 'subscriptionDeliveryGone',
+ 'subscriptionDeliveryIncomplete',
+ 'subscriptionGet',
+ 'subscriptionGetById',
+ 'subscriptionUpdate',
+ 'subscriptionUpsert',
+ 'topicDeleted',
+ 'topicFetchClaim',
+ 'topicFetchClaimById',
+ 'topicFetchComplete',
+ 'topicFetchIncomplete',
+ 'topicFetchRequested',
+ 'topicGetAll',
+ 'topicGetById',
+ 'topicGetByUrl',
+ 'topicGetContentById',
+ 'topicSet',
+ 'topicSetContent',
+ 'topicUpdate',
+ 'verificationClaim',
+ 'verificationClaimById',
+ 'verificationComplete',
+ 'verificationGetById',
+ 'verificationIncomplete',
+ 'verificationInsert',
+ 'verificationRelease',
+ 'verificationUpdate',
+ 'verificationValidated',
+];
+
+const stubDatabase = {
+ _implementation: [ ...spyFns, ...stubFns ],
+ _reset: () => {
+ spyFns.forEach((fn) => sinon.spy(stubDatabase, fn));
+ stubFns.forEach((fn) => sinon.stub(stubDatabase, fn));
+ },
+ context: async (fn) => await fn({}),
+ transaction: async (dbCtx, fn) => await fn(dbCtx),
+};
+
+stubFns.forEach((fn) => {
+ stubDatabase[fn] = () => {};
+});
+
+module.exports = stubDatabase;
\ No newline at end of file