diff --git a/e2e/README.md b/e2e/README.md index 348a2a764..c1777a27a 100644 --- a/e2e/README.md +++ b/e2e/README.md @@ -55,7 +55,12 @@ const yamlPath = path.join( "fixtures", "test-system.yaml", ); -const entities = await importEntitiesFromYaml(api, workspace.id, yamlPath); +const entities = await importEntitiesFromYaml( + api, + workspace.id, + yamlPath, + tracer, +); // Or with a random prefix to avoid naming conflicts const prefixedEntities = await importEntitiesFromYaml( diff --git a/e2e/api/entities-builder.ts b/e2e/api/entities-builder.ts index a0a813f08..6670024b4 100644 --- a/e2e/api/entities-builder.ts +++ b/e2e/api/entities-builder.ts @@ -1,76 +1,18 @@ import { faker } from "@faker-js/faker"; +import { FetchResponse } from "openapi-fetch"; import { WorkspaceFixture } from "../tests/auth.setup"; import { EntityFixtures, importEntityFixtures } from "./entity-fixtures"; +import { EntityRefs } from "./entity-refs"; import { ApiClient } from "./index"; -// Entities info -- references to entities after built in API -export interface EntitiesCache { - prefix: string; - system: { - id: string; - name: string; - slug: string; - originalName?: string; // Original name without prefix - }; - environments: Array<{ - id: string; - name: string; - originalName?: string; - }>; - resources: Array<{ - identifier: string; - name: string; - kind: string; - originalIdentifier?: string; - metadata?: Record; - }>; - deployments: Array<{ - id: string; - name: string; - slug: string; - originalName?: string; - versions?: Array<{ - id: string; - name: string; - tag: string; - status: "building" | "ready" | "failed"; - }>; - variables?: Array<{ - id: string; - key: string; - description?: string; - config: Record; - directValues?: Array<{ - id: string; - value: any; - sensitive?: boolean; - resourceSelector?: any; - isDefault?: boolean; - }>; - referenceValues?: Array<{ - id: string; - resourceSelector?: any; - reference: string; - path: string[]; - defaultValue?: any; - isDefault?: boolean; - }>; - }>; - }>; - policies: Array<{ - id: string; - name: string; - originalName?: string; - }>; - agents: Array<{ - id: string; - name: string; - }>; +export interface FetchResultInfo { + fetchResponse: FetchResponse; + requestBody?: any; } export class EntitiesBuilder { - public readonly cache: EntitiesCache; + public readonly refs: EntityRefs; private readonly fixtures: EntityFixtures; /** @@ -78,93 +20,93 @@ export class EntitiesBuilder { * @param api API client instance * @param workspace workspace fixture to import into * @param yamlFilePath Path to the YAML file (absolute or relative to the execution directory) - * @param existingCache If building from a previous EntitiesBuilder + * @param existingRefs If building from a previous EntitiesBuilder */ constructor( public readonly api: ApiClient, public readonly workspace: WorkspaceFixture, public readonly yamlFilePath: string, - existingCache: EntitiesCache | undefined = undefined, + existingRefs: EntityRefs | undefined = undefined, ) { - if (!existingCache) { - this.cache = { - prefix: faker.string.alphanumeric(6), - system: { id: "", name: "", slug: "" }, - environments: [], - resources: [], - deployments: [], - policies: [], - agents: [], + console.debug(`EntityBuilder workspaceId: ${workspace.id}`); + if (!existingRefs) { + const system = { + id: "", + name: "", + slug: "", }; + this.refs = new EntityRefs(faker.string.alphanumeric(6), system); } else { - this.cache = existingCache; + this.refs = existingRefs; } console.log("Creating entities from YAML:", yamlFilePath); - this.fixtures = importEntityFixtures(yamlFilePath, this.cache.prefix); + this.fixtures = importEntityFixtures(yamlFilePath, this.refs.prefix); } - async createSystem() { + async upsertSystem(): Promise { console.log(`Creating system: ${this.fixtures.system.name}`); const workspaceId = this.workspace.id; + const requestBody = { + workspaceId, + ...this.fixtures.system, + }; - const systemResponse = await this.api.POST("/v1/systems", { - body: { - workspaceId, - ...this.fixtures.system, - }, + const fetchResponse = await this.api.POST("/v1/systems", { + body: requestBody, }); - if (systemResponse.response.status !== 201) { + if (fetchResponse.response.status !== 201) { throw new Error( - `Failed to create system: ${JSON.stringify(systemResponse.error)}`, + `Failed to create system: ${JSON.stringify(fetchResponse.error)}`, ); } - this.cache.system = { - id: systemResponse.data!.id, - name: systemResponse.data!.name, - slug: systemResponse.data!.slug, - originalName: this.fixtures.system.name, - }; + this.refs.system.id = fetchResponse.data!.id; + this.refs.system.name = fetchResponse.data!.name; + this.refs.system.slug = fetchResponse.data!.slug; + this.refs.system.originalName = this.fixtures.system.name; + + return { requestBody, fetchResponse }; } - async createResources() { + async upsertResources(): Promise { if (!this.fixtures.resources || this.fixtures.resources.length === 0) { throw new Error("No resources defined in YAML file"); } + let results: FetchResultInfo[] = []; const workspaceId = this.workspace.id; for (const resource of this.fixtures.resources) { console.log(`Creating resource: ${resource.name}`); - const resourceResponse = await this.api.POST("/v1/resources", { - body: { - ...resource, - workspaceId, - config: resource.config as Record, - }, + const requestBody = { + ...resource, + workspaceId, + config: resource.config as Record, + }; + const fetchResponse = await this.api.POST("/v1/resources", { + body: requestBody, }); - if (resourceResponse.response.status !== 200) { - throw new Error( - `Failed to create resource: ${JSON.stringify( - resourceResponse.error, - )}`, - ); - } + results.push({ + fetchResponse, + requestBody, + }); } // Store created resources in result for (const r of this.fixtures.resources) { - this.cache.resources.push({ + this.refs.resources.push({ ...r, originalIdentifier: r.identifier, }); } + + return results; } - async createEnvironments() { + async upsertEnvironments(): Promise { if ( !this.fixtures.environments || this.fixtures.environments.length === 0 @@ -172,84 +114,85 @@ export class EntitiesBuilder { throw new Error("No environments defined in YAML file"); } - if (!this.cache.system.id || this.cache.system.id.trim() === "") { + if (!this.refs.system.id || this.refs.system.id.trim() === "") { throw new Error( "System ID is blank. Please create the system before creating environments.", ); } + const results: FetchResultInfo[] = []; + for (const env of this.fixtures.environments) { console.log(`Creating environment: ${env.name}`); + const requestBody = { + ...env, + systemId: this.refs.system.id, + }; // TODO Update resource selector if needed // let resourceSelector = env.resourceSelector; - const envResponse = await this.api.POST("/v1/environments", { - body: { - ...env, - systemId: this.cache.system.id, - }, + const fetchResponse = await this.api.POST("/v1/environments", { + body: requestBody, }); - if (envResponse.response.status !== 200) { - throw new Error( - `Failed to create environment: ${JSON.stringify(envResponse.error)}`, - ); - } + results.push({ + fetchResponse, + requestBody, + }); - this.cache.environments.push({ - id: envResponse.data!.id, - name: envResponse.data!.name, + this.refs.environments.push({ + id: fetchResponse.data!.id, + name: fetchResponse.data!.name, originalName: env.name, }); } + + return results; } - async createDeployments() { + async upsertDeployments(agentId?: string): Promise { if (!this.fixtures.deployments || this.fixtures.deployments.length === 0) { throw new Error("No deployments defined in YAML file"); } + const results: FetchResultInfo[] = []; for (const deployment of this.fixtures.deployments) { - console.log(`Creating deployment: ${deployment.name}`); - - const deploymentResponse = await this.api.POST("/v1/deployments", { - body: { - ...deployment, - systemId: this.cache.system.id, - }, + const requestBody = { + ...deployment, + systemId: this.refs.system.id, + jobAgentId: agentId, + }; + const uriPath = "/v1/deployments"; + const fetchResponse = await this.api.POST(uriPath, { + body: requestBody, }); - if (deploymentResponse.response.status !== 201) { - throw new Error( - `Failed to create deployment: ${JSON.stringify( - deploymentResponse.error, - )}`, - ); - } - this.cache.deployments.push({ - id: deploymentResponse.data!.id, - name: deploymentResponse.data!.name, - slug: deploymentResponse.data!.slug, + this.refs.deployments.push({ + id: fetchResponse.data!.id, + name: fetchResponse.data!.name, + slug: fetchResponse.data!.slug, originalName: deployment.name, versions: [], variables: [], }); + + results.push({ + fetchResponse, + requestBody, + }); } + + return results; } - async createDeploymentVersions() { + async createDeploymentVersions(): Promise { if (!this.fixtures.deployments || this.fixtures.deployments.length === 0) { throw new Error("No deployments defined in YAML file"); } + const results: FetchResultInfo[] = []; for (const deployment of this.fixtures.deployments) { if (deployment.versions && deployment.versions.length > 0) { - console.log( - `Adding deployment versions: ${deployment.name} -> ${deployment.versions - .map((v) => v.tag) - .join(", ")}`, - ); - - const deploymentResult = this.cache.deployments.find( + const deploymentResult = this.refs.deployments.find( (d) => d.name === deployment.name, ); if (!deploymentResult) { @@ -257,49 +200,39 @@ export class EntitiesBuilder { } for (const version of deployment.versions) { - const versionResponse = await this.api.POST( - "/v1/deployment-versions", - { - body: { - ...version, - deploymentId: deploymentResult.id, - }, - }, - ); + const requestBody = { + ...version, + deploymentId: deploymentResult.id, + }; + const fetchResponse = await this.api.POST("/v1/deployment-versions", { + body: requestBody, + }); - if (versionResponse.response.status !== 201) { - throw new Error( - `Failed to create deployment version: ${JSON.stringify( - versionResponse.error, - )}`, - ); - } + results.push({ + fetchResponse, + requestBody, + }); - const versionData = versionResponse.data!; deploymentResult.versions!.push({ - id: versionData.id, - name: versionData.name, - tag: versionData.tag, - status: versionData.status ?? "ready", + id: fetchResponse.data!.id, + name: fetchResponse.data!.name, + tag: fetchResponse.data!.tag, + status: fetchResponse.data!.status ?? "ready", }); } } } + return results; } - async createDeploymentVariables() { + async createDeploymentVariables(): Promise { if (!this.fixtures.deployments || this.fixtures.deployments.length === 0) { throw new Error("No deployments defined in YAML file"); } + const results: FetchResultInfo[] = []; for (const deployment of this.fixtures.deployments) { if (deployment.variables && deployment.variables.length > 0) { - console.log( - `Adding deployment variables: ${deployment.name} -> ${deployment.variables - .map((v) => v.key) - .join(", ")}`, - ); - - const deploymentResult = this.cache.deployments.find( + const deploymentResult = this.refs.deployments.find( (d) => d.name === deployment.name, ); if (!deploymentResult) { @@ -307,166 +240,150 @@ export class EntitiesBuilder { } for (const variable of deployment.variables) { - const variableResponse = await this.api.POST( + const requestBody = { + ...variable, + }; + const fetchResponse = await this.api.POST( "/v1/deployments/{deploymentId}/variables", { params: { path: { deploymentId: deploymentResult.id } }, body: { - ...variable, - directValues: variable.directValues?.map((dv) => ({ - ...dv, - resourceSelector: dv.resourceSelector ?? null, - })), - referenceValues: variable.referenceValues?.map((rv) => ({ - ...rv, - resourceSelector: rv.resourceSelector ?? null, - })), + requestBody, }, }, ); - if (variableResponse.response.status !== 201) { - throw new Error( - `Failed to create deployment variable: ${JSON.stringify( - variableResponse.error, - )}`, - ); - } - - const variableData = variableResponse.data!; - const { directValues, referenceValues } = variableData; - directValues?.forEach((dv) => { - dv.id = dv.id ?? faker.string.uuid(); - }); - referenceValues?.forEach((rv) => { - rv.id = rv.id ?? faker.string.uuid(); + results.push({ + fetchResponse, + requestBody, }); + deploymentResult.variables!.push({ - id: variableData.id, - key: variableData.key, - description: variableData.description, - config: variableData.config, - directValues: variableData.directValues, - referenceValues: variableData.referenceValues, + id: fetchResponse.data!.id, + key: fetchResponse.data!.key, + description: fetchResponse.data!.description, + config: fetchResponse.data!.config, + values: fetchResponse.data!.values, }); } } } + return results; } - async createPolicies() { + async upsertPolicies(): Promise { if (!this.fixtures.policies || this.fixtures.policies.length === 0) { throw new Error("No policies defined in YAML file"); } - + const results: FetchResultInfo[] = []; const workspaceId = this.workspace.id; for (const policy of this.fixtures.policies) { - console.log(`Creating policy: ${policy.name}`); - - const policyResponse = await this.api.POST("/v1/policies", { - body: { - ...policy, - workspaceId, - }, + const requestBody = { + ...policy, + workspaceId, + }; + const fetchResponse = await this.api.POST("/v1/policies", { + body: requestBody, }); - if (policyResponse.response.status !== 200) { - throw new Error( - `Failed to create policy: ${JSON.stringify(policyResponse.error)}`, - ); - } + results.push({ + fetchResponse, + requestBody, + }); - this.cache.policies.push({ - id: policyResponse.data!.id, - name: policyResponse.data!.name, + this.refs.policies.push({ + id: fetchResponse.data!.id, + name: fetchResponse.data!.name, originalName: policy.name, }); } + + return results; } - async createAgents() { + async upsertAgents(): Promise { if (!this.fixtures.agents || this.fixtures.agents.length === 0) { throw new Error("No agents defined in YAML file"); } - + const results: FetchResultInfo[] = []; const workspaceId = this.workspace.id; for (const agent of this.fixtures.agents) { - console.log(`Creating agent: ${agent.name}`); - - const agentResponse = await this.api.PATCH("/v1/job-agents/name", { - body: { - ...agent, - workspaceId, - }, + const requestBody = { + ...agent, + workspaceId, + }; + const fetchResponse = await this.api.PATCH("/v1/job-agents/name", { + body: requestBody, }); - if (agentResponse.response.status !== 200) { - throw new Error( - `Failed to create agent: ${JSON.stringify(agentResponse.error)}`, - ); - } + results.push({ + fetchResponse, + requestBody, + }); - this.cache.agents.push({ - id: agentResponse.data!.id, - name: agentResponse.data!.name, + this.refs.agents.push({ + id: fetchResponse.data!.id, + name: fetchResponse.data!.name, }); } + return results; } } /** * Delete all entities created from a YAML import * @param api API client instance - * @param entities The entities to delete (returned from importEntitiesFromYaml) + * @param refs Refs entities to delete (returned from importEntitiesFromYaml) */ export async function cleanupImportedEntities( api: ApiClient, - entities: EntitiesCache, + refs: EntityRefs, workspaceId: string, -): Promise { - for (const policy of entities.policies ?? []) { - console.log(`Deleting policy: ${policy.name}`); - await api.DELETE(`/v1/policies/{policyId}`, { - params: { path: { policyId: policy.id } }, +): Promise { + const results: FetchResultInfo[] = []; + for (const policy of refs.policies ?? []) { + results.push({ + fetchResponse: await api.DELETE(`/v1/policies/{policyId}`, { + params: { path: { policyId: policy.id } }, + }), }); } - for (const deployment of entities.deployments ?? []) { - console.log(`Deleting deployment: ${deployment.name}`); - await api.DELETE(`/v1/deployments/{deploymentId}`, { - params: { path: { deploymentId: deployment.id } }, + for (const deployment of refs.deployments ?? []) { + results.push({ + fetchResponse: await api.DELETE(`/v1/deployments/{deploymentId}`, { + params: { path: { deploymentId: deployment.id } }, + }), }); } - for (const environment of entities.environments ?? []) { - console.log(`Deleting environment: ${environment.name}`); - await api.DELETE(`/v1/environments/{environmentId}`, { - params: { path: { environmentId: environment.id } }, + for (const environment of refs.environments ?? []) { + results.push({ + fetchResponse: await api.DELETE(`/v1/environments/{environmentId}`, { + params: { path: { environmentId: environment.id } }, + }), }); } - console.log(`Deleting system: ${entities.system.name}`); - await api.DELETE(`/v1/systems/{systemId}`, { - params: { path: { systemId: entities.system.id } }, + results.push({ + fetchResponse: await api.DELETE(`/v1/systems/{systemId}`, { + params: { path: { systemId: refs.system.id } }, + }), }); - for (const resource of entities.resources ?? []) { - console.log(`Deleting resource: ${resource.identifier}`); - const response = await api.DELETE( - "/v1/workspaces/{workspaceId}/resources/identifier/{identifier}", - { - params: { - path: { workspaceId: workspaceId, identifier: resource.identifier }, + for (const resource of refs.resources ?? []) { + results.push({ + fetchResponse: await api.DELETE( + "/v1/workspaces/{workspaceId}/resources/identifier/{identifier}", + { + params: { + path: { workspaceId: workspaceId, identifier: resource.identifier }, + }, }, - }, - ); - - if (response.response.status !== 200) { - console.error( - `Failed to delete resource: ${JSON.stringify(response.error)}`, - ); - } + ), + }); } + return results; } diff --git a/e2e/api/entity-refs.ts b/e2e/api/entity-refs.ts new file mode 100644 index 000000000..51a0002fd --- /dev/null +++ b/e2e/api/entity-refs.ts @@ -0,0 +1,185 @@ +export interface DeploymentVariableValueRef { + id: string; + value: any; + valueType?: "direct" | "reference"; + sensitive?: boolean; + resourceSelector?: any; + default?: boolean; +} + +export class DeploymentVariableRef { + public readonly values: Array = []; + + constructor( + public id: string, + public key: string, + public config: Record, + public description?: string, + ) {} +} + +export interface DeploymentVersionRef { + id: string; + name: string; + tag: string; + status: "building" | "ready" | "failed"; +} + +export class DeploymentRef { + public readonly versions: Array = []; + public readonly variables: Array = []; + + constructor( + public id: string, + public name: string, + public slug: string, + public originalName?: string, + ) {} +} + +export interface SystemRef { + id: string; + name: string; + slug: string; + originalName?: string; +} + +export interface EnvironmentRef { + id: string; + name: string; + originalName?: string; +} + +export interface ResourceRef { + identifier: string; + name: string; + kind: string; + originalIdentifier?: string; + metadata?: Record; +} + +export interface PolicyRef { + id: string; + name: string; + originalName?: string; +} + +export type AgentRef = { + id: string; + name: string; +}; + +export class EntityRefs { + public environments: Array = []; + + public resources: Array = []; + + public deployments: Array = []; + + public policies: Array = []; + + public agents: Array = []; + + constructor( + public readonly prefix: string, + public readonly system: SystemRef, + ) {} + + public takeEnvironments(count: number): Array { + return takeRandom(this.environments, count); + } + + public oneEnvironment(): EnvironmentRef { + return takeRandom(this.environments, 1)[0]; + } + + public getEnvironmentLike(match: string): EnvironmentRef { + return exactlyOne( + this.environments.filter((env) => matches(env.name, match)), + ); + } + + public takeResources(count: number): Array { + return takeRandom(this.resources, count); + } + + public oneResource(): ResourceRef { + return takeRandom(this.resources, 1)[0]; + } + + public getResourceLike(match: string): ResourceRef { + return exactlyOne( + this.resources.filter( + (res) => matches(res.name, match) || matches(res.identifier, match), + ), + ); + } + + public takeDeployments(count: number): Array { + return takeRandom(this.deployments, count); + } + + public oneDeployment(): DeploymentRef { + return takeRandom(this.deployments, 1)[0]; + } + + public getDeploymentLike(match: string): DeploymentRef { + return exactlyOne( + this.deployments.filter((dep) => matches(dep.name, match)), + ); + } + + public takePolicies(count: number): Array { + return takeRandom(this.policies, count); + } + + public onePolicy(): PolicyRef { + if (this.policies.length === 0) { + throw new Error("No policies available."); + } + return this.policies[0]; + } + + public getPolicyLike(match: string): PolicyRef { + return exactlyOne( + this.policies.filter((policy) => matches(policy.name, match)), + ); + } + + public takeAgents(count: number): Array { + return takeRandom(this.agents, count); + } + + public oneAgent(): AgentRef { + return takeRandom(this.agents, 1)[0]; + } + + public getAgentLike(match: string): AgentRef { + return exactlyOne( + this.agents.filter((agent) => matches(agent.name, match)), + ); + } +} + +function exactlyOne(items: Array): T { + if (items.length !== 1) { + throw new Error(`Expected exactly one item, but found ${items.length}.`); + } + return items[0]!; +} + +function matches(wholeName: string, criterion: string): boolean { + return wholeName.toLowerCase().includes(criterion.toLowerCase()); +} + +function takeRandom(arr: Array, n: number): Array { + if (n > arr.length) { + throw new Error(`Cannot take ${n} elements, only ${arr.length} available.`); + } + const shuffled = arr.slice(); + for (let i = shuffled.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; + } + return shuffled.slice(0, n); +} diff --git a/e2e/tests/api/deployment-remove-event.spec.ts b/e2e/tests/api/deployment-remove-event.spec.ts index 6ada828cc..5f9f99b7d 100644 --- a/e2e/tests/api/deployment-remove-event.spec.ts +++ b/e2e/tests/api/deployment-remove-event.spec.ts @@ -12,11 +12,11 @@ test.describe("Deployment remove event", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); + await builder.upsertSystem(); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("deleting a resource should trigger a deployment remove event", async ({ @@ -24,7 +24,7 @@ test.describe("Deployment remove event", () => { workspace, page, }) => { - const system = builder.cache.system!; + const system = builder.refs.system!; const systemPrefix = system.slug.split("-")[0]!; const environmentCreateResponse = await api.POST("/v1/environments", { body: { @@ -110,7 +110,7 @@ test.describe("Deployment remove event", () => { workspace, page, }) => { - const system = builder.cache.system!; + const system = builder.refs.system!; const systemPrefix = system.slug.split("-")[0]!; const environmentCreateResponse = await api.POST("/v1/environments", { body: { @@ -198,7 +198,7 @@ test.describe("Deployment remove event", () => { workspace, page, }) => { - const system = builder.cache.system!; + const system = builder.refs.system!; const systemPrefix = system.slug.split("-")[0]!; const environmentCreateResponse = await api.POST("/v1/environments", { body: { @@ -287,7 +287,7 @@ test.describe("Deployment remove event", () => { workspace, page, }) => { - const system = builder.cache.system!; + const system = builder.refs.system!; const systemPrefix = system.slug.split("-")[0]!; const environmentCreateResponse = await api.POST("/v1/environments", { body: { @@ -373,7 +373,7 @@ test.describe("Deployment remove event", () => { workspace, page, }) => { - const system = builder.cache.system!; + const system = builder.refs.system!; const systemPrefix = system.slug.split("-")[0]!; const environmentCreateResponse = await api.POST("/v1/environments", { body: { diff --git a/e2e/tests/api/deployment-variable.spec.ts b/e2e/tests/api/deployment-variable.spec.ts index e5a01f430..2931d9c10 100644 --- a/e2e/tests/api/deployment-variable.spec.ts +++ b/e2e/tests/api/deployment-variable.spec.ts @@ -12,17 +12,17 @@ test.describe("Deployment Variables API", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createDeployments(); + await builder.upsertSystem(); + await builder.upsertDeployments(); await new Promise((resolve) => setTimeout(resolve, 5_000)); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("should create a deployment variable", async ({ api }) => { - const importedDeployment = builder.cache.deployments[0]!; + const importedDeployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); const variableCreateResponse = await api.POST( @@ -69,7 +69,7 @@ test.describe("Deployment Variables API", () => { }); test("should create a deployment variable with values", async ({ api }) => { - const importedDeployment = builder.cache.deployments[0]!; + const importedDeployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); const valueA = faker.string.alphanumeric(10); @@ -149,7 +149,7 @@ test.describe("Deployment Variables API", () => { test("should create a deployment variable with values and default value", async ({ api, }) => { - const importedDeployment = builder.cache.deployments[0]!; + const importedDeployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); const valueA = faker.string.alphanumeric(10); @@ -218,7 +218,7 @@ test.describe("Deployment Variables API", () => { test("shoudl fail if more than one default value is provided", async ({ api, }) => { - const importedDeployment = builder.cache.deployments[0]!; + const importedDeployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); const valueA = faker.string.alphanumeric(10); @@ -262,7 +262,7 @@ test.describe("Deployment Variables API", () => { }); test("should update a deployment variable's values", async ({ api }) => { - const importedDeployment = builder.cache.deployments[0]!; + const importedDeployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); const value = faker.string.alphanumeric(10); @@ -393,7 +393,7 @@ test.describe("Deployment Variables API", () => { test("should update a deployment variable's default value", async ({ api, }) => { - const importedDeployment = builder.cache.deployments[0]!; + const importedDeployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); const value = faker.string.alphanumeric(10); @@ -499,7 +499,7 @@ test.describe("Deployment Variables API", () => { }); test("should be able to add more values to a variable", async ({ api }) => { - const importedDeployment = builder.cache.deployments[0]!; + const importedDeployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); const valueA = faker.string.alphanumeric(10); @@ -632,7 +632,7 @@ test.describe("Deployment Variables API", () => { test("should be able to convert an insensitive value to a sensitive value", async ({ api, }) => { - const importedDeployment = builder.cache.deployments[0]!; + const importedDeployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); const value = faker.string.alphanumeric(10); @@ -721,7 +721,7 @@ test.describe("Deployment Variables API", () => { test("should be able to convert a sensitive value to an insensitive value", async ({ api, }) => { - const importedDeployment = builder.cache.deployments[0]!; + const importedDeployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); const value = faker.string.alphanumeric(10); diff --git a/e2e/tests/api/deployment-version.spec.ts b/e2e/tests/api/deployment-version.spec.ts index 001e9eaeb..bc0656eb9 100644 --- a/e2e/tests/api/deployment-version.spec.ts +++ b/e2e/tests/api/deployment-version.spec.ts @@ -12,12 +12,12 @@ test.describe("Deployment Versions API", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createDeployments(); + await builder.upsertSystem(); + await builder.upsertDeployments(); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("should create a deployment version", async ({ api }) => { @@ -30,7 +30,7 @@ test.describe("Deployment Versions API", () => { body: { name: versionName, tag: versionTag, - deploymentId: builder.cache.deployments[0].id, + deploymentId: builder.refs.deployments[0].id, metadata: { enabled: "true" }, }, }, @@ -43,9 +43,7 @@ test.describe("Deployment Versions API", () => { expect(deploymentVersion.name).toBe(versionName); expect(deploymentVersion.tag).toBe(versionTag); - expect(deploymentVersion.deploymentId).toBe( - builder.cache.deployments[0].id, - ); + expect(deploymentVersion.deploymentId).toBe(builder.refs.deployments[0].id); expect(deploymentVersion.metadata).toEqual({ enabled: "true" }); expect(deploymentVersion.status).toBe("ready"); }); @@ -60,7 +58,7 @@ test.describe("Deployment Versions API", () => { { body: { tag: versionTag, - deploymentId: builder.cache.deployments[0].id, + deploymentId: builder.refs.deployments[0].id, }, }, ); @@ -83,7 +81,7 @@ test.describe("Deployment Versions API", () => { { body: { tag: versionTag, - deploymentId: builder.cache.deployments[0].id, + deploymentId: builder.refs.deployments[0].id, status: "building", }, }, @@ -106,7 +104,7 @@ test.describe("Deployment Versions API", () => { { body: { tag: versionTag, - deploymentId: builder.cache.deployments[0].id, + deploymentId: builder.refs.deployments[0].id, name: versionName, metadata: { enabled: "true" }, }, @@ -153,7 +151,7 @@ test.describe("Deployment Versions API", () => { { body: { tag: faker.string.alphanumeric(10), - deploymentId: builder.cache.deployments[0].id, + deploymentId: builder.refs.deployments[0].id, status: "building", }, }, @@ -194,7 +192,7 @@ test.describe("Deployment Versions API", () => { { body: { tag: faker.string.alphanumeric(10), - deploymentId: builder.cache.deployments[0].id, + deploymentId: builder.refs.deployments[0].id, status: "building", }, }, diff --git a/e2e/tests/api/deployments.spec.ts b/e2e/tests/api/deployments.spec.ts index 9de6cb5c0..0bf9ef9cf 100644 --- a/e2e/tests/api/deployments.spec.ts +++ b/e2e/tests/api/deployments.spec.ts @@ -12,13 +12,13 @@ test.describe("Deployments API", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createEnvironments(); - await builder.createResources(); + await builder.upsertSystem(); + await builder.upsertEnvironments(); + await builder.upsertResources(); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("should create a deployment", async ({ api }) => { @@ -27,7 +27,7 @@ test.describe("Deployments API", () => { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); @@ -43,7 +43,7 @@ test.describe("Deployments API", () => { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); @@ -71,7 +71,7 @@ test.describe("Deployments API", () => { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); @@ -105,14 +105,14 @@ test.describe("Deployments API", () => { }); test("should delete a deployment", async ({ api, workspace }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = faker.string.alphanumeric(10); const deployment = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); @@ -198,13 +198,13 @@ test.describe("Deployments API", () => { }); test("should match resources to a deployment", async ({ api, page }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = faker.string.alphanumeric(10); const deployment = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "comparison", operator: "and", @@ -248,7 +248,7 @@ test.describe("Deployments API", () => { expect(receivedResource).toBeDefined(); if (!receivedResource) throw new Error("Resource is undefined"); expect(receivedResource.identifier).toBe( - builder.cache.resources.find((r) => r.metadata?.env === "qa")?.identifier, + builder.refs.resources.find((r) => r.metadata?.env === "qa")?.identifier, ); const releaseTargets = await api.GET( @@ -262,7 +262,7 @@ test.describe("Deployments API", () => { expect(releaseTarget).toBeDefined(); if (!releaseTarget) throw new Error("Release target is undefined"); expect(releaseTarget.deployment.id).toBe(deploymentId); - const matchedEnvironment = builder.cache.environments.find( + const matchedEnvironment = builder.refs.environments.find( (e) => e.id === releaseTarget.environment.id, ); expect(matchedEnvironment).toBeDefined(); @@ -272,13 +272,13 @@ test.describe("Deployments API", () => { api, page, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = faker.string.alphanumeric(10); const deployment = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "comparison", operator: "and", @@ -351,7 +351,7 @@ test.describe("Deployments API", () => { expect(receivedResource).toBeDefined(); if (!receivedResource) throw new Error("Resource is undefined"); expect(receivedResource.identifier).toBe( - builder.cache.resources.find((r) => r.metadata?.env === "prod") + builder.refs.resources.find((r) => r.metadata?.env === "prod") ?.identifier, ); @@ -366,7 +366,7 @@ test.describe("Deployments API", () => { expect(releaseTarget).toBeDefined(); if (!releaseTarget) throw new Error("Release target is undefined"); expect(releaseTarget.deployment.id).toBe(deploymentId); - const matchedEnvironment = builder.cache.environments.find( + const matchedEnvironment = builder.refs.environments.find( (e) => e.id === releaseTarget.environment.id, ); expect(matchedEnvironment).toBeDefined(); @@ -377,7 +377,7 @@ test.describe("Deployments API", () => { page, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const newResourceIdentifier = `${systemPrefix}-${faker.string.alphanumeric( 10, )}`; @@ -406,7 +406,7 @@ test.describe("Deployments API", () => { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "comparison", operator: "and", @@ -453,13 +453,13 @@ test.describe("Deployments API", () => { page, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = faker.string.alphanumeric(10); const deployment = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "comparison", operator: "and", @@ -505,7 +505,7 @@ test.describe("Deployments API", () => { * all resources should actually have release targets now * since the deployment no longer has a specific scope */ - for (const resource of builder.cache.resources) { + for (const resource of builder.refs.resources) { console.log(resource); const fetchedResourceResponse = await api.GET( "/v1/workspaces/{workspaceId}/resources/identifier/{identifier}", @@ -533,7 +533,7 @@ test.describe("Deployments API", () => { expect(releaseTarget).toBeDefined(); if (!releaseTarget) throw new Error("Release target is undefined"); expect(releaseTarget.deployment.id).toBe(deploymentId); - const matchedEnvironment = builder.cache.environments.find( + const matchedEnvironment = builder.refs.environments.find( (e) => e.id === releaseTarget.environment.id, ); expect(matchedEnvironment).toBeDefined(); diff --git a/e2e/tests/api/environments.spec.ts b/e2e/tests/api/environments.spec.ts index 7acd759a9..ec938cf15 100644 --- a/e2e/tests/api/environments.spec.ts +++ b/e2e/tests/api/environments.spec.ts @@ -12,13 +12,13 @@ test.describe("Environments API", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createResources(); - await builder.createDeployments(); + await builder.upsertSystem(); + await builder.upsertResources(); + await builder.upsertDeployments(); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("should create an environment", async ({ api }) => { @@ -26,7 +26,7 @@ test.describe("Environments API", () => { const environment = await api.POST("/v1/environments", { body: { name: environmentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); @@ -36,11 +36,11 @@ test.describe("Environments API", () => { }); test("should match resources to new environment", async ({ api }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const environmentResponse = await api.POST("/v1/environments", { body: { name: faker.string.alphanumeric(10), - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "comparison", operator: "and", @@ -79,7 +79,7 @@ test.describe("Environments API", () => { expect(receivedResource).toBeDefined(); if (!receivedResource) throw new Error("No resource found"); expect(receivedResource.identifier).toBe( - builder.cache.resources.find((r) => r.metadata?.env === "qa")?.identifier, + builder.refs.resources.find((r) => r.metadata?.env === "qa")?.identifier, ); const releaseTargetsResponse = await api.GET( @@ -93,7 +93,7 @@ test.describe("Environments API", () => { expect(releaseTarget).toBeDefined(); if (!releaseTarget) throw new Error("No release target found"); expect(releaseTarget.environment.id).toBe(environment.id); - const deploymentMatch = builder.cache.deployments.find( + const deploymentMatch = builder.refs.deployments.find( (d) => d.id === releaseTarget.deployment.id, ); expect(deploymentMatch).toBeDefined(); @@ -105,11 +105,11 @@ test.describe("Environments API", () => { api, }) => { // First create an environment with a selector for QA resources - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const environmentResponse = await api.POST("/v1/environments", { body: { name: faker.string.alphanumeric(10), - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "comparison", operator: "and", @@ -146,7 +146,7 @@ test.describe("Environments API", () => { expect(initialResourcesResponse.response.status).toBe(200); expect(initialResourcesResponse.data?.resources?.length).toBe(1); expect(initialResourcesResponse.data?.resources?.[0]?.identifier).toBe( - builder.cache.resources.find((r) => r.metadata?.env === "qa")?.identifier, + builder.refs.resources.find((r) => r.metadata?.env === "qa")?.identifier, ); // Now update the environment to select prod resources instead @@ -154,7 +154,7 @@ test.describe("Environments API", () => { body: { id: environment.id, name: environment.name, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "comparison", operator: "and", @@ -195,7 +195,7 @@ test.describe("Environments API", () => { expect(receivedResource).toBeDefined(); if (!receivedResource) throw new Error("No resource found"); expect(receivedResource.identifier).toBe( - builder.cache.resources.find((r) => r.metadata?.env === "prod") + builder.refs.resources.find((r) => r.metadata?.env === "prod") ?.identifier, ); @@ -210,7 +210,7 @@ test.describe("Environments API", () => { expect(releaseTarget).toBeDefined(); if (!releaseTarget) throw new Error("No release target found"); expect(releaseTarget.environment.id).toBe(updatedEnvironmentId); - const deploymentMatch = builder.cache.deployments.find( + const deploymentMatch = builder.refs.deployments.find( (d) => d.id === releaseTarget.deployment.id, ); expect(deploymentMatch).toBeDefined(); @@ -221,11 +221,11 @@ test.describe("Environments API", () => { test("should unmatch resources if environment selector is set to null", async ({ api, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const environmentResponse = await api.POST("/v1/environments", { body: { name: faker.string.alphanumeric(10), - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "comparison", operator: "and", @@ -257,7 +257,7 @@ test.describe("Environments API", () => { body: { id: environment.id, name: environment.name, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: undefined, }, }); @@ -287,7 +287,7 @@ test.describe("Environments API", () => { body: { name: originalName, description: originalDescription, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); @@ -307,7 +307,7 @@ test.describe("Environments API", () => { id: environment.id, name: updatedName, description: updatedDescription, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); @@ -331,14 +331,14 @@ test.describe("Environments API", () => { }); test("should delete an environment", async ({ api, workspace }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; // First create an environment const environmentName = faker.string.alphanumeric(10); const environmentResponse = await api.POST("/v1/environments", { body: { name: environmentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "identifier", operator: "equals", @@ -427,7 +427,7 @@ test.describe("Environments API", () => { api, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const newResourceIdentifier = `${systemPrefix}-${faker.string.alphanumeric( 10, )}`; @@ -454,7 +454,7 @@ test.describe("Environments API", () => { const environmentResponse = await api.POST("/v1/environments", { body: { name: faker.string.alphanumeric(10), - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "comparison", operator: "and", diff --git a/e2e/tests/api/job-agents.spec.ts b/e2e/tests/api/job-agents.spec.ts index d76557880..9feb52050 100644 --- a/e2e/tests/api/job-agents.spec.ts +++ b/e2e/tests/api/job-agents.spec.ts @@ -12,13 +12,13 @@ test.describe("Job Agent API", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createEnvironments(); - await builder.createDeployments(); + await builder.upsertSystem(); + await builder.upsertEnvironments(); + await builder.upsertDeployments(); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("create a job agent", async ({ api, workspace }) => { diff --git a/e2e/tests/api/jobs/job-flow-1.spec.ts b/e2e/tests/api/jobs/job-flow-1.spec.ts index e2c45b1c5..05b9ddb89 100644 --- a/e2e/tests/api/jobs/job-flow-1.spec.ts +++ b/e2e/tests/api/jobs/job-flow-1.spec.ts @@ -1,42 +1,148 @@ import path from "path"; import { expect } from "@playwright/test"; +import _ from "lodash"; +import { Client } from "openapi-fetch"; -import { cleanupImportedEntities, EntitiesBuilder } from "../../../api"; +import { cleanupImportedEntities, EntitiesBuilder, paths } from "../../../api"; import { test } from "../../fixtures"; const yamlPath = path.join(__dirname, "job-flow-entities.spec.yaml"); -test.describe("Deployment Versions API", () => { +test.describe("queue initial jobs", () => { let builder: EntitiesBuilder; - test.beforeAll(async ({ api, workspace }) => { + test.beforeEach(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createResources(); - await builder.createEnvironments(); - await builder.createDeployments(); - await builder.createAgents(); - await builder.createDeploymentVersions(); - await new Promise((resolve) => setTimeout(resolve, 5000)); + + expect((await builder.upsertSystem()).fetchResponse.response.ok).toBe(true); + + (await builder.upsertEnvironments()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + (await builder.upsertDeployments()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); }); - test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + test.afterEach(async ({ api, workspace }) => { + await cleanupImportedEntities(api, builder.refs, workspace.id); }); - test("should create a deployment version", async ({ api }) => { - const agentId = builder.cache.agents[0].id; - const jobQueueResponse = await api.GET( - "/v1/job-agents/{agentId}/queue/next", - { - params: { - path: { - agentId, - }, - }, - }, - ); + test("trigger with initial deployment versions", async ({ api }) => { + (await builder.upsertResources()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + (await builder.upsertAgents()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + const agentId = builder.refs.oneAgent().id; + + // Attach agent to deployment: + (await builder.upsertDeployments(agentId)).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + // triggers job + (await builder.createDeploymentVersions()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); - expect(jobQueueResponse.response.status).toBe(200); + await nextJobs(api, agentId, 4); + }); + + test("trigger with initial agent attachment", async ({ api }) => { + (await builder.upsertResources()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + (await builder.upsertAgents()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + const agentId = builder.refs.oneAgent().id; + + (await builder.createDeploymentVersions()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + // Attach agent to deployment -> triggers job + (await builder.upsertDeployments(agentId)).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + await nextJobs(api, agentId, 4); + }); + + test("trigger with initial resources", async ({ api }) => { + (await builder.upsertAgents()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + const agentId = builder.refs.oneAgent().id; + + (await builder.createDeploymentVersions()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + // Attach agent to deployment: + (await builder.upsertDeployments(agentId)).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + // triggers job + (await builder.upsertResources()).forEach((fr) => { + expect(fr.fetchResponse.response.ok).toBe(true); + }); + + await nextJobs(api, agentId, 4); }); }); + +async function nextJobs( + api: Client, + agentId: string, + expectedJobCount: number, +): Promise { + let jobs: Job[] = []; + let attempts = 0; + + while (jobs.length < expectedJobCount && attempts < 10) { + await new Promise((resolve) => setTimeout(resolve, 1000)); + const fetchResponse = await api.GET("/v1/job-agents/{agentId}/queue/next", { + params: { + path: { + agentId, + }, + }, + }); + + expect(fetchResponse.response.ok).toBe(true); + + const nextJobs = fetchResponse.data; + expect(nextJobs?.jobs).toBeDefined(); + + expect(Array.isArray(nextJobs?.jobs)).toBe(true); + jobs.push(...((nextJobs?.jobs as Job[]) || [])); + } + + expect( + jobs.every((job) => job.jobAgentId === agentId), + "expected agentId", + ).toBe(true); + expect( + _.uniq(jobs.map((job) => job.id)).length == jobs.length, + "expected unique jobIds", + ).toBe(true); + + expect(jobs.length, "job count").toBe(expectedJobCount); + return jobs; +} + +interface Job { + id: string; + jobAgentId: string; + status: string; +} diff --git a/e2e/tests/api/jobs/job-flow-entities.spec.yaml b/e2e/tests/api/jobs/job-flow-entities.spec.yaml index 41c18b989..22d7935fa 100644 --- a/e2e/tests/api/jobs/job-flow-entities.spec.yaml +++ b/e2e/tests/api/jobs/job-flow-entities.spec.yaml @@ -1,34 +1,115 @@ +isQaTier: &isQaTier + type: metadata + key: instance/tier + operator: equals + value: "{{ prefix }}-qa" + +metaQa: &metaQa + instance/tier: "{{ prefix }}-qa" + +isDevTier: &isDevTier + type: metadata + key: instance/tier + operator: equals + value: "{{ prefix }}-dev" + +metaDev: &metaDev + instance/tier: "{{ prefix }}-dev" + +isKindService: &isKindService + type: kind + operator: equals + value: "{{ prefix }}-service" + +kindService: &kindService + kind: "{{ prefix }}-service" + +isKindDatabase: &isKindDatabase + type: kind + operator: equals + value: "{{ prefix }}-database" + +kindDatabase: &kindDatabase + kind: "{{ prefix }}-database" + system: name: "{{ prefix }}-deployment-version" slug: "{{ prefix }}-deployment-version" description: System for testing deployment versions resources: - - name: "{{ prefix }}-resource" - kind: "service" - identifier: "{{ prefix }}-resource" + - name: "{{ prefix }}-qa-service-resource" + <<: *kindService + identifier: "{{ prefix }}-qa-service-resource" + version: "1.0.0" + config: + enabled: true + metadata: *metaQa + + - name: "{{ prefix }}-dev-service-resource" + <<: *kindService + identifier: "{{ prefix }}-dev-service-resource" version: "1.0.0" config: enabled: true + metadata: *metaDev + + - name: "{{ prefix }}-qa-database-resource" + <<: *kindService + identifier: "{{ prefix }}-qa-database-resource" + version: "1.0.0" + config: + enabled: true + metadata: *metaQa + + - name: "{{ prefix }}-dev-database-resource" + <<: *kindService + identifier: "{{ prefix }}-dev-database-resource" + version: "1.0.0" + config: + enabled: true + metadata: *metaDev deployments: - - name: "{{ prefix }}-deployment" - slug: "{{ prefix }}-deployment" - description: Deployment for testing deployment versions + - name: "{{ prefix }}-service-deployment" + slug: "{{ prefix }}-service-deployment" + description: Deployment for testing service deployment versions: - tag: "1.0.0" + resourceSelector: + type: "comparison" + operator: "and" + conditions: + - *isKindService + + - name: "{{ prefix }}-database-deployment" + slug: "{{ prefix }}-database-deployment" + description: Deployment for testing database deployments + versions: + - tag: "1.0.0" + resourceSelector: + type: "comparison" + operator: "and" + conditions: + - *isKindDatabase environments: - - name: "{{ prefix }}-environment" - slug: "{{ prefix }}-environment" - description: Environment for testing deployment versions + - name: "{{ prefix }}-QA-environment" + slug: "{{ prefix }}-QA-environment" + description: QA-like environment for testing deployment versions + resourceSelector: + type: "comparison" + operator: "and" + conditions: + - *isQaTier + - name: "{{ prefix }}-DEV-environment" + slug: "{{ prefix }}-DEV-environment" + description: Dev-like environment for testing deployment versions resourceSelector: type: "comparison" operator: "and" conditions: - - type: "identifier" - operator: "equals" - value: "{{ prefix }}-resource" + - *isDevTier agents: - name: "{{ prefix }}-agent" diff --git a/e2e/tests/api/policies/matched-release-targets.spec.ts b/e2e/tests/api/policies/matched-release-targets.spec.ts index 28710104d..ca479e531 100644 --- a/e2e/tests/api/policies/matched-release-targets.spec.ts +++ b/e2e/tests/api/policies/matched-release-targets.spec.ts @@ -14,16 +14,16 @@ test.describe("Release Targets API", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - builder.createSystem(); - builder.createResources(); - builder.createEnvironments(); - builder.createDeployments(); + builder.upsertSystem(); + builder.upsertResources(); + builder.upsertEnvironments(); + builder.upsertDeployments(); await new Promise((resolve) => setTimeout(resolve, 1_000)); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("should match a policy to a specific resource", async ({ @@ -32,7 +32,7 @@ test.describe("Release Targets API", () => { page, }) => { const { id: workspaceId } = workspace; - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const policyName = faker.string.alphanumeric(10); const policyResponse = await api.POST("/v1/policies", { @@ -90,7 +90,7 @@ test.describe("Release Targets API", () => { page, }) => { const { id: workspaceId } = workspace; - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const policyName = faker.string.alphanumeric(10); const policyResponse = await api.POST("/v1/policies", { body: { @@ -166,7 +166,7 @@ test.describe("Release Targets API", () => { page, }) => { const { id: workspaceId } = workspace; - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const resourceName = `${systemPrefix}-sample`; const sampleResourceResponse = await api.POST("/v1/resources", { body: { @@ -238,7 +238,7 @@ test.describe("Release Targets API", () => { page, }) => { const { id: workspaceId } = workspace; - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const policyName = faker.string.alphanumeric(10); const policyResponse = await api.POST("/v1/policies", { @@ -296,7 +296,7 @@ test.describe("Release Targets API", () => { page, }) => { const { id: workspaceId } = workspace; - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const policyName = faker.string.alphanumeric(10); const policyResponse = await api.POST("/v1/policies", { body: { @@ -372,13 +372,13 @@ test.describe("Release Targets API", () => { page, }) => { const { id: workspaceId } = workspace; - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const environmentName = `${systemPrefix}-staging`; const environmentResponse = await api.POST("/v1/environments", { body: { name: environmentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, resourceSelector: { type: "identifier", operator: "equals", diff --git a/e2e/tests/api/release-targets.spec.ts b/e2e/tests/api/release-targets.spec.ts index 10283ec66..5700a2f46 100644 --- a/e2e/tests/api/release-targets.spec.ts +++ b/e2e/tests/api/release-targets.spec.ts @@ -11,14 +11,14 @@ test.describe("Release Targets API", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createResources(); - await builder.createEnvironments(); - await builder.createDeployments(); + await builder.upsertSystem(); + await builder.upsertResources(); + await builder.upsertEnvironments(); + await builder.upsertDeployments(); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("should fetch release targets for a resource", async ({ @@ -27,7 +27,7 @@ test.describe("Release Targets API", () => { workspace, }) => { await page.waitForTimeout(5_000); - const importedResource = builder.cache.resources.at(0); + const importedResource = builder.refs.resources.at(0); expect(importedResource).toBeDefined(); if (!importedResource) throw new Error("No resource found"); @@ -63,13 +63,13 @@ test.describe("Release Targets API", () => { if (!releaseTarget) throw new Error("No release target found"); expect(releaseTarget.resource.id).toBe(resourceId); - const environmentMatch = builder.cache.environments.find( + const environmentMatch = builder.refs.environments.find( (e) => e.id === releaseTarget.environment.id, ); expect(environmentMatch).toBeDefined(); if (!environmentMatch) throw new Error("No environment match found"); - const deploymentMatch = builder.cache.deployments.find( + const deploymentMatch = builder.refs.deployments.find( (d) => d.id === releaseTarget.deployment.id, ); expect(deploymentMatch).toBeDefined(); diff --git a/e2e/tests/api/release.spec.ts b/e2e/tests/api/release.spec.ts index 6aa0a878b..e4481eb2d 100644 --- a/e2e/tests/api/release.spec.ts +++ b/e2e/tests/api/release.spec.ts @@ -12,14 +12,14 @@ test.describe("Release Creation", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createResources(); - await builder.createEnvironments(); + await builder.upsertSystem(); + await builder.upsertResources(); + await builder.upsertEnvironments(); await new Promise((resolve) => setTimeout(resolve, 1_000)); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("should create a release when a new version is created", async ({ @@ -27,13 +27,13 @@ test.describe("Release Creation", () => { page, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const deploymentCreateResponse = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); expect(deploymentCreateResponse.response.status).toBe(201); @@ -50,7 +50,7 @@ test.describe("Release Creation", () => { }); expect(versionResponse.response.status).toBe(201); - const importedResource = builder.cache.resources.at(0)!; + const importedResource = builder.refs.resources.at(0)!; const resourceResponse = await api.GET( "/v1/workspaces/{workspaceId}/resources/identifier/{identifier}", { @@ -110,13 +110,13 @@ test.describe("Release Creation", () => { page, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const deploymentCreateResponse = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); expect(deploymentCreateResponse.response.status).toBe(201); @@ -163,7 +163,7 @@ test.describe("Release Creation", () => { ); expect(variableCreateResponse.response.status).toBe(201); - const importedResource = builder.cache.resources.at(0)!; + const importedResource = builder.refs.resources.at(0)!; const resourceResponse = await api.GET( "/v1/workspaces/{workspaceId}/resources/identifier/{identifier}", { @@ -227,13 +227,13 @@ test.describe("Release Creation", () => { page, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const deploymentCreateResponse = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); expect(deploymentCreateResponse.response.status).toBe(201); @@ -267,7 +267,7 @@ test.describe("Release Creation", () => { ); expect(variableCreateResponse.response.status).toBe(201); - const importedResource = builder.cache.resources.at(0)!; + const importedResource = builder.refs.resources.at(0)!; const resourceResponse = await api.GET( "/v1/workspaces/{workspaceId}/resources/identifier/{identifier}", { @@ -331,13 +331,13 @@ test.describe("Release Creation", () => { page, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const deploymentCreateResponse = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); expect(deploymentCreateResponse.response.status).toBe(201); @@ -468,13 +468,13 @@ test.describe("Release Creation", () => { }); expect(policyResponse.response.status).toBe(200); - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const deploymentCreateResponse = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); expect(deploymentCreateResponse.response.status).toBe(201); @@ -586,13 +586,13 @@ test.describe("Release Creation", () => { page, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const deploymentCreateResponse = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); expect(deploymentCreateResponse.response.status).toBe(201); @@ -715,13 +715,13 @@ test.describe("Release Creation", () => { page, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const deploymentCreateResponse = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); expect(deploymentCreateResponse.response.status).toBe(201); @@ -844,13 +844,13 @@ test.describe("Release Creation", () => { page, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const deploymentName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const deploymentCreateResponse = await api.POST("/v1/deployments", { body: { name: deploymentName, slug: deploymentName, - systemId: builder.cache.system.id, + systemId: builder.refs.system.id, }, }); expect(deploymentCreateResponse.response.status).toBe(201); diff --git a/e2e/tests/api/resource-grouping.spec.ts b/e2e/tests/api/resource-grouping.spec.ts index f503419b5..e00bc785a 100644 --- a/e2e/tests/api/resource-grouping.spec.ts +++ b/e2e/tests/api/resource-grouping.spec.ts @@ -10,8 +10,8 @@ test.describe("Resource Provider API", () => { let builder: EntitiesBuilder; test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createResources(); + await builder.upsertSystem(); + await builder.upsertResources(); }); test("basic resource grouping", async ({ api, workspace }) => { diff --git a/e2e/tests/api/resource-relationships.spec.ts b/e2e/tests/api/resource-relationships.spec.ts index c86b9bb15..d11559ee5 100644 --- a/e2e/tests/api/resource-relationships.spec.ts +++ b/e2e/tests/api/resource-relationships.spec.ts @@ -13,14 +13,14 @@ test.describe("Resource Relationships API", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - prefix = builder.cache.prefix; + prefix = builder.refs.prefix; - await builder.createSystem(); - await builder.createResources(); + await builder.upsertSystem(); + await builder.upsertResources(); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("create a relationship with metadata match", async ({ diff --git a/e2e/tests/api/resource-variables.spec.ts b/e2e/tests/api/resource-variables.spec.ts index 7b0d31919..7ce132809 100644 --- a/e2e/tests/api/resource-variables.spec.ts +++ b/e2e/tests/api/resource-variables.spec.ts @@ -12,17 +12,17 @@ test.describe("Resource Variables API", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createEnvironments(); - await builder.createDeployments(); + await builder.upsertSystem(); + await builder.upsertEnvironments(); + await builder.upsertDeployments(); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("create a resource with variables", async ({ api, workspace }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const resourceName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; // Create a resource with variables @@ -77,7 +77,7 @@ test.describe("Resource Variables API", () => { }); test("update resource variables", async ({ api, workspace }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const resourceName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; // Create a resource with initial variables @@ -138,7 +138,7 @@ test.describe("Resource Variables API", () => { api, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const resourceName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; // Create a resource with variables @@ -171,7 +171,7 @@ test.describe("Resource Variables API", () => { api, workspace, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!.toLowerCase(); + const systemPrefix = builder.refs.system.slug.split("-")[0]!.toLowerCase(); const reference = faker.string.alphanumeric(10).toLowerCase(); // Create target resource @@ -266,7 +266,7 @@ test.describe("Resource Variables API", () => { workspace, page, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!.toLowerCase(); + const systemPrefix = builder.refs.system.slug.split("-")[0]!.toLowerCase(); const reference = faker.string.alphanumeric(10).toLowerCase(); // Create target resource const targetResource = await api.POST("/v1/resources", { @@ -323,7 +323,7 @@ test.describe("Resource Variables API", () => { expect(relationship.response.status).toBe(200); // Create a deployment variable with reference type - const deployment = builder.cache.deployments[0]!; + const deployment = builder.refs.deployments[0]!; await api.POST("/v1/deployments/{deploymentId}/variables", { params: { @@ -418,7 +418,7 @@ test.describe("Resource Variables API", () => { workspace, page, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!.toLowerCase(); + const systemPrefix = builder.refs.system.slug.split("-")[0]!.toLowerCase(); const reference = faker.string.alphanumeric(10).toLowerCase(); // Create target resource @@ -478,7 +478,7 @@ test.describe("Resource Variables API", () => { expect(relationship.response.status).toBe(200); // Create a deployment variable with reference type - const deployment = builder.cache.deployments[0]!; + const deployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); @@ -593,7 +593,7 @@ test.describe("Resource Variables API", () => { workspace, page, }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!.toLowerCase(); + const systemPrefix = builder.refs.system.slug.split("-")[0]!.toLowerCase(); const reference = faker.string.alphanumeric(10).toLowerCase(); // Create target resource @@ -652,7 +652,7 @@ test.describe("Resource Variables API", () => { expect(relationship.response.status).toBe(200); // Create a deployment variable with reference type - const deployment = builder.cache.deployments[0]!; + const deployment = builder.refs.deployments[0]!; const key = faker.string.alphanumeric(10); diff --git a/e2e/tests/api/resources.spec.ts b/e2e/tests/api/resources.spec.ts index 54bd67d44..81b1f5131 100644 --- a/e2e/tests/api/resources.spec.ts +++ b/e2e/tests/api/resources.spec.ts @@ -12,17 +12,17 @@ test.describe("Resource API", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createEnvironments(); - await builder.createDeployments(); + await builder.upsertSystem(); + await builder.upsertEnvironments(); + await builder.upsertDeployments(); }); test.afterAll(async ({ api, workspace }) => { - await cleanupImportedEntities(api, builder.cache, workspace.id); + await cleanupImportedEntities(api, builder.refs, workspace.id); }); test("create a resource", async ({ api, workspace }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const resourceName1 = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const resource = await api.POST("/v1/resources", { body: { @@ -49,8 +49,8 @@ test.describe("Resource API", () => { await new Promise((resolve) => setTimeout(resolve, 5_000)); - const environment = builder.cache.environments[0]!; - const deployment = builder.cache.deployments[0]!; + const environment = builder.refs.environments[0]!; + const deployment = builder.refs.deployments[0]!; const environmentResourcesResponse = await api.GET( "/v1/environments/{environmentId}/resources", @@ -100,7 +100,7 @@ test.describe("Resource API", () => { }); test("get a resource by identifier", async ({ api, workspace }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const resourceName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; await api.POST("/v1/resources", { body: { @@ -134,7 +134,7 @@ test.describe("Resource API", () => { }); test("list resources", async ({ api, workspace }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const resourceName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; await api.POST("/v1/resources", { body: { @@ -163,7 +163,7 @@ test.describe("Resource API", () => { test("update a resource", async ({ api, workspace }) => { // First create a resource - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const resourceName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; await api.POST("/v1/resources", { body: { @@ -212,8 +212,8 @@ test.describe("Resource API", () => { await new Promise((resolve) => setTimeout(resolve, 5_000)); - const environment = builder.cache.environments[0]!; - const deployment = builder.cache.deployments[0]!; + const environment = builder.refs.environments[0]!; + const deployment = builder.refs.deployments[0]!; const releaseTargetsResponse = await api.GET( "/v1/resources/{resourceId}/release-targets", { @@ -235,7 +235,7 @@ test.describe("Resource API", () => { workspace, }) => { // First create a resource - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const resourceName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; await api.POST("/v1/resources", { body: { @@ -282,7 +282,7 @@ test.describe("Resource API", () => { test("delete a resource", async ({ api, workspace }) => { // First create a resource - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; const resourceName = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const resourceIdentifer = `${resourceName}/${faker.string.alphanumeric( 10, @@ -336,8 +336,8 @@ test.describe("Resource API", () => { await new Promise((resolve) => setTimeout(resolve, 5_000)); - const environment = builder.cache.environments[0]!; - const deployment = builder.cache.deployments[0]!; + const environment = builder.refs.environments[0]!; + const deployment = builder.refs.deployments[0]!; const environmentResourcesResponse = await api.GET( "/v1/environments/{environmentId}/resources", @@ -365,7 +365,7 @@ test.describe("Resource API", () => { }); test("create resource relationship", async ({ api, workspace }) => { - const systemPrefix = builder.cache.system.slug.split("-")[0]!; + const systemPrefix = builder.refs.system.slug.split("-")[0]!; // Create two resources const resource1Name = `${systemPrefix}-${faker.string.alphanumeric(10)}`; const resource2Name = `${systemPrefix}-${faker.string.alphanumeric(10)}`; diff --git a/e2e/tests/api/yaml-import.spec.ts b/e2e/tests/api/yaml-import.spec.ts index ccc0d33cc..f993c9c43 100644 --- a/e2e/tests/api/yaml-import.spec.ts +++ b/e2e/tests/api/yaml-import.spec.ts @@ -1,10 +1,7 @@ import path from "path"; import { expect } from "@playwright/test"; -import { - cleanupImportedEntities, - EntitiesBuilder, -} from "../../api/entities-builder"; +import { cleanupImportedEntities, EntitiesBuilder } from "../../api"; import { test } from "../fixtures"; const yamlPath = path.join(__dirname, "yaml-import.spec.yaml"); @@ -14,12 +11,12 @@ test.describe("YAML Entity Import", () => { test.beforeAll(async ({ api, workspace }) => { builder = new EntitiesBuilder(api, workspace, yamlPath); - await builder.createSystem(); - await builder.createResources(); - await builder.createEnvironments(); - await builder.createDeployments(); + await builder.upsertSystem(); + await builder.upsertResources(); + await builder.upsertEnvironments(); + await builder.upsertDeployments(); await builder.createDeploymentVariables(); - await builder.createPolicies(); + await builder.upsertPolicies(); // Allow time for resources to be processed await new Promise((resolve) => setTimeout(resolve, 5000)); @@ -27,15 +24,13 @@ test.describe("YAML Entity Import", () => { test.afterAll(async ({ api, workspace }) => { // Clean up all imported entities - if (builder.cache) { - await cleanupImportedEntities(api, builder.cache, workspace.id); - } + cleanupImportedEntities(api, builder.refs, workspace.id); }); test("should have created a system from YAML", async ({ api }) => { // Get the system by ID const response = await api.GET("/v1/systems/{systemId}", { - params: { path: { systemId: builder.cache.system.id } }, + params: { path: { systemId: builder.refs.system.id } }, }); // Verify system data @@ -71,10 +66,10 @@ test.describe("YAML Entity Import", () => { test("should have created environments from YAML", async ({ api }) => { // Check that we have correct number of environments - expect(builder.cache.environments.length).toBe(2); + expect(builder.refs.environments.length).toBe(2); // Get environment details for first environment - const prodEnvId = builder.cache.environments.find( + const prodEnvId = builder.refs.environments.find( (e) => e.name === "Production", )?.id; expect(prodEnvId).toBeDefined(); @@ -90,9 +85,9 @@ test.describe("YAML Entity Import", () => { }); test("should have created deployments from YAML", async ({ api }) => { - expect(builder.cache.deployments.length).toBe(2); + expect(builder.refs.deployments.length).toBe(2); - const apiDeploymentId = builder.cache.deployments.find( + const apiDeploymentId = builder.refs.deployments.find( (d) => d.name === "API Deployment", )?.id; expect(apiDeploymentId).toBeDefined(); diff --git a/e2e/tests/api/yaml-import.spec.yaml b/e2e/tests/api/yaml-import.spec.yaml index a6e34d35f..0651b1aa2 100644 --- a/e2e/tests/api/yaml-import.spec.yaml +++ b/e2e/tests/api/yaml-import.spec.yaml @@ -109,4 +109,4 @@ policies: key: tier value: production versionAnyApprovals: - requiredApprovalsCount: 2 + - requiredApprovalsCount: 2