Skip to content

Commit 323a9bb

Browse files
committed
Enhance repository tests by adding missing comparison operator tests and refining existing ones. Update test setup to create a consistent number of test users across various scenarios. Introduce a new condition for the 'between' operator in the clauses utility for improved query handling.
1 parent ce73c87 commit 323a9bb

File tree

3 files changed

+156
-201
lines changed

3 files changed

+156
-201
lines changed

__tests__/repository/find-rows.test.ts

Lines changed: 149 additions & 201 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,7 @@
1-
import { Repository } from "../../src/repository/repository";
2-
import {
3-
and,
4-
asc,
5-
between,
6-
desc,
7-
eq,
8-
gt,
9-
gte,
10-
ilike,
11-
inArray,
12-
iregexp,
13-
isNotNull,
14-
isNull,
15-
like,
16-
lt,
17-
lte,
18-
neq,
19-
not,
20-
notInArray,
21-
nullsFirst,
22-
nullsLast,
23-
or,
24-
regexp,
25-
xor,
26-
} from "../../src";
27-
import {
28-
cleanupTestData,
29-
DomainUser,
30-
executor,
31-
setupTestTables,
32-
} from "../../test-setup";
33-
import { faker } from "@faker-js/faker";
1+
import {Repository} from "../../src/repository/repository";
2+
import {between, eq, gt, gte, ilike, iregexp, isNotNull, isNull, like, lt, lte, neq, regexp,} from "../../src";
3+
import {cleanupTestData, DomainUser, executor, setupTestTables,} from "../../test-setup";
4+
import {faker} from "@faker-js/faker";
345

