Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow testing features of different versions #670

Merged
merged 24 commits into from
Jul 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
e19ac89
Bump to latest dependencies
scotttrinh Jun 27, 2023
25917cc
Move existing tests to integration-stable
scotttrinh Jun 27, 2023
9373fe8
Copy existing tests to integration-lts
scotttrinh Jun 27, 2023
9d64f90
Move CLI smoke test back to generate tests
scotttrinh Jun 27, 2023
2110f3e
Fix package name for LTS integration
scotttrinh Jun 27, 2023
9c82787
Add integration-nightly package
scotttrinh Jun 27, 2023
4890a3a
Update test workflow
scotttrinh Jun 27, 2023
49ae89d
Get generate tests working again
scotttrinh Jun 27, 2023
ec2f019
stable and nightly only test changes
scotttrinh Jun 28, 2023
cac2245
LINT: import types
scotttrinh Jun 28, 2023
9933b81
Add no-op build run script to integration pkgs
scotttrinh Jun 28, 2023
84ed3a0
Add CI runner run script
scotttrinh Jun 28, 2023
e35043a
Ensure ts-node is installed for jest.config.ts
scotttrinh Jun 28, 2023
94c6a5e
Add include to tsconfig
scotttrinh Jun 28, 2023
2bde39e
Give up on jest.config.ts
scotttrinh Jun 28, 2023
a0a9a31
Revert changes the required code updates
scotttrinh Jun 28, 2023
f8a9486
Increase timeout for test teardown
scotttrinh Jun 28, 2023
1f5ac9d
Remove ext::pgvector related schema changes
scotttrinh Jun 28, 2023
0a413c9
Add legacy integration test suite
scotttrinh Jul 11, 2023
9b5fb71
Test v1 and v2 against legacy integration tests
scotttrinh Jul 11, 2023
e6ab6da
Merge branch 'master' into test-multiple-versions
scotttrinh Jul 11, 2023
1c9ea80
Oops, I meant 2
scotttrinh Jul 11, 2023
b241fb4
Move integration tests into separate subfolder
scotttrinh Jul 11, 2023
da6e8dc
Update references that broke due to reorg
scotttrinh Jul 11, 2023
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
28 changes: 21 additions & 7 deletions .github/workflows/tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@ jobs:
- os: ubuntu-latest
node-version: "18"
edgedb-version: "2"
- os: ubuntu-latest
node-version: "18"
edgedb-version: "1"
- os: macos-latest
node-version: "18"
edgedb-version: "stable"
# - os: windows-2019
# node-version: "16"
# edgedb-version: "stable"

steps:
- uses: actions/checkout@v2
Expand Down Expand Up @@ -99,14 +99,28 @@ jobs:
echo ACTIVE_EDGEDB_VERSION=$(edgedb query 'select sys::get_version_as_str()' -I test) >> $GITHUB_ENV

- name: Run query builder tests
if: ${{ matrix.node-version >= 16 && matrix.edgedb-version != '1.4'}}
run: |
yarn workspace @edgedb/generate test:ci

- name: Test QB generation on v1
if: ${{ matrix.node-version >= 16 && matrix.edgedb-version == '1.4' }}
- name: Run query builder integration tests legacy
if: ${{ matrix.edgedb-version == '1' || matrix.edgedb-version == '2' }}
run: |
yarn workspace @edgedb/integration-legacy test:ci

- name: Run query builder integration tests lts
if: ${{ matrix.edgedb-version == '2' || matrix.edgedb-version == 'stable' || matrix.edgedb-version == 'nightly' }}
run: |
yarn workspace @edgedb/integration-lts test:ci

- name: Run query builder integration tests stable
if: ${{ matrix.edgedb-version == 'stable' || matrix.edgedb-version == 'nightly' }}
run: |
yarn workspace @edgedb/integration-stable test:ci

- name: Run query builder integration tests nightly
if: ${{ matrix.edgedb-version == 'nightly' }}
run: |
yarn workspace @edgedb/generate test:v1
yarn workspace @edgedb/integration-nightly test:ci

