mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-09-22 13:39:35 +00:00
feat: added secret version test with secret import
This commit is contained in:
@@ -5,9 +5,9 @@ import { createSecretV2, deleteSecretV2, getSecretByNameV2, getSecretsV2 } from
|
|||||||
import { seedData1 } from "@app/db/seed-data";
|
import { seedData1 } from "@app/db/seed-data";
|
||||||
|
|
||||||
// dev <- stage <- prod
|
// dev <- stage <- prod
|
||||||
describe.each([{ path: "/" }, { path: "/deep" }])(
|
describe.each([{ secretPath: "/" }, { secretPath: "/deep" }])(
|
||||||
"Secret replication waterfall pattern testing - %path",
|
"Secret replication waterfall pattern testing - %secretPath",
|
||||||
({ path: testSuitePath }) => {
|
({ secretPath: testSuitePath }) => {
|
||||||
beforeAll(async () => {
|
beforeAll(async () => {
|
||||||
let prodFolder: { id: string };
|
let prodFolder: { id: string };
|
||||||
let stagingFolder: { id: string };
|
let stagingFolder: { id: string };
|
||||||
@@ -140,6 +140,7 @@ describe.each([{ path: "/" }, { path: "/deep" }])(
|
|||||||
secretPath: testSuitePath,
|
secretPath: testSuitePath,
|
||||||
authToken: jwtAuthToken
|
authToken: jwtAuthToken
|
||||||
});
|
});
|
||||||
|
|
||||||
expect(listSecrets.imports).toEqual(
|
expect(listSecrets.imports).toEqual(
|
||||||
expect.arrayContaining([
|
expect.arrayContaining([
|
||||||
expect.objectContaining({
|
expect.objectContaining({
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { createFolder, deleteFolder } from "e2e-test/testUtils/folders";
|
import { createFolder, deleteFolder } from "e2e-test/testUtils/folders";
|
||||||
|
import { createSecretImport, deleteSecretImport } from "e2e-test/testUtils/secret-imports";
|
||||||
import { createSecretV2, deleteSecretV2, getSecretByNameV2, getSecretsV2 } from "e2e-test/testUtils/secrets";
|
import { createSecretV2, deleteSecretV2, getSecretByNameV2, getSecretsV2 } from "e2e-test/testUtils/secrets";
|
||||||
|
|
||||||
import { seedData1 } from "@app/db/seed-data";
|
import { seedData1 } from "@app/db/seed-data";
|
||||||
@@ -150,4 +151,180 @@ describe("Secret expansion", () => {
|
|||||||
|
|
||||||
await Promise.all(secrets.map((el) => deleteSecretV2(el)));
|
await Promise.all(secrets.map((el) => deleteSecretV2(el)));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("Non replicated secret import secret expansion on local reference and nested reference", async () => {
|
||||||
|
const secrets = [
|
||||||
|
{
|
||||||
|
environmentSlug: "prod",
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/deep",
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
key: "DEEP_KEY_1",
|
||||||
|
value: "testing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
environmentSlug: "prod",
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/deep/nested",
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
key: "NESTED_KEY_1",
|
||||||
|
value: "reference"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
environmentSlug: "prod",
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/deep/nested",
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
key: "NESTED_KEY_2",
|
||||||
|
// eslint-disable-next-line
|
||||||
|
value: "secret ${NESTED_KEY_1} ${prod.deep.DEEP_KEY_1}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
environmentSlug: seedData1.environment.slug,
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/",
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
key: "KEY",
|
||||||
|
// eslint-disable-next-line
|
||||||
|
value: "hello world"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
await Promise.all(secrets.map((el) => createSecretV2(el)));
|
||||||
|
const secretImportFromProdToDev = await createSecretImport({
|
||||||
|
environmentSlug: seedData1.environment.slug,
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/",
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
importEnv: "prod",
|
||||||
|
importPath: "/deep/nested"
|
||||||
|
});
|
||||||
|
|
||||||
|
const listSecrets = await getSecretsV2({
|
||||||
|
environmentSlug: seedData1.environment.slug,
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/",
|
||||||
|
authToken: jwtAuthToken
|
||||||
|
});
|
||||||
|
expect(listSecrets.imports).toEqual(
|
||||||
|
expect.arrayContaining([
|
||||||
|
expect.objectContaining({
|
||||||
|
secretPath: "/deep/nested",
|
||||||
|
environment: "prod",
|
||||||
|
secrets: expect.arrayContaining([
|
||||||
|
expect.objectContaining({
|
||||||
|
secretKey: "NESTED_KEY_1",
|
||||||
|
secretValue: "reference"
|
||||||
|
}),
|
||||||
|
expect.objectContaining({
|
||||||
|
secretKey: "NESTED_KEY_2",
|
||||||
|
secretValue: "secret reference testing"
|
||||||
|
})
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
await Promise.all(secrets.map((el) => deleteSecretV2(el)));
|
||||||
|
await deleteSecretImport({
|
||||||
|
environmentSlug: seedData1.environment.slug,
|
||||||
|
workspaceId: projectId,
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
id: secretImportFromProdToDev.id,
|
||||||
|
secretPath: "/"
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test(
|
||||||
|
"Replicated secret import secret expansion on local reference and nested reference",
|
||||||
|
async () => {
|
||||||
|
const secrets = [
|
||||||
|
{
|
||||||
|
environmentSlug: "prod",
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/deep",
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
key: "DEEP_KEY_1",
|
||||||
|
value: "testing"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
environmentSlug: "prod",
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/deep/nested",
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
key: "NESTED_KEY_1",
|
||||||
|
value: "reference"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
environmentSlug: "prod",
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/deep/nested",
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
key: "NESTED_KEY_2",
|
||||||
|
// eslint-disable-next-line
|
||||||
|
value: "secret ${NESTED_KEY_1} ${prod.deep.DEEP_KEY_1}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
environmentSlug: seedData1.environment.slug,
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/",
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
key: "KEY",
|
||||||
|
// eslint-disable-next-line
|
||||||
|
value: "hello world"
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
await Promise.all(secrets.map((el) => createSecretV2(el)));
|
||||||
|
const secretImportFromProdToDev = await createSecretImport({
|
||||||
|
environmentSlug: seedData1.environment.slug,
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/",
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
importEnv: "prod",
|
||||||
|
importPath: "/deep/nested",
|
||||||
|
isReplication: true
|
||||||
|
});
|
||||||
|
|
||||||
|
// wait for 5 second for replication to finish
|
||||||
|
await new Promise((resolve) => {
|
||||||
|
setTimeout(resolve, 5000); // time to breathe for db
|
||||||
|
});
|
||||||
|
|
||||||
|
const listSecrets = await getSecretsV2({
|
||||||
|
environmentSlug: seedData1.environment.slug,
|
||||||
|
workspaceId: projectId,
|
||||||
|
secretPath: "/",
|
||||||
|
authToken: jwtAuthToken
|
||||||
|
});
|
||||||
|
expect(listSecrets.imports).toEqual(
|
||||||
|
expect.arrayContaining([
|
||||||
|
expect.objectContaining({
|
||||||
|
secretPath: `/__reserve_replication_${secretImportFromProdToDev.id}`,
|
||||||
|
environment: seedData1.environment.slug,
|
||||||
|
secrets: expect.arrayContaining([
|
||||||
|
expect.objectContaining({
|
||||||
|
secretKey: "NESTED_KEY_1",
|
||||||
|
secretValue: "reference"
|
||||||
|
}),
|
||||||
|
expect.objectContaining({
|
||||||
|
secretKey: "NESTED_KEY_2",
|
||||||
|
secretValue: "secret reference testing"
|
||||||
|
})
|
||||||
|
])
|
||||||
|
})
|
||||||
|
])
|
||||||
|
);
|
||||||
|
|
||||||
|
await Promise.all(secrets.map((el) => deleteSecretV2(el)));
|
||||||
|
await deleteSecretImport({
|
||||||
|
environmentSlug: seedData1.environment.slug,
|
||||||
|
workspaceId: projectId,
|
||||||
|
authToken: jwtAuthToken,
|
||||||
|
id: secretImportFromProdToDev.id,
|
||||||
|
secretPath: "/"
|
||||||
|
});
|
||||||
|
},
|
||||||
|
{ timeout: 10000 }
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ export default {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const redis = new Redis(cfg.REDIS_URL);
|
const redis = new Redis(cfg.REDIS_URL);
|
||||||
await redis.flushdb("ASYNC");
|
await redis.flushdb("SYNC");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await db.migrate.rollback(
|
await db.migrate.rollback(
|
||||||
|
|||||||
Reference in New Issue
Block a user