From e8fa690566c9b4123d86d27ed334e1a0509eac7b Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Fri, 12 May 2023 10:07:59 +0200 Subject: [PATCH] Add mongo checks --- packages/server/src/integrations/mongodb.ts | 10 +++ .../src/integrations/validators/mongo.spec.ts | 88 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 qa-core/src/integrations/validators/mongo.spec.ts diff --git a/packages/server/src/integrations/mongodb.ts b/packages/server/src/integrations/mongodb.ts index 38b3891fe4..77dc2ad7b2 100644 --- a/packages/server/src/integrations/mongodb.ts +++ b/packages/server/src/integrations/mongodb.ts @@ -631,8 +631,18 @@ class MongoIntegration implements IntegrationBase { } } } +async function validateConnection(config: MongoDBConfig) { + const integration = new MongoIntegration(config) + try { + await integration.connect() + return true + } catch (e: any) { + return { error: e.message as string } + } +} export default { schema: SCHEMA, integration: MongoIntegration, + validateConnection, } diff --git a/qa-core/src/integrations/validators/mongo.spec.ts b/qa-core/src/integrations/validators/mongo.spec.ts new file mode 100644 index 0000000000..1c4729513e --- /dev/null +++ b/qa-core/src/integrations/validators/mongo.spec.ts @@ -0,0 +1,88 @@ +import { GenericContainer } from "testcontainers" +import mongodb from "../../../../packages/server/src/integrations/mongodb" + +jest.unmock("mongodb") + +describe("datasource validators", () => { + describe("mongo", () => { + const validator = integrations.getValidator[SourceName.MONGODB] + + let connectionSettings: { + user: string + password: string + host: string + port: number + } + + function getConnectionString( + settings: Partial = {} + ) { + const { user, password, host, port } = { + ...connectionSettings, + ...settings, + } + return `mongodb://${user}:${password}@${host}:${port}` + } + + beforeAll(async () => { + const user = generator.name() + const password = generator.hash() + const container = await new GenericContainer("mongo") + .withExposedPorts(27017) + .withEnv("MONGO_INITDB_ROOT_USERNAME", user) + .withEnv("MONGO_INITDB_ROOT_PASSWORD", password) + .start() + + connectionSettings = { + user, + password, + host: container.getContainerIpAddress(), + port: container.getMappedPort(27017), + } + }) + + it("test valid connection string", async () => { + const result = await validator({ + connectionString: getConnectionString(), + db: "", + tlsCertificateFile: "", + tlsCertificateKeyFile: "", + tlsCAFile: "", + }) + expect(result).toBe(true) + }) + + it("test invalid password", async () => { + const result = await validator({ + connectionString: getConnectionString({ password: "wrong" }), + db: "", + tlsCertificateFile: "", + tlsCertificateKeyFile: "", + tlsCAFile: "", + }) + expect(result).toEqual({ error: "Authentication failed." }) + }) + + it("test invalid username", async () => { + const result = await validator({ + connectionString: getConnectionString({ user: "wrong" }), + db: "", + tlsCertificateFile: "", + tlsCertificateKeyFile: "", + tlsCAFile: "", + }) + expect(result).toEqual({ error: "Authentication failed." }) + }) + + it("test invalid connection", async () => { + const result = await validator({ + connectionString: getConnectionString({ host: "http://nothinghere" }), + db: "", + tlsCertificateFile: "", + tlsCertificateKeyFile: "", + tlsCAFile: "", + }) + expect(result).toEqual({ error: "Error: getaddrinfo ENOTFOUND http" }) + }) + }) +})