- name: Run functional tests
run: |
Expand Down
11 changes: 11 additions & 0 deletions integration-tests/legacy/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
trace
trace/*
mts/edgeql-js
esm/edgeql-js
deno/edgeql-js
cjs/edgeql-js
dbschema/edgeql-js
dbschema/queries.ts
dbschema/interfaces.ts
**/*.edgeql.*
**/*/queries.*
6 changes: 6 additions & 0 deletions integration-tests/legacy/dbschema/default.esdl
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module default {
type User {
required property name -> str;
multi link friends -> User;
}
}
8 changes: 8 additions & 0 deletions integration-tests/legacy/dbschema/migrations/00001.edgeql
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
CREATE MIGRATION m1kvuvibdmy6m6sz4godju7rkihhdobtnf3vor3nnsm3htu2kgaeeq
ONTO initial
{
CREATE TYPE default::User {
CREATE MULTI LINK friends -> default::User;
CREATE REQUIRED PROPERTY name -> std::str;
};
};
2 changes: 2 additions & 0 deletions integration-tests/legacy/edgedb.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[edgedb]
server-version = "2"
9 changes: 9 additions & 0 deletions integration-tests/legacy/globalSetup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import createClient from "edgedb";

export default async () => {
const client = createClient();

process.env._JEST_EDGEDB_VERSION = await client.queryRequiredSingleJSON(
`select sys::get_version()`
);
};
8 changes: 8 additions & 0 deletions integration-tests/legacy/jest.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module.exports = {
preset: "ts-jest",
testEnvironment: "node",
testPathIgnorePatterns: ["./dist", "./esm", "./mts", "./cjs", "./deno"],
globalSetup: "./globalSetup.ts",
transform: {},
globals: {},
};
21 changes: 21 additions & 0 deletions integration-tests/legacy/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"private": true,
"name": "@edgedb/integration-legacy",
"version": "0.0.0",
"scripts": {
"generate": "../../packages/generate/dist/cli.js",
"build": "echo 'Integration tests, no build output...'",
"test": "NODE_OPTIONS=\"--experimental-vm-modules\" yarn generate edgeql-js && yarn generate queries --file && yarn generate interfaces && jest --detectOpenHandles --forceExit --passWithNoTests",
"test:ci": "tsx ./testRunner.ts"
},
"devDependencies": {
"@types/jest": "^29.5.2",
"@types/node": "^20.3.2",
"conditional-type-checks": "^1.0.6",
"jest": "^29.5.0",
"superjson": "^1.12.4",
"ts-jest": "^29.1.0",
"typescript": "5.0.4"
},
"dependencies": {}
}
33 changes: 33 additions & 0 deletions integration-tests/legacy/setupTeardown.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import * as tc from "conditional-type-checks";
import { type Client, createClient } from "edgedb";

export { tc };

type depromisify<T> = T extends Promise<infer U> ? U : T;
export type TestData = depromisify<ReturnType<typeof setupTests>>["data"];

export async function setupTests() {
const client = createClient();
return {
data: null,
client,
};
}

async function cleanupData(client: Client) {
await client.execute(`delete User`);
}

export async function teardownTests(client: Client) {
await cleanupData(client);

await client.close();
}

export const versionGTE = (majorVer: number) => {
const version = JSON.parse(process.env._JEST_EDGEDB_VERSION!);
return version.major >= majorVer;
};

export const testIfVersionGTE = (majorVer: number) =>
versionGTE(majorVer) ? test.skip : test;
43 changes: 43 additions & 0 deletions integration-tests/legacy/smoke.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import assert from "node:assert/strict";
import { type Client } from "edgedb";
import e from "./dbschema/edgeql-js";
import { setupTests, tc, teardownTests } from "./setupTeardown";

describe("legacy database version smoke tests", () => {
let client: Client;

beforeAll(async () => {
const setup = await setupTests();
({ client } = setup);
});

afterAll(async () => {
await teardownTests(client);
});

test("basic smoke test flow", async () => {
await e
.insert(e.User, {
name: String(Math.random()),
friends: e.select(
e.detached(
e.insert(e.User, {
name: String(Math.random()),
})
)
),
})
.run(client);

assert.equal(
(
await e
.select(e.User, () => ({
id: true,
}))
.run(client)
).length,
2
);
});
});
Original file line number Diff line number Diff line change
@@ -1,19 +1,22 @@
import createClient from "../../driver/src/index.node";
import createClient from "../../packages/driver/src/index.node";

import {
shutdown,
applyMigrations,
generateQB,
generateStatusFileName,
getServerCommand,
getWSLPath,
startServer,
} from "../../driver/test/testUtil";
runCommand,
configToEnv,
} from "../../packages/driver/test/testUtil";

(async function main() {
console.log("\nStarting EdgeDB test cluster...");

const statusFile = generateStatusFileName("node");
console.log("Node status file:", statusFile);

const { args } = getServerCommand(getWSLPath(statusFile));

const { proc, config } = await startServer(args, statusFile);
Expand All @@ -23,13 +26,9 @@ import {
const managementConn = await createClient(config).ensureConnected();

try {
await applyMigrations(config, {
flags: [
"--to-revision",
"m135rscrsthtlntxhacevxtvytgwf2vjyqfwvnwod5jihwpzp2zgyq",
],
});
await generateQB(config);
await applyMigrations(config);
console.log(`\nRunning tests...`);
await runCommand("yarn", ["test"], configToEnv(config));
} catch (err) {
console.error(err);
process.exit(1);
Expand Down
110 changes: 110 additions & 0 deletions integration-tests/legacy/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
{
"compilerOptions": {
/* Visit https://aka.ms/tsconfig to read more about this file */

