diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b91f7300d..12995229f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -216,6 +216,7 @@ jobs: env: NODE_TLS_REJECT_UNAUTHORIZED: 0 PORTAL_RUNNER_CONNECTION_STRING: ${{ secrets.CONNECTION_STRING_SQL }} + CASSANDRA_CONNECTION_STRING: ${{ secrets.CONNECTION_STRING_CASSANDRA }} nuget: name: Publish Nuget if: github.ref == 'refs/heads/master' || contains(github.ref, 'hotfix/') || contains(github.ref, 'release/') diff --git a/jest-puppeteer.config.js b/jest-puppeteer.config.js index b2f65b121..d78913864 100644 --- a/jest-puppeteer.config.js +++ b/jest-puppeteer.config.js @@ -5,6 +5,7 @@ module.exports = { headless: isCI, slowMo: 50, defaultViewport: null, - ignoreHTTPSErrors: true + ignoreHTTPSErrors: true, + args: ["--disable-web-security"] } }; diff --git a/test/cassandra/container.spec.ts b/test/cassandra/container.spec.ts new file mode 100644 index 000000000..1676fb7d5 --- /dev/null +++ b/test/cassandra/container.spec.ts @@ -0,0 +1,98 @@ +import "expect-puppeteer"; +import crypto from 'crypto' + +jest.setTimeout(300000); +const RENDER_DELAY = 400 +const LOADING_STATE_DELAY = 1800 + +describe('Collection Add and Delete Cassandra spec', () => { + it('creates a collection', async () => { + try { + const keyspaceId = `keyspaceid${crypto.randomBytes(8).toString("hex")}`; + const tableId = `tableid${crypto.randomBytes(3).toString('hex')}`; + const prodUrl = "https://localhost:1234/hostedExplorer.html"; + page.goto(prodUrl); + + // log in with connection string + const handle = await page.waitForSelector('iframe'); + const frame = await handle.contentFrame(); + await frame.waitFor('div > p.switchConnectTypeText', { visible: true }); + await frame.click('div > p.switchConnectTypeText'); + const connStr = process.env.CASSANDRA_CONNECTION_STRING; + await frame.type("input[class='inputToken']", connStr); + await frame.click("input[value='Connect']"); + + // create new table + await frame.waitFor('button[data-test="New Table"]', { visible: true }); + await frame.waitForSelector('div[class="splashScreen"] > div[class="title"]', { visible: true }); + await frame.click('button[data-test="New Table"]'); + + // type keyspace id + await frame.waitFor('input[id="keyspace-id"]', { visible: true }); + await frame.type('input[id="keyspace-id"]', keyspaceId); + + // type table id + await frame.waitFor('input[class="textfontclr"]'); + await frame.type('input[class="textfontclr"]', tableId); + + // click submit + await frame.waitFor('#cassandraaddcollectionpane > div > form > div.paneFooter > div > input'); + await frame.click('#cassandraaddcollectionpane > div > form > div.paneFooter > div > input'); + + // open database menu + await frame.waitForSelector('div[class="splashScreen"] > div[class="title"]', { visible: true }); + + await frame.waitFor(`div[data-test="${keyspaceId}"]`, { visible: true }); + await frame.waitFor(LOADING_STATE_DELAY) + await frame.waitFor(`div[data-test="${keyspaceId}"]`, { visible: true }); + await frame.click(`div[data-test="${keyspaceId}"]`); + await frame.waitFor(`span[title="${tableId}"]`, { visible: true }); + + // delete container + + // click context menu for container + await frame.waitFor(`div[data-test="${tableId}"] > div > button`, { visible: true }); + await frame.click(`div[data-test="${tableId}"] > div > button`); + + // click delete container + await frame.waitForSelector('body > div.ms-Layer.ms-Layer--fixed'); + await frame.waitFor(RENDER_DELAY) + const elements = await frame.$$('span[class="treeComponentMenuItemLabel deleteCollectionMenuItemLabel"]') + await elements[0].click() + + // confirm delete container + await frame.type('input[data-test="confirmCollectionId"]', tableId.trim()); + + // click delete + await frame.click('input[data-test="deleteCollection"]'); + await frame.waitFor(LOADING_STATE_DELAY); + await frame.waitForSelector('div[class="splashScreen"] > div[class="title"]', { visible: true }); + + await expect(page).not.toMatchElement(`div[data-test="${tableId}"]`); + + // click context menu for database + await frame.waitFor(`div[data-test="${keyspaceId}"] > div > button`); + const button = await frame.$(`div[data-test="${keyspaceId}"] > div > button`); + await button.focus(); + await button.asElement().click(); + + // click delete database + await frame.waitFor(RENDER_DELAY); + const dbElements = await frame.$$('span[class="treeComponentMenuItemLabel deleteDatabaseMenuItemLabel"]') + await dbElements[0].click(); + + // confirm delete database + await frame.type('input[data-test="confirmDatabaseId"]', keyspaceId.trim()); + + // click delete + await frame.click('input[data-test="deleteDatabase"]'); + await frame.waitForSelector('div[class="splashScreen"] > div[class="title"]', { visible: true }); + await expect(page).not.toMatchElement(`div[data-test="${keyspaceId}"]`); + } catch (error) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const testName = (expect as any).getState().currentTestName + await page.screenshot({path: `Test Failed ${testName}.png`}); + throw error; + } + }); +}); \ No newline at end of file diff --git a/test/container.spec.ts b/test/sql/container.spec.ts similarity index 95% rename from test/container.spec.ts rename to test/sql/container.spec.ts index 04fb66836..12378630a 100644 --- a/test/container.spec.ts +++ b/test/sql/container.spec.ts @@ -1,5 +1,5 @@ import "expect-puppeteer"; -import crypto from 'crypto' +import crypto from "crypto"; jest.setTimeout(300000); @@ -101,7 +101,9 @@ describe('Collection Add and Delete SQL spec', () => { await frame.waitForSelector('div[class="splashScreen"] > div[class="title"]', { visible: true }); await expect(page).not.toMatchElement(`div[data-test="${dbId}"]`); } catch (error) { - await page.screenshot({path: 'failure.png'}); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const testName = (expect as any).getState().currentTestName + await page.screenshot({path: `Test Failed ${testName}.jpg`}); throw error; } })