Skip to content

Commit 8de08a5

Browse files
Merge pull request #630 from dolthub/eric/dolt-test
Add dolt_tests to workbench
2 parents 13d4088 + 993aba2 commit 8de08a5

File tree

43 files changed

+3405
-67
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+3405
-67
lines changed

graphql-server/schema.gql

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -339,6 +339,37 @@ type TagList {
339339
list: [Tag!]!
340340
}
341341

342+
type Test {
343+
_id: ID!
344+
databaseName: String!
345+
refName: String!
346+
testName: String!
347+
testGroup: String!
348+
testQuery: String!
349+
assertionType: String!
350+
assertionComparator: String!
351+
assertionValue: String!
352+
}
353+
354+
type TestList {
355+
list: [Test!]!
356+
}
357+
358+
type TestResult {
359+
_id: ID!
360+
databaseName: String!
361+
refName: String!
362+
testName: String!
363+
testGroupName: String
364+
query: String!
365+
status: String!
366+
message: String!
367+
}
368+
369+
type TestResultList {
370+
list: [TestResult!]!
371+
}
372+
342373
type Query {
343374
branch(databaseName: String!, branchName: String!): Branch
344375
branchOrDefault(databaseName: String!, branchName: String): Branch
@@ -378,6 +409,8 @@ type Query {
378409
tables(schemaName: String, refName: String!, databaseName: String!, filterSystemTables: Boolean): [Table!]!
379410
tags(databaseName: String!): TagList!
380411
tag(databaseName: String!, tagName: String!): Tag
412+
tests(databaseName: String!, refName: String!): TestList!
413+
runTests(refName: String!, databaseName: String!, testIdentifier: TestIdentifierArgs): TestResultList!
381414
}
382415

383416
enum SortBranchesBy {
@@ -405,6 +438,11 @@ enum DiffRowType {
405438
All
406439
}
407440

441+
input TestIdentifierArgs {
442+
testName: String
443+
groupName: String
444+
}
445+
408446
type Mutation {
409447
createBranch(databaseName: String!, newBranchName: String!, fromRefName: String!): String!
410448
deleteBranch(databaseName: String!, branchName: String!): Boolean!
@@ -426,6 +464,7 @@ type Mutation {
426464
restoreAllTables(databaseName: String!, refName: String!): Boolean!
427465
createTag(tagName: String!, databaseName: String!, message: String, fromRefName: String!, author: AuthorInfo): String!
428466
deleteTag(databaseName: String!, tagName: String!): Boolean!
467+
saveTests(refName: String!, databaseName: String!, tests: TestListArgs!): TestList!
429468
}
430469

431470
enum ImportOperation {
@@ -449,4 +488,17 @@ enum LoadDataModifier {
449488
input AuthorInfo {
450489
name: String!
451490
email: String!
491+
}
492+
493+
input TestListArgs {
494+
list: [TestArgs!]!
495+
}
496+
497+
input TestArgs {
498+
testName: String!
499+
testGroup: String!
500+
testQuery: String!
501+
assertionType: String!
502+
assertionComparator: String!
503+
assertionValue: String!
452504
}

graphql-server/src/queryFactory/dolt/doltEntityManager.ts

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
import { EntityManager } from "typeorm";
1+
import { EntityManager, InsertResult } from "typeorm";
22
import { SchemaType } from "../../schemas/schema.enums";
33
import { SchemaItem } from "../../schemas/schema.model";
44
import { DoltSystemTable } from "../../systemTables/systemTable.enums";
55
import { ROW_LIMIT, handleTableNotFound } from "../../utils";
66
import { tableWithSchema } from "../postgres/utils";
77
import * as t from "../types";
88
import { getOrderByColForBranches } from "./queries";
9+
import { TestArgs } from "../types";
910

1011
export async function getDoltSchemas(
1112
em: EntityManager,
@@ -184,3 +185,42 @@ export async function getDoltRemotesPaginated(
184185
.limit(ROW_LIMIT + 1)
185186
.getRawMany();
186187
}
188+
189+
export async function getDoltTests(em: EntityManager): t.PR {
190+
return em
191+
.createQueryBuilder()
192+
.select("*")
193+
.from("dolt_tests", "")
194+
.getRawMany();
195+
}
196+
197+
export async function saveDoltTests(
198+
em: EntityManager,
199+
tests: TestArgs[],
200+
): Promise<InsertResult> {
201+
return em.transaction(async transactionalEntityManager => {
202+
await transactionalEntityManager
203+
.createQueryBuilder()
204+
.delete()
205+
.from("dolt_tests")
206+
.execute();
207+
208+
return transactionalEntityManager
209+
.createQueryBuilder()
210+
.insert()
211+
.into("dolt_tests")
212+
.values(
213+
tests.map(t => {
214+
return {
215+
test_name: t.testName,
216+
test_group: t.testGroup,
217+
test_query: t.testQuery,
218+
assertion_type: t.assertionType,
219+
assertion_comparator: t.assertionComparator,
220+
assertion_value: t.assertionValue,
221+
};
222+
}),
223+
)
224+
.execute();
225+
});
226+
}

graphql-server/src/queryFactory/dolt/index.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import * as t from "../types";
1616
import * as dem from "./doltEntityManager";
1717
import * as qh from "./queries";
1818
import { getAuthorString, handleRefNotFound, unionCols } from "./utils";
19+
import { InsertResult } from "typeorm";
1920

2021
export class DoltQueryFactory
2122
extends MySQLQueryFactory
@@ -584,6 +585,38 @@ export class DoltQueryFactory
584585
qr.query(qh.callDoltClone, [args.remoteDbPath, args.databaseName]),
585586
);
586587
}
588+
589+
async getTests(args: t.RefArgs): t.PR {
590+
return this.queryForBuilder(
591+
async em => dem.getDoltTests(em),
592+
args.databaseName,
593+
args.refName,
594+
);
595+
}
596+
597+
async runTests(args: t.RunTestsArgs): t.PR {
598+
const withTestIdentifierArg =
599+
args.testIdentifier &&
600+
(args.testIdentifier.testName !== undefined ||
601+
args.testIdentifier.groupName !== undefined);
602+
603+
return this.query(
604+
qh.doltTestRun(withTestIdentifierArg),
605+
withTestIdentifierArg
606+
? [args.testIdentifier?.testName ?? args.testIdentifier?.groupName]
607+
: undefined,
608+
args.databaseName,
609+
args.refName,
610+
);
611+
}
612+
613+
async saveTests(args: t.SaveTestsArgs): Promise<InsertResult> {
614+
return this.queryForBuilder(
615+
async em => dem.saveDoltTests(em, args.tests.list),
616+
args.databaseName,
617+
args.refName,
618+
);
619+
}
587620
}
588621

589622
async function getTableInfoWithQR(

graphql-server/src/queryFactory/dolt/queries.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,3 +181,6 @@ export const callResetHard = `CALL DOLT_RESET("--hard")`;
181181
export const callCheckoutTable = `CALL DOLT_CHECKOUT(?)`;
182182

183183
export const callDoltClone = `CALL DOLT_CLONE(?,?)`;
184+
185+
export const doltTestRun = (withArg?: boolean): string =>
186+
`SELECT * FROM DOLT_TEST_RUN(${withArg ? "?" : ""})`;

graphql-server/src/queryFactory/doltgres/index.ts

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { QueryRunner } from "typeorm";
1+
import { InsertResult, QueryRunner } from "typeorm";
22
import { QueryFactory } from "..";
33
import * as column from "../../columns/column.model";
44
import { CommitDiffType } from "../../diffSummaries/diffSummary.enums";
@@ -559,6 +559,38 @@ export class DoltgresQueryFactory
559559
args.databaseName,
560560
);
561561
}
562+
563+
async getTests(args: t.RefArgs): t.PR {
564+
return this.queryForBuilder(
565+
async em => dem.getDoltTests(em),
566+
args.databaseName,
567+
args.refName,
568+
);
569+
}
570+
571+
async runTests(args: t.RunTestsArgs): t.PR {
572+
const withTestIdentifierArg =
573+
args.testIdentifier &&
574+
(args.testIdentifier.testName !== undefined ||
575+
args.testIdentifier.groupName !== undefined);
576+
577+
return this.query(
578+
qh.doltTestRun(withTestIdentifierArg),
579+
withTestIdentifierArg
580+
? [args.testIdentifier?.testName ?? args.testIdentifier?.groupName]
581+
: undefined,
582+
args.databaseName,
583+
args.refName,
584+
);
585+
}
586+
587+
async saveTests(args: t.SaveTestsArgs): Promise<InsertResult> {
588+
return this.queryForBuilder(
589+
async em => dem.saveDoltTests(em, args.tests.list),
590+
args.databaseName,
591+
args.refName,
592+
);
593+
}
562594
}
563595

564596
async function getTableInfoWithQR(

graphql-server/src/queryFactory/doltgres/queries.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,3 +192,6 @@ export const callPushRemote = `SELECT DOLT_PUSH($1::text, $2::text)`;
192192
export const callFetchRemote = `SELECT DOLT_FETCH($1::text)`;
193193

194194
export const callCreateBranchFromRemote = `CALL DOLT_BRANCH($1::text, $2::text)`;
195+
196+
export const doltTestRun = (withArg?: boolean): string =>
197+
`SELECT * FROM DOLT_TEST_RUN(${withArg ? "$1::text" : ""})`;

graphql-server/src/queryFactory/index.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DataSource, EntityManager, QueryRunner } from "typeorm";
1+
import { DataSource, EntityManager, InsertResult, QueryRunner } from "typeorm";
22
import { CommitDiffType } from "../diffSummaries/diffSummary.enums";
33
import { SchemaType } from "../schemas/schema.enums";
44
import { SchemaItem } from "../schemas/schema.model";
@@ -180,4 +180,10 @@ export declare class QueryFactory {
180180
callCreateBranchFromRemote(args: t.RemoteArgs): t.PR;
181181

182182
getMergeBase(args: t.RefsArgs): Promise<string>;
183+
184+
getTests(args: t.RefArgs): t.PR;
185+
186+
runTests(args: t.RunTestsArgs): t.PR;
187+
188+
saveTests(args: t.SaveTestsArgs): Promise<InsertResult>;
183189
}

graphql-server/src/queryFactory/mysql/index.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { EntityManager, QueryRunner } from "typeorm";
1+
import { EntityManager, InsertResult, QueryRunner } from "typeorm";
22
import { QueryFactory } from "..";
33
import { SchemaType } from "../../schemas/schema.enums";
44
import { SchemaItem } from "../../schemas/schema.model";
@@ -367,4 +367,16 @@ export class MySQLQueryFactory
367367
async callCreateBranchFromRemote(_: t.RemoteBranchArgs): t.PR {
368368
throw notDoltError("create branch from remote");
369369
}
370+
371+
async getTests(_: t.RefArgs): t.PR {
372+
throw notDoltError("get tests");
373+
}
374+
375+
async runTests(_: t.RefArgs): t.PR {
376+
throw notDoltError("run tests");
377+
}
378+
379+
async saveTests(_: t.SaveTestsArgs): Promise<InsertResult> {
380+
throw notDoltError("save tests");
381+
}
370382
}