/* Projects */
// "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
// "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
// "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
// "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
// "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
// "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */

/* Language and Environment */
"target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
// "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve", /* Specify what JSX code is generated. */
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
// "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
// "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
// "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
// "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */

/* Modules */
"module": "commonjs", /* Specify what module code is generated. */
// "rootDir": "./", /* Specify the root folder within your source files. */
// "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */
// "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
// "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
// "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
// "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
// "types": [], /* Specify type package names to be included without being referenced in a source file. */
// "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
// "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
// "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */
// "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */
// "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */
// "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */
// "resolveJsonModule": true, /* Enable importing .json files. */
// "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */
// "noResolve": true, /* Disallow 'import's, 'require's or '<reference>'s from expanding the number of files TypeScript should add to a project. */

/* JavaScript Support */
// "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
// "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
// "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */

/* Emit */
// "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
// "declarationMap": true, /* Create sourcemaps for d.ts files. */
// "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
// "sourceMap": true, /* Create source map files for emitted JavaScript files. */
// "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
// "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
// "outDir": "./", /* Specify an output folder for all emitted files. */
// "removeComments": true, /* Disable emitting comments. */
// "noEmit": true, /* Disable emitting files from a compilation. */
// "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
// "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
// "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
// "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
// "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
// "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
// "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
// "newLine": "crlf", /* Set the newline character for emitting files. */
// "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
// "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
// "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
// "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
// "declarationDir": "./", /* Specify the output directory for generated declaration files. */
// "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */

/* Interop Constraints */
// "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
// "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */
// "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
// "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
"forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */

/* Type Checking */
"strict": true, /* Enable all strict type-checking options. */
// "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
// "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
// "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
// "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
// "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
// "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
// "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
// "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
// "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
// "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
// "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
// "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
// "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
// "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
// "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
// "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
// "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
// "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */

/* Completeness */
// "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
"skipLibCheck": true /* Skip type checking all .d.ts files. */
},
"include": ["./**/*.ts"]
}
11 changes: 11 additions & 0 deletions integration-tests/lts/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
trace
trace/*
mts/edgeql-js
esm/edgeql-js
deno/edgeql-js
cjs/edgeql-js
dbschema/edgeql-js
dbschema/queries.ts
dbschema/interfaces.ts
**/*.edgeql.*
**/*/queries.*
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { $ } from "edgedb";
import type { cardutil } from "../src/syntax/cardinality";
import type { cardutil } from "../../packages/generate/src/syntax/cardinality";
import { tc } from "./setupTeardown";

describe("cardinality", () => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import assert from "node:assert/strict";
import e from "../dbschema/edgeql-js";
import type { $Movie } from "../dbschema/edgeql-js/modules/default";
import e from "./dbschema/edgeql-js";
import type { $Movie } from "./dbschema/edgeql-js/modules/default";

import { setupTests, tc, teardownTests } from "./setupTeardown";
import type { Client } from "edgedb";
Expand Down
File renamed without changes.
File renamed without changes.
Loading