Skip to content
Merged
Show file tree
Hide file tree
Changes from 30 commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
0e78a39
initial test page display functionality
eric-richardson1 Sep 3, 2025
6fc6c4a
initial run tests functionality
eric-richardson1 Sep 5, 2025
ac39cdb
run tests working
eric-richardson1 Sep 12, 2025
46abe0e
Merge branch 'main' into eric/dolt-test
eric-richardson1 Sep 12, 2025
73c167b
smaller fixes
eric-richardson1 Sep 12, 2025
ddb6213
run tests before PR merge + more UX improvements
eric-richardson1 Sep 15, 2025
c205b85
more ux improvements and updating PR merge page
eric-richardson1 Sep 17, 2025
e0b9ab3
file structure refactor and cleanup
eric-richardson1 Sep 17, 2025
fc5c5e7
Address UI feedback
eric-richardson1 Sep 18, 2025
58745c4
more UI feedback
eric-richardson1 Sep 18, 2025
b8d9711
run prettier
eric-richardson1 Sep 18, 2025
7932781
run prettier - graphql server
eric-richardson1 Sep 18, 2025
a76ffa2
remove unused imports
eric-richardson1 Sep 18, 2025
3649ff6
more styling improvements
eric-richardson1 Sep 18, 2025
63a9c52
get rid of inline styling
eric-richardson1 Sep 18, 2025
7d10988
factor out statusUtils class
eric-richardson1 Sep 18, 2025
e2629e1
prettier
eric-richardson1 Sep 18, 2025
8dfc499
fix linter warnings
eric-richardson1 Sep 18, 2025
d214da9
UI improvements
eric-richardson1 Sep 18, 2025
2c325f2
decrease button spacing
eric-richardson1 Sep 18, 2025
6912709
run prettier
eric-richardson1 Sep 18, 2025
ccb1545
remove debug logs
eric-richardson1 Sep 18, 2025
4b59d4b
use blur events for updating assertion value
eric-richardson1 Sep 18, 2025
dfbf42e
prettier
eric-richardson1 Sep 18, 2025
cc9be6c
fix graphql-server feedback
eric-richardson1 Sep 22, 2025
f544e7c
use context instead of a massive hook, refactor some event handlers
eric-richardson1 Sep 23, 2025
5c46682
run prettier
eric-richardson1 Sep 23, 2025
3b943f5
fix ci errors
eric-richardson1 Sep 23, 2025
0034fe1
hide dolt_tests for doltgres
eric-richardson1 Sep 23, 2025
067ce12
add proper error handling
eric-richardson1 Sep 23, 2025
99b2a5f
Update web/renderer/components/pageComponents/DatabasePage/ForTests/c…
eric-richardson1 Sep 23, 2025
ca6d784
Update web/renderer/components/pageComponents/DatabasePage/index.tsx
eric-richardson1 Sep 23, 2025
fc81c29
Update web/renderer/components/pageComponents/DatabasePage/ForTests/T…
eric-richardson1 Sep 23, 2025
2addd3c
fix ci
eric-richardson1 Sep 23, 2025
993aba2
remove dead code
eric-richardson1 Sep 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions graphql-server/schema.gql
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,37 @@ type TagList {
list: [Tag!]!
}

type Test {
_id: ID!
databaseName: String!
refName: String!
testName: String!
testGroup: String!
testQuery: String!
assertionType: String!
assertionComparator: String!
assertionValue: String!
}

type TestList {
list: [Test!]!
}

type TestResult {
_id: ID!
databaseName: String!
refName: String!
testName: String!
testGroupName: String
query: String!
status: String!
message: String!
}

type TestResultList {
list: [TestResult!]!
}