graphql-server/src/queryFactory/types.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,28 @@ export type TableRowPagination = { pkCols: string[]; offset: number };
6868
export type DiffRes = Promise<{ colsUnion: RawRows; diff: RawRows }>;
6969
export type CommitsRes = Promise<{ fromCommitId: string; toCommitId: string }>;
7070
export type CommitAuthor = { name: string; email: string };
71+
72+
export type TestArgs = {
73+
testName: string;
74+
testGroup: string;
75+
testQuery: string;
76+
assertionType: string;
77+
assertionComparator: string;
78+
assertionValue: string;
79+
};
80+
81+
export type TestListArgs = {
82+
list: TestArgs[];
83+
};
84+
export type SaveTestsArgs = RefArgs & {
85+
tests: TestListArgs;
86+
};
87+
88+
export type TestIdentifierArgs = {
89+
testName?: string;
90+
groupName?: string;
91+
};
92+
93+
export type RunTestsArgs = RefArgs & {
94+
testIdentifier?: TestIdentifierArgs;
95+
};

graphql-server/src/resolvers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { StatusResolver } from "./status/status.resolver";
1616
import { TableResolver } from "./tables/table.resolver";
1717
import { FileUploadResolver } from "./tables/upload.resolver";
1818
import { TagResolver } from "./tags/tag.resolver";
19+
import { TestResolver } from "./tests/test.resolver";
1920

2021
const resolvers = [
2122
BranchResolver,
@@ -36,6 +37,7 @@ const resolvers = [
3637
StatusResolver,
3738
TableResolver,
3839
TagResolver,
40+
TestResolver,
3941
];
4042

4143
export default resolvers;

0 commit comments

Comments
 (0)