alepha
Version:
Easy-to-use modern TypeScript framework for building many kind of applications.
345 lines (316 loc) • 12.8 kB
text/typescript
import { Alepha } from "alepha";
import { describe, it } from "vitest";
import { AlephaOrmPostgres } from "../postgres/index.ts";
import {
testCombineBaseAndJoinedTableFilters,
testComplexWhereWithMultipleJoinFilters,
testDeeplyNestedSelfReference,
testEmptyResultSetWithJoins,
testFilterByJoinedTableColumn,
testFilterByNestedJoinedTableColumn,
testFilterBySelfReferencingJoin,
testFindMultipleWithJoins,
testFindWithJoinsAndLimit,
testFindWithJoinsAndOffset,
testInnerJoin,
testInnerJoinNoMatchingRecords,
testJoinWithNullForeignKey,
testLeftJoinSqlWrapper,
testLeftJoinTupleSyntax,
testMultipleJoins,
testMultipleJoinsWithDifferentTypes,
testMultipleNestedJoinsWithManagerAndCities,
testNestedJoin2LevelsPostAuthorCity,
testNestedJoin2LevelsUserCityCountry,
testNestedJoin3LevelsPostAuthorCityCountry,
testPaginateWithJoins,
testPaginateWithNestedJoins,
testPostWithAuthorCommentsAndCommentAuthors,
testSameTableJoinedMultipleTimesWithAliases,
testSelfReferencingJoinWithManager,
testSelfReferencingJoinWithoutManager,
testSimpleLeftJoin,
} from "./joins-tests.ts";
describe("joins", () => {
describe("basic joins", () => {
it("should do simple left join (sqlite)", async () => {
await testSimpleLeftJoin(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should do simple left join (postgres)", async () => {
await testSimpleLeftJoin(Alepha.create().with(AlephaOrmPostgres));
});
it("should do left join with tuple syntax (sqlite)", async () => {
await testLeftJoinTupleSyntax(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should do left join with tuple syntax (postgres)", async () => {
await testLeftJoinTupleSyntax(Alepha.create().with(AlephaOrmPostgres));
});
// SQLite: entity column refs (users.cols.id) passed to drizzle's sql`` tag become
// bind parameters. node:sqlite interprets objects with a `name` property as named
// parameter dictionaries, causing "Unknown named parameter" errors. Use tuple syntax instead.
it.skip("should do left join with sql wrapper (sqlite)", async () => {
await testLeftJoinSqlWrapper(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should do left join with sql wrapper (postgres)", async () => {
await testLeftJoinSqlWrapper(Alepha.create().with(AlephaOrmPostgres));
});
it("should do inner join (sqlite)", async () => {
await testInnerJoin(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should do inner join (postgres)", async () => {
await testInnerJoin(Alepha.create().with(AlephaOrmPostgres));
});
});
describe("self-referencing joins", () => {
it("should join user with manager (sqlite)", async () => {
await testSelfReferencingJoinWithManager(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should join user with manager (postgres)", async () => {
await testSelfReferencingJoinWithManager(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should find users without manager (sqlite)", async () => {
await testSelfReferencingJoinWithoutManager(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should find users without manager (postgres)", async () => {
await testSelfReferencingJoinWithoutManager(
Alepha.create().with(AlephaOrmPostgres),
);
});
});
describe("multiple joins", () => {
it("should join user with profile and city (sqlite)", async () => {
await testMultipleJoins(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should join user with profile and city (postgres)", async () => {
await testMultipleJoins(Alepha.create().with(AlephaOrmPostgres));
});
it("should support multiple joins with different types (sqlite)", async () => {
await testMultipleJoinsWithDifferentTypes(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should support multiple joins with different types (postgres)", async () => {
await testMultipleJoinsWithDifferentTypes(
Alepha.create().with(AlephaOrmPostgres),
);
});
});
describe("nested joins", () => {
it("should nest 2 levels: user -> city -> country (sqlite)", async () => {
await testNestedJoin2LevelsUserCityCountry(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should nest 2 levels: user -> city -> country (postgres)", async () => {
await testNestedJoin2LevelsUserCityCountry(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should nest 2 levels: post -> author -> city (sqlite)", async () => {
await testNestedJoin2LevelsPostAuthorCity(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should nest 2 levels: post -> author -> city (postgres)", async () => {
await testNestedJoin2LevelsPostAuthorCity(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should handle multiple nested joins with manager and cities (sqlite)", async () => {
await testMultipleNestedJoinsWithManagerAndCities(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should handle multiple nested joins with manager and cities (postgres)", async () => {
await testMultipleNestedJoinsWithManagerAndCities(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should nest 3 levels: post -> author -> city -> country (sqlite)", async () => {
await testNestedJoin3LevelsPostAuthorCityCountry(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should nest 3 levels: post -> author -> city -> country (postgres)", async () => {
await testNestedJoin3LevelsPostAuthorCityCountry(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should handle deeply nested self-reference: user -> manager -> manager (sqlite)", async () => {
await testDeeplyNestedSelfReference(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should handle deeply nested self-reference: user -> manager -> manager (postgres)", async () => {
await testDeeplyNestedSelfReference(
Alepha.create().with(AlephaOrmPostgres),
);
});
});
describe("where clause on joined tables", () => {
it("should filter by joined table column (sqlite)", async () => {
await testFilterByJoinedTableColumn(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should filter by joined table column (postgres)", async () => {
await testFilterByJoinedTableColumn(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should filter by nested joined table column (sqlite)", async () => {
await testFilterByNestedJoinedTableColumn(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should filter by nested joined table column (postgres)", async () => {
await testFilterByNestedJoinedTableColumn(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should combine base and joined table filters (sqlite)", async () => {
await testCombineBaseAndJoinedTableFilters(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should combine base and joined table filters (postgres)", async () => {
await testCombineBaseAndJoinedTableFilters(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should filter by self-referencing join (sqlite)", async () => {
await testFilterBySelfReferencingJoin(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should filter by self-referencing join (postgres)", async () => {
await testFilterBySelfReferencingJoin(
Alepha.create().with(AlephaOrmPostgres),
);
});
});
describe("find multiple with joins", () => {
it("should find multiple entities with joins (sqlite)", async () => {
await testFindMultipleWithJoins(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should find multiple entities with joins (postgres)", async () => {
await testFindMultipleWithJoins(Alepha.create().with(AlephaOrmPostgres));
});
it("should find with joins and limit (sqlite)", async () => {
await testFindWithJoinsAndLimit(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should find with joins and limit (postgres)", async () => {
await testFindWithJoinsAndLimit(Alepha.create().with(AlephaOrmPostgres));
});
it("should find with joins and offset (sqlite)", async () => {
await testFindWithJoinsAndOffset(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should find with joins and offset (postgres)", async () => {
await testFindWithJoinsAndOffset(Alepha.create().with(AlephaOrmPostgres));
});
});
describe("complex scenarios", () => {
it("should handle post with author, comments, and comment authors (sqlite)", async () => {
await testPostWithAuthorCommentsAndCommentAuthors(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should handle post with author, comments, and comment authors (postgres)", async () => {
await testPostWithAuthorCommentsAndCommentAuthors(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should handle join with null foreign key (sqlite)", async () => {
await testJoinWithNullForeignKey(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should handle join with null foreign key (postgres)", async () => {
await testJoinWithNullForeignKey(Alepha.create().with(AlephaOrmPostgres));
});
it("should handle complex where with multiple join filters and operators (sqlite)", async () => {
await testComplexWhereWithMultipleJoinFilters(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should handle complex where with multiple join filters and operators (postgres)", async () => {
await testComplexWhereWithMultipleJoinFilters(
Alepha.create().with(AlephaOrmPostgres),
);
});
});
describe("pagination with joins", () => {
it("should paginate with joins (sqlite)", async () => {
await testPaginateWithJoins(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should paginate with joins (postgres)", async () => {
await testPaginateWithJoins(Alepha.create().with(AlephaOrmPostgres));
});
it("should paginate with nested joins (sqlite)", async () => {
await testPaginateWithNestedJoins(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should paginate with nested joins (postgres)", async () => {
await testPaginateWithNestedJoins(
Alepha.create().with(AlephaOrmPostgres),
);
});
});
describe("edge cases", () => {
it("should return empty result for inner join with no matching records (sqlite)", async () => {
await testInnerJoinNoMatchingRecords(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should return empty result for inner join with no matching records (postgres)", async () => {
await testInnerJoinNoMatchingRecords(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should join same table multiple times with aliases (sqlite)", async () => {
await testSameTableJoinedMultipleTimesWithAliases(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should join same table multiple times with aliases (postgres)", async () => {
await testSameTableJoinedMultipleTimesWithAliases(
Alepha.create().with(AlephaOrmPostgres),
);
});
it("should return empty result set with joins (sqlite)", async () => {
await testEmptyResultSetWithJoins(
Alepha.create({ env: { DATABASE_URL: "sqlite://:memory:" } }),
);
});
it("should return empty result set with joins (postgres)", async () => {
await testEmptyResultSetWithJoins(
Alepha.create().with(AlephaOrmPostgres),
);
});
});
});