type Query {
branch(databaseName: String!, branchName: String!): Branch
branchOrDefault(databaseName: String!, branchName: String): Branch
Expand Down Expand Up @@ -378,6 +409,8 @@ type Query {
tables(schemaName: String, refName: String!, databaseName: String!, filterSystemTables: Boolean): [Table!]!
tags(databaseName: String!): TagList!
tag(databaseName: String!, tagName: String!): Tag
tests(databaseName: String!, refName: String!): TestList!
runTests(refName: String!, databaseName: String!, testIdentifier: TestIdentifierArgs): TestResultList!
}

enum SortBranchesBy {
Expand Down Expand Up @@ -405,6 +438,11 @@ enum DiffRowType {
All
}

input TestIdentifierArgs {
testName: String
groupName: String
}

type Mutation {
createBranch(databaseName: String!, newBranchName: String!, fromRefName: String!): String!
deleteBranch(databaseName: String!, branchName: String!): Boolean!
Expand All @@ -426,6 +464,7 @@ type Mutation {
restoreAllTables(databaseName: String!, refName: String!): Boolean!
createTag(tagName: String!, databaseName: String!, message: String, fromRefName: String!, author: AuthorInfo): String!
deleteTag(databaseName: String!, tagName: String!): Boolean!
saveTests(refName: String!, databaseName: String!, tests: TestListArgs!): TestList!
}

enum ImportOperation {
Expand All @@ -449,4 +488,17 @@ enum LoadDataModifier {
input AuthorInfo {
name: String!
email: String!
}

input TestListArgs {
list: [TestArgs!]!
}

input TestArgs {
testName: String!
testGroup: String!
testQuery: String!
assertionType: String!
assertionComparator: String!
assertionValue: String!
}
42 changes: 41 additions & 1 deletion graphql-server/src/queryFactory/dolt/doltEntityManager.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { EntityManager } from "typeorm";
import { EntityManager, InsertResult } from "typeorm";
import { SchemaType } from "../../schemas/schema.enums";
import { SchemaItem } from "../../schemas/schema.model";
import { DoltSystemTable } from "../../systemTables/systemTable.enums";
import { ROW_LIMIT, handleTableNotFound } from "../../utils";
import { tableWithSchema } from "../postgres/utils";
import * as t from "../types";
import { getOrderByColForBranches } from "./queries";
import { TestArgs } from "../types";

export async function getDoltSchemas(
em: EntityManager,
Expand Down Expand Up @@ -184,3 +185,42 @@ export async function getDoltRemotesPaginated(
.limit(ROW_LIMIT + 1)
.getRawMany();
}

export async function getDoltTests(em: EntityManager): t.PR {
return em
.createQueryBuilder()
.select("*")
.from("dolt_tests", "")
.getRawMany();
}

export async function saveDoltTests(
em: EntityManager,
tests: TestArgs[],
): Promise<InsertResult> {
return em.transaction(async transactionalEntityManager => {
await transactionalEntityManager
.createQueryBuilder()
.delete()
.from("dolt_tests")
.execute();

return transactionalEntityManager
.createQueryBuilder()
.insert()
.into("dolt_tests")
.values(
tests.map(t => {
return {
test_name: t.testName,
test_group: t.testGroup,
test_query: t.testQuery,
assertion_type: t.assertionType,
assertion_comparator: t.assertionComparator,
assertion_value: t.assertionValue,
};
}),
)
.execute();
});
}
33 changes: 33 additions & 0 deletions graphql-server/src/queryFactory/dolt/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import * as t from "../types";
import * as dem from "./doltEntityManager";
import * as qh from "./queries";
import { getAuthorString, handleRefNotFound, unionCols } from "./utils";
import { InsertResult } from "typeorm";

export class DoltQueryFactory
extends MySQLQueryFactory
Expand Down Expand Up @@ -584,6 +585,38 @@ export class DoltQueryFactory
qr.query(qh.callDoltClone, [args.remoteDbPath, args.databaseName]),
);
}

async getTests(args: t.RefArgs): t.PR {
return this.queryForBuilder(
async em => dem.getDoltTests(em),
args.databaseName,
args.refName,
);
}

async runTests(args: t.RunTestsArgs): t.PR {
const withTestIdentifierArg =
args.testIdentifier &&
(args.testIdentifier.testName !== undefined ||
args.testIdentifier.groupName !== undefined);

return this.query(
qh.doltTestRun(withTestIdentifierArg),
withTestIdentifierArg
? [args.testIdentifier?.testName ?? args.testIdentifier?.groupName]
: undefined,
args.databaseName,
args.refName,
);
}

async saveTests(args: t.SaveTestsArgs): Promise<InsertResult> {
return this.queryForBuilder(
async em => dem.saveDoltTests(em, args.tests.list),
args.databaseName,
args.refName,
);
}
}

async function getTableInfoWithQR(
Expand Down
3 changes: 3 additions & 0 deletions graphql-server/src/queryFactory/dolt/queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -181,3 +181,6 @@ export const callResetHard = `CALL DOLT_RESET("--hard")`;
export const callCheckoutTable = `CALL DOLT_CHECKOUT(?)`;

export const callDoltClone = `CALL DOLT_CLONE(?,?)`;

export const doltTestRun = (withArg?: boolean): string =>
`SELECT * FROM DOLT_TEST_RUN(${withArg ? "?" : ""})`;
34 changes: 33 additions & 1 deletion graphql-server/src/queryFactory/doltgres/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { QueryRunner } from "typeorm";
import { InsertResult, QueryRunner } from "typeorm";
import { QueryFactory } from "..";
import * as column from "../../columns/column.model";
import { CommitDiffType } from "../../diffSummaries/diffSummary.enums";
Expand Down Expand Up @@ -559,6 +559,38 @@ export class DoltgresQueryFactory
args.databaseName,
);
}

async getTests(args: t.RefArgs): t.PR {
return this.queryForBuilder(
async em => dem.getDoltTests(em),
args.databaseName,
args.refName,
);
}

async runTests(args: t.RunTestsArgs): t.PR {
const withTestIdentifierArg =
args.testIdentifier &&
(args.testIdentifier.testName !== undefined ||
args.testIdentifier.groupName !== undefined);

return this.query(
qh.doltTestRun(withTestIdentifierArg),
withTestIdentifierArg
? [args.testIdentifier?.testName ?? args.testIdentifier?.groupName]
: undefined,
args.databaseName,
args.refName,
);
}

async saveTests(args: t.SaveTestsArgs): Promise<InsertResult> {
return this.queryForBuilder(
async em => dem.saveDoltTests(em, args.tests.list),
args.databaseName,
args.refName,
);
}
}

async function getTableInfoWithQR(
Expand Down
3 changes: 3 additions & 0 deletions graphql-server/src/queryFactory/doltgres/queries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@
refName: string,
schemaName?: string,
) =>
`DESCRIBE ${schemaName || "public"}."${tableWithoutSchema(tableName)}" AS OF '${refName}'`;

Check warning on line 151 in graphql-server/src/queryFactory/doltgres/queries.ts

View workflow job for this annotation

GitHub Actions / ci

Prefer using nullish coalescing operator (`??`) instead of a logical or (`||`), as it is a safer operator

export function getTableCommitDiffQuery(
args: t.RowDiffArgs,
Expand Down Expand Up @@ -192,3 +192,6 @@
export const callFetchRemote = `SELECT DOLT_FETCH($1::text)`;

export const callCreateBranchFromRemote = `CALL DOLT_BRANCH($1::text, $2::text)`;

export const doltTestRun = (withArg?: boolean): string =>
`SELECT * FROM DOLT_TEST_RUN(${withArg ? "$1::text" : ""})`;
8 changes: 7 additions & 1 deletion graphql-server/src/queryFactory/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { DataSource, EntityManager, QueryRunner } from "typeorm";
import { DataSource, EntityManager, InsertResult, QueryRunner } from "typeorm";
import { CommitDiffType } from "../diffSummaries/diffSummary.enums";
import { SchemaType } from "../schemas/schema.enums";
import { SchemaItem } from "../schemas/schema.model";
Expand Down Expand Up @@ -180,4 +180,10 @@ export declare class QueryFactory {
callCreateBranchFromRemote(args: t.RemoteArgs): t.PR;

getMergeBase(args: t.RefsArgs): Promise<string>;

getTests(args: t.RefArgs): t.PR;

runTests(args: t.RunTestsArgs): t.PR;

saveTests(args: t.SaveTestsArgs): Promise<InsertResult>;
}
14 changes: 13 additions & 1 deletion graphql-server/src/queryFactory/mysql/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { EntityManager, QueryRunner } from "typeorm";
import { EntityManager, InsertResult, QueryRunner } from "typeorm";
import { QueryFactory } from "..";
import { SchemaType } from "../../schemas/schema.enums";
import { SchemaItem } from "../../schemas/schema.model";
Expand Down Expand Up @@ -367,4 +367,16 @@ export class MySQLQueryFactory
async callCreateBranchFromRemote(_: t.RemoteBranchArgs): t.PR {
throw notDoltError("create branch from remote");
}

async getTests(_: t.RefArgs): t.PR {
throw notDoltError("get tests");
}

async runTests(_: t.RefArgs): t.PR {
throw notDoltError("run tests");
}

async saveTests(_: t.SaveTestsArgs): Promise<InsertResult> {
throw notDoltError("save tests");
}
}
25 changes: 25 additions & 0 deletions graphql-server/src/queryFactory/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@
offset: number;
};

