-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathletter-queue-repository.test.ts
More file actions
104 lines (88 loc) · 2.81 KB
/
Copy pathletter-queue-repository.test.ts
File metadata and controls
104 lines (88 loc) · 2.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import { Logger } from "pino";
import {
DBContext,
createTables,
deleteTables,
setupDynamoDBContainer,
} from "./db";
import LetterQueueRepository from "../letter-queue-repository";
import { InsertPendingLetter } from "../types";
import { LetterAlreadyExistsError } from "../errors";
import { createTestLogger } from "./logs";
function createLetter(letterId = "letter1"): InsertPendingLetter {
return {
letterId,
supplierId: "supplier1",
specificationId: "specification1",
groupId: "group1",
};
}
// Database tests can take longer, especially with setup and teardown
jest.setTimeout(30_000);
describe("LetterQueueRepository", () => {
let db: DBContext;
let letterQueueRepository: LetterQueueRepository;
let logger: Logger;
beforeAll(async () => {
db = await setupDynamoDBContainer();
});
beforeEach(async () => {
await createTables(db);
({ logger } = createTestLogger());
letterQueueRepository = new LetterQueueRepository(
db.docClient,
logger,
db.config,
);
});
afterEach(async () => {
await deleteTables(db);
jest.useRealTimers();
});
afterAll(async () => {
await db.container.stop();
});
function assertTtl(ttl: number, before: number, after: number) {
const expectedLower = Math.floor(
before / 1000 + 60 * 60 * db.config.letterQueueTtlHours,
);
const expectedUpper = Math.floor(
after / 1000 + 60 * 60 * db.config.lettersTtlHours,
);
expect(ttl).toBeGreaterThanOrEqual(expectedLower);
expect(ttl).toBeLessThanOrEqual(expectedUpper);
}
describe("putLetter", () => {
it("adds a letter to the database", async () => {
const before = Date.now();
const pendingLetter =
await letterQueueRepository.putLetter(createLetter());
const after = Date.now();
const timestampInMillis = new Date(
pendingLetter.queueTimestamp,
).valueOf();
expect(timestampInMillis).toBeGreaterThanOrEqual(before);
expect(timestampInMillis).toBeLessThanOrEqual(after);
assertTtl(pendingLetter.ttl, before, after);
});
it("throws LetterAlreadyExistsError when creating a letter which already exists", async () => {
await letterQueueRepository.putLetter(createLetter());
await expect(
letterQueueRepository.putLetter(createLetter()),
).rejects.toThrow(LetterAlreadyExistsError);
});
it("rethrows errors from DynamoDB when creating a letter", async () => {
const misconfiguredRepository = new LetterQueueRepository(
db.docClient,
logger,
{
...db.config,
letterQueueTableName: "nonexistent-table",
},
);
await expect(
misconfiguredRepository.putLetter(createLetter()),
).rejects.toThrow("Cannot do operations on a non-existent table");
});
});
});