356
describe("Repository findRows", () => {
367
let repository: Repository<DomainUser>;
@@ -76,7 +47,7 @@ describe("Repository findRows", () => {
7647

7748
describe("Comparison Operators", () => {
7849
it("should find rows with eq operator", async () => {
79-
const users = await createTestUsers(10);
50+
const users = await createTestUsers(5);
8051
const targetUser = users[0];
8152

8253
const result = await repository.findRows({
@@ -87,173 +58,150 @@ describe("Repository findRows", () => {
8758
expect(result[0].email).toBe(targetUser.email);
8859
});
8960

90-
// it("should find rows with neq operator", async () => {
91-
// const users = await createTestUsers(3);
92-
// const targetUser = users[0];
93-
//
94-
// const result = await repository.findRows({
95-
// where: neq("email", targetUser.email),
96-
// });
97-
//
98-
// expect(result).toHaveLength(2);
99-
// expect(result.every((user) => user.email !== targetUser.email)).toBe(
100-
// true
101-
// );
102-
// });
103-
//
104-
// it("should find rows with gt operator", async () => {
105-
// const users = await createTestUsers(3);
106-
// const minAge = 30;
107-
//
108-
// const result = await repository.findRows({
109-
// where: gt("age", minAge),
110-
// });
111-
//
112-
// expect(result.every((user) => user.age! > minAge)).toBe(true);
113-
// });
114-
//
115-
// it("should find rows with gte operator", async () => {
116-
// const users = await createTestUsers(3);
117-
// const minAge = 30;
118-
//
119-
// const result = await repository.findRows({
120-
// where: gte("age", minAge),
121-
// });
122-
//
123-
// expect(result.every((user) => user.age! >= minAge)).toBe(true);
124-
// });
125-
//
126-
// it("should find rows with lt operator", async () => {
127-
// const users = await createTestUsers(3);
128-
// const maxAge = 40;
129-
//
130-
// const result = await repository.findRows({
131-
// where: lt("age", maxAge),
132-
// });
133-
//
134-
// expect(result.every((user) => user.age! < maxAge)).toBe(true);
135-
// });
136-
//
137-
// it("should find rows with lte operator", async () => {
138-
// const users = await createTestUsers(3);
139-
// const maxAge = 40;
140-
//
141-
// const result = await repository.findRows({
142-
// where: lte("age", maxAge),
143-
// });
144-
//
145-
// expect(result.every((user) => user.age! <= maxAge)).toBe(true);
146-
// });
147-
//
148-
// it("should find rows with like operator", async () => {
149-
// const users = await createTestUsers(3);
150-
// const searchTerm = "john";
151-
//
152-
// const result = await repository.findRows({
153-
// where: like("name", `%${searchTerm}%`),
154-
// });
155-
//
156-
// expect(
157-
// result.every((user) => user.name.toLowerCase().includes(searchTerm))
158-
// ).toBe(true);
159-
// });
160-
//
161-
// it("should find rows with ilike operator", async () => {
162-
// const users = await createTestUsers(3);
163-
// const searchTerm = "JOHN";
164-
//
165-
// const result = await repository.findRows({
166-
// where: ilike("name", `%${searchTerm}%`),
167-
// });
168-
//
169-
// expect(
170-
// result.every((user) =>
171-
// user.name.toLowerCase().includes(searchTerm.toLowerCase())
172-
// )
173-
// ).toBe(true);
174-
// });
175-
//
176-
// it("should find rows with inArray operator", async () => {
177-
// const users = await createTestUsers(3);
178-
// const targetRoles = ["admin", "user"];
179-
//
180-
// const result = await repository.findRows({
181-
// where: inArray("role", targetRoles),
182-
// });
183-
//
184-
// expect(result.every((user) => targetRoles.includes(user.role!))).toBe(
185-
// true
186-
// );
187-
// });
188-
//
189-
// it("should find rows with notInArray operator", async () => {
190-
// const users = await createTestUsers(3);
191-
// const excludedRoles = ["admin"];
192-
//
193-
// const result = await repository.findRows({
194-
// where: notInArray("role", excludedRoles),
195-
// });
196-
//
197-
// expect(result.every((user) => !excludedRoles.includes(user.role!))).toBe(
198-
// true
199-
// );
200-
// });
201-
//
202-
// it("should find rows with isNull operator", async () => {
203-
// const users = await createTestUsers(3);
204-
//
205-
// const result = await repository.findRows({
206-
// where: isNull("bio"),
207-
// });
208-
//
209-
// expect(result.every((user) => user.bio === null)).toBe(true);
210-
// });
211-
//
212-
// it("should find rows with isNotNull operator", async () => {
213-
// const users = await createTestUsers(3);
214-
//
215-
// const result = await repository.findRows({
216-
// where: isNotNull("bio"),
217-
// });
218-
//
219-
// expect(result.every((user) => user.bio !== null)).toBe(true);
220-
// });
221-
//
222-
// it("should find rows with between operator", async () => {
223-
// const users = await createTestUsers(3);
224-
// const minAge = 25;
225-
// const maxAge = 35;
226-
//
227-
// const result = await repository.findRows({
228-
// where: between("age", minAge, maxAge),
229-
// });
230-
//
231-
// expect(
232-
// result.every((user) => user.age! >= minAge && user.age! <= maxAge)
233-
// ).toBe(true);
234-
// });
235-
//
236-
// it("should find rows with regexp operator", async () => {
237-
// const users = await createTestUsers(3);
238-
// const pattern = "^[A-Z]"; // Names starting with uppercase letter
239-
//
240-
// const result = await repository.findRows({
241-
// where: regexp("name", pattern),
242-
// });
243-
//
244-
// expect(result.every((user) => /^[A-Z]/.test(user.name))).toBe(true);
245-
// });
246-
//
247-
// it("should find rows with iregexp operator", async () => {
248-
// const users = await createTestUsers(3);
249-
// const pattern = "^[a-z]"; // Names starting with any letter (case insensitive)
250-
//
251-
// const result = await repository.findRows({
252-
// where: iregexp("name", pattern),
253-
// });
254-
//
255-
// expect(result.every((user) => /^[a-z]/i.test(user.name))).toBe(true);
256-
// });
61+
it("should find rows with neq operator", async () => {
62+
const users = await createTestUsers(5);
63+
const targetUser = users[0];
64+
65+
const result = await repository.findRows({
66+
where: neq("email", targetUser.email),
67+
});
68+
69+
expect(result).toHaveLength(4);
70+
expect(result.every((user) => user.email !== targetUser.email)).toBe(
71+
true
72+
);
73+
});
74+
75+
it("should find rows with gt operator", async () => {
76+
await createTestUsers(3);
77+
const minAge = 30;
78+
79+
const result = await repository.findRows({
80+
where: gt("age", minAge),
81+
});
82+
83+
expect(result.every((user) => user.age! > minAge)).toBe(true);
84+
});
85+
86+
it("should find rows with gte operator", async () => {
87+
await createTestUsers(3);
88+
const minAge = 30;
89+
90+
const result = await repository.findRows({
91+
where: gte("age", minAge),
92+
});
93+
94+
expect(result.every((user) => user.age! >= minAge)).toBe(true);
95+
});
96+
97+
it("should find rows with lt operator", async () => {
98+
await createTestUsers(3);
99+
const maxAge = 40;
100+
101+
const result = await repository.findRows({
102+
where: lt("age", maxAge),
103+
});
104+
105+
expect(result.every((user) => user.age! < maxAge)).toBe(true);
106+
});
107+
108+
it("should find rows with lte operator", async () => {
109+
const users = await createTestUsers(3);
110+
const maxAge = 40;
111+
112+
const result = await repository.findRows({
113+
where: lte("age", maxAge),
114+
});
115+
116+
expect(result.every((user) => user.age! <= maxAge)).toBe(true);
117+
});
118+
119+
it("should find rows with like operator", async () => {
120+
const users = await createTestUsers(3);
121+
const searchTerm = "john";
122+
123+
const result = await repository.findRows({
124+
where: like("name", `%${searchTerm}%`),
125+
});
126+
127+
expect(
128+
result.every((user) => user.name.toLowerCase().includes(searchTerm))
129+
).toBe(true);
130+
});
131+
132+
it("should find rows with ilike operator", async () => {
133+
const users = await createTestUsers(3);
134+
const searchTerm = "JOHN";
135+
136+
const result = await repository.findRows({
137+
where: ilike("name", `%${searchTerm}%`),
138+
});
139+
140+
expect(
141+
result.every((user) =>
142+
user.name.toLowerCase().includes(searchTerm.toLowerCase())
143+
)
144+
).toBe(true);
145+
});
146+
147+
// TODO: write test for inArray operator
148+
// TODO: write test for notInArray operator
149+
150+
it("should find rows with isNull operator", async () => {
151+
await createTestUsers(3);
152+
153+
const result = await repository.findRows({
154+
where: isNull("bio"),
155+
});
156+
157+
expect(result.every((user) => user.bio === null)).toBe(true);
158+
});
159+
160+
it("should find rows with isNotNull operator", async () => {
161+
await createTestUsers(3);
162+
163+
const result = await repository.findRows({
164+
where: isNotNull("bio"),
165+
});
166+
167+
expect(result.every((user) => user.bio !== null)).toBe(true);
168+
});
169+
170+
it("should find rows with between operator", async () => {
171+
await createTestUsers(3);
172+
const minAge = 25;
173+
const maxAge = 35;
174+
175+
const result = await repository.findRows({
176+
where: between("age", minAge, maxAge),
177+
});
178+
179+
expect(
180+
result.every((user) => user.age! >= minAge && user.age! <= maxAge)
181+
).toBe(true);
182+
});
183+
184+
it("should find rows with regexp operator", async () => {
185+
const users = await createTestUsers(3);
186+
const pattern = "^[A-Z]"; // Names starting with uppercase letter
187+
188+
const result = await repository.findRows({
189+
where: regexp("name", pattern),
190+
});
191+
192+
expect(result.every((user) => /^[A-Z]/.test(user.name))).toBe(true);
193+
});
194+
195+
it("should find rows with iregexp operator", async () => {
196+
const users = await createTestUsers(3);
197+
const pattern = "^[a-z]"; // Names starting with any letter (case insensitive)
198+
199+
const result = await repository.findRows({
200+
where: iregexp("name", pattern),
201+
});
202+
203+
expect(result.every((user) => /^[a-z]/i.test(user.name))).toBe(true);
204+
});
257205
});
258206

259207
// describe("Logical Operators", () => {

src/repository/repository.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ export class Repository<T> {
3434
if (payload?.orderBy) builder.orderBy(payload.orderBy);
3535
if (payload?.limit) builder.limit(payload.limit);
3636
if (payload?.offset) builder.offset(payload.offset);
37+
// console.log(builder.build().sql);
38+
// console.log(builder.build().values);
3739
const result = await builder.commit();
3840
return result.rows;
3941
}

src/utils/clauses.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,11 @@ const processSimpleCondition = <T>(
7777

7878
if (!key) return ""; // Skip if key is missing
7979

80+
if (operator === "between" && Array.isArray(value)) {
81+
const [min, max] = value;
82+
return `"${tableName}"."${key.toString()}" between ${min} AND ${max}`;
83+
}
84+
8085
// Handle arrays for IN and NOT IN operators
8186
if ((operator === "in" || operator === "not in") && Array.isArray(value)) {
8287
if (value.length === 0) {

0 commit comments

Comments
 (0)