diff --git a/.circleci/config.yml b/.circleci/config.yml index a6fb47de30285ca595858598dd8b4ea6c882bb8d..be99866e8be9b8b65c368db06ce29d59016b7c19 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -169,11 +169,11 @@ executors: ACCEPT_EULA: Y SA_PASSWORD: 'P@ssw0rd' - fe-mongo: + fe-mongo-4: working_directory: /home/circleci/metabase/metabase/ docker: - image: circleci/clojure:lein-2.8.1-node-browsers - - image: circleci/mongo:4.0 + - image: metabase/qa-databases:mongo-sample-4.0 fe-postgres-12: working_directory: /home/circleci/metabase/metabase/ @@ -1057,13 +1057,12 @@ workflows: <<: *Matrix - fe-tests-cypress: - name: fe-tests-cypress-mongo-<< matrix.edition >> + name: fe-tests-cypress-mongo-4-<< matrix.edition >> requires: - build-uberjar-<< matrix.edition >> - fe-deps - e: fe-mongo + e: fe-mongo-4 cypress-group: "mongo" - driver: mongo only-single-database: true test-files-location: frontend/test/metabase-db/mongo <<: *Matrix diff --git a/frontend/test/__support__/cypress.js b/frontend/test/__support__/cypress.js index 355778278d6f996e21be78e09734a229278a905d..e1d932e81c2edf772b6338e47fcaae974d353ebb 100644 --- a/frontend/test/__support__/cypress.js +++ b/frontend/test/__support__/cypress.js @@ -200,8 +200,47 @@ export function createBasicAlert({ firstAlert, includeNormal } = {}) { cy.findByText("Let's set up your alert").should("not.exist"); } -// Functions specific to QA databases that we started supporting recently in CI +/***************************************** + ** QA DATABASES ** + ******************************************/ +export function addMongoDatabase(db_display_name = "QA Mongo4") { + // https://hub.docker.com/layers/metabase/qa-databases/mongo-sample-4.0/images/sha256-3f568127248b6c6dba0b114b65dc3b3bf69bf4c804310eb57b4e3de6eda989cf + cy.log("**-- Adding Mongo 4 DB --**"); + cy.request("POST", "/api/database", { + engine: "mongo", + name: db_display_name, + details: { + host: "localhost", + dbname: "sample", + port: 27017, + user: "metabase", + pass: "metasample123", + authdb: "admin", + "additional-options": null, + "use-srv": false, + "tunnel-enabled": false, + }, + auto_run_queries: true, + is_full_sync: true, + schedules: { + cache_field_values: { + schedule_day: null, + schedule_frame: null, + schedule_hour: 0, + schedule_type: "daily", + }, + metadata_sync: { + schedule_day: null, + schedule_frame: null, + schedule_hour: null, + schedule_type: "hourly", + }, + }, + }); +} + export function addPostgresDatabase(db_display_name = "QA Postgres12") { + cy.log("**-- Adding Postgres 12 DB --**"); cy.request("POST", "/api/database", { engine: "postgres", name: db_display_name, diff --git a/frontend/test/metabase-db/mongo/add.cy.spec.js b/frontend/test/metabase-db/mongo/add.cy.spec.js index dde062aa147700199c5f6587f46b2c7ea4521e5f..e2b35b43a77ba4df9c3f2fc6e0b9e059214e081e 100644 --- a/frontend/test/metabase-db/mongo/add.cy.spec.js +++ b/frontend/test/metabase-db/mongo/add.cy.spec.js @@ -5,23 +5,6 @@ import { typeAndBlurUsingLabel, } from "__support__/cypress"; -function addMongoDatabase() { - cy.visit("/admin/databases/create"); - cy.contains("Database type") - .closest(".Form-field") - .find("a") - .click(); - cy.contains("MongoDB").click({ force: true }); - cy.contains("Additional Mongo connection"); - - typeAndBlurUsingLabel("Name", "MongoDB"); - typeAndBlurUsingLabel("Database name", "admin"); - - cy.findByText("Save") - .should("not.be.disabled") - .click(); -} - describe("mongodb > admin > add", () => { beforeEach(() => { restore(); @@ -30,12 +13,29 @@ describe("mongodb > admin > add", () => { }); it("should add a database and redirect to listing", () => { - cy.route({ - method: "POST", - url: "/api/database", - }).as("createDatabase"); + cy.route("POST", "/api/database").as("createDatabase"); - addMongoDatabase(); + cy.visit("/admin/databases/create"); + cy.contains("Database type") + .closest(".Form-field") + .find("a") + .click(); + cy.contains("MongoDB").click({ force: true }); + cy.contains("Additional Mongo connection"); + + typeAndBlurUsingLabel("Name", "QA Mongo4"); + typeAndBlurUsingLabel("Host", "localhost"); + cy.findByPlaceholderText("27017") + .click() + .type("27017"); + typeAndBlurUsingLabel("Database name", "sample"); + typeAndBlurUsingLabel("Username", "metabase"); + typeAndBlurUsingLabel("Password", "metasample123"); + typeAndBlurUsingLabel("Authentication Database", "admin"); + + cy.findByText("Save") + .should("not.be.disabled") + .click(); cy.wait("@createDatabase"); @@ -45,14 +45,4 @@ describe("mongodb > admin > add", () => { .contains("I'm good thanks") .click(); }); - - it("can query a Mongo database", () => { - addMongoDatabase(); - cy.url().should("match", /\/admin\/databases\?created=\d+$/); - cy.visit("/question/new"); - cy.contains("Simple question").click(); - cy.contains("MongoDB").click(); - cy.contains("Version").click(); - cy.contains("featureCompatibilityVersion"); - }); }); diff --git a/frontend/test/metabase-db/mongo/query.cy.spec.js b/frontend/test/metabase-db/mongo/query.cy.spec.js index 2ed85640ff4a579da433c3ddc12b69b75f907ce3..823b1b815d5a5dd783c4e70e1d76caaa66bcb6d3 100644 --- a/frontend/test/metabase-db/mongo/query.cy.spec.js +++ b/frontend/test/metabase-db/mongo/query.cy.spec.js @@ -3,42 +3,9 @@ import { restore, modal, signInAsNormalUser, + addMongoDatabase, } from "__support__/cypress"; -function addMongoDatabase() { - cy.request("POST", "/api/database", { - engine: "mongo", - name: "MongoDB", - details: { - host: "localhost", - dbname: "admin", - port: 27017, - user: null, - pass: null, - authdb: null, - "additional-options": null, - "use-srv": false, - "tunnel-enabled": false, - }, - auto_run_queries: true, - is_full_sync: true, - schedules: { - cache_field_values: { - schedule_day: null, - schedule_frame: null, - schedule_hour: 0, - schedule_type: "daily", - }, - metadata_sync: { - schedule_day: null, - schedule_frame: null, - schedule_hour: null, - schedule_type: "hourly", - }, - }, - }); -} - describe("mongodb > user > query", () => { before(() => { restore(); @@ -46,63 +13,75 @@ describe("mongodb > user > query", () => { addMongoDatabase(); }); - beforeEach(() => { - signInAsNormalUser(); + context("as an admin", () => { + it("can query a Mongo database", () => { + queryMongoDB(); + }); }); - it("can query a Mongo database as a user", () => { - cy.visit("/question/new"); - cy.contains("Simple question").click(); - cy.contains("MongoDB").click(); - cy.contains("Version").click(); - cy.contains("featureCompatibilityVersion"); - }); + context("as a user", () => { + beforeEach(() => { + signInAsNormalUser(); + }); + + it("can query a Mongo database", () => { + queryMongoDB(); + }); - it.only("can write a native MongoDB query", () => { - cy.visit("/question/new"); - cy.contains("Native query").click(); - cy.contains("MongoDB").click(); + it("can write a native MongoDB query", () => { + cy.visit("/question/new"); + cy.contains("Native query").click(); + cy.contains("QA Mongo4").click(); - cy.get(".ace_content").type(`[ { $count: "Total" } ]`, { - parseSpecialCharSequences: false, + cy.get(".ace_content").type(`[ { $count: "Total" } ]`, { + parseSpecialCharSequences: false, + }); + cy.get(".NativeQueryEditor .Icon-play").click(); + cy.contains("1"); }); - cy.get(".NativeQueryEditor .Icon-play").click(); - cy.contains("1"); - }); - it("can save a native MongoDB query", () => { - cy.server(); - cy.route("POST", "/api/card").as("createQuestion"); + it("can save a native MongoDB query", () => { + cy.server(); + cy.route("POST", "/api/card").as("createQuestion"); - cy.visit("/question/new"); - cy.contains("Native query").click(); - cy.contains("MongoDB").click(); + cy.visit("/question/new"); + cy.contains("Native query").click(); + cy.contains("QA Mongo4").click(); - cy.get(".ace_content").type(`[ { $count: "Total" } ]`, { - parseSpecialCharSequences: false, - }); - cy.get(".NativeQueryEditor .Icon-play").click(); - cy.contains("1"); + cy.get(".ace_content").type(`[ { $count: "Total" } ]`, { + parseSpecialCharSequences: false, + }); + cy.get(".NativeQueryEditor .Icon-play").click(); + cy.contains("1"); - // Close the Ace editor because it interferes with the modal for some reason - cy.get(".Icon-contract").click(); + // Close the Ace editor because it interferes with the modal for some reason + cy.get(".Icon-contract").click(); - cy.contains("Save").click(); - modal() - .findByLabelText("Name") - .focus() - .type("mongo count"); - modal() - .contains("button", "Save") - .should("not.be.disabled") - .click(); + cy.contains("Save").click(); + modal() + .findByLabelText("Name") + .focus() + .type("mongo count"); + modal() + .contains("button", "Save") + .should("not.be.disabled") + .click(); - cy.wait("@createQuestion").then(({ status }) => { - expect(status).to.equal(202); - }); + cy.wait("@createQuestion").then(({ status }) => { + expect(status).to.equal(202); + }); - cy.findByText("Not now").click(); + cy.findByText("Not now").click(); - cy.url().should("match", /\/question\/\d+$/); + cy.url().should("match", /\/question\/\d+$/); + }); }); }); + +function queryMongoDB() { + cy.visit("/question/new"); + cy.contains("Simple question").click(); + cy.contains("QA Mongo4").click(); + cy.contains("Orders").click(); + cy.contains("37.65"); +}