export type RawRow = Record<string, any>;

Check warning on line 58 in graphql-server/src/queryFactory/types.ts

View workflow job for this annotation

GitHub Actions / ci

Unexpected any. Specify a different type
export type RawRows = RawRow[];
export type PR = Promise<RawRows>;
export type SPR = Promise<RawRow>;
Expand All @@ -68,3 +68,28 @@
export type DiffRes = Promise<{ colsUnion: RawRows; diff: RawRows }>;
export type CommitsRes = Promise<{ fromCommitId: string; toCommitId: string }>;
export type CommitAuthor = { name: string; email: string };

export type TestArgs = {
testName: string;
testGroup: string;
testQuery: string;
assertionType: string;
assertionComparator: string;
assertionValue: string;
};

export type TestListArgs = {
list: TestArgs[];
};
export type SaveTestsArgs = RefArgs & {
tests: TestListArgs;
};

export type TestIdentifierArgs = {
testName?: string;
groupName?: string;
};

export type RunTestsArgs = RefArgs & {
testIdentifier?: TestIdentifierArgs;
};
2 changes: 2 additions & 0 deletions graphql-server/src/resolvers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { StatusResolver } from "./status/status.resolver";
import { TableResolver } from "./tables/table.resolver";
import { FileUploadResolver } from "./tables/upload.resolver";
import { TagResolver } from "./tags/tag.resolver";
import { TestResolver } from "./tests/test.resolver";

const resolvers = [
BranchResolver,
Expand All @@ -36,6 +37,7 @@ const resolvers = [
StatusResolver,
TableResolver,
TagResolver,
TestResolver,
];

export default resolvers;
1 change: 1 addition & 0 deletions graphql-server/src/systemTables/systemTable.enums.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export enum DoltSystemTable {
QUERY_CATALOG = "dolt_query_catalog",
SCHEMAS = "dolt_schemas",
PROCEDURES = "dolt_procedures",
TESTS = "dolt_tests",
}

export const systemTableValues = Object.values(DoltSystemTable);
Loading
Loading