The mocked estate could not exercise what 7.17 changed. - getdata.js and viewdata.js hard-coded their limits, so editing DC_MAXOBS_WEBEDIT / DC_MAXCELLS_WEBEDIT / DC_MAXOBS_WEBVIEW in DC made no difference. They now read them from MPE_CONFIG via a new loadDcConfig/dcConfigNumber pair in dcMockUtils, which mirrors the loop in the generated settings.sas: DC-scope rows only, var_active=1 only, current rows only (now < tx_to), latest tx_from wins. An option that is absent or switched off falls back to the service's own default, which is what %symexist does in the real service. - There was no mock for services/admin/exportdb, so the System screen's Export DC Library DDL action hit a service that did not exist. The new mock renders every table in the DC libref as basic DDL - SAS, PGSQL and TSQL flavours, schema defaulting to the libref, a unique index from the MPE_TABLES buskey, and the download headers mp_streamfile produces. DDL only: the real service appends inserts for SAS and PGSQL, but serialising the library's rows in a mock buys no test value. ddl-export.cy.ts gains two cases that fetch the URL the action opens and assert the DDL, so the spec covers the service and not just the URL.
165 lines
5.0 KiB
TypeScript
165 lines
5.0 KiB
TypeScript
export {}
|
|
|
|
const hostUrl = Cypress.env('hosturl')
|
|
const appLocation = Cypress.env('appLocation')
|
|
const longerCommandTimeout = Cypress.env('longerCommandTimeout')
|
|
|
|
context('Export DC Library DDL: ', function () {
|
|
this.beforeAll(() => {
|
|
cy.loginAndUpdateValidKey(true)
|
|
})
|
|
|
|
this.beforeEach(() => {
|
|
cy.visit(hostUrl + appLocation)
|
|
visitPage('home')
|
|
})
|
|
|
|
it('1 | the admin action opens the flavour chooser and exports the SAS flavour by default', () => {
|
|
visitPage('system')
|
|
|
|
cy.get('.admin-action', { timeout: longerCommandTimeout })
|
|
.contains('Export DC Library DDL')
|
|
.should('exist')
|
|
cy.get('.admin-action').contains('button', 'EXPORT').should('exist')
|
|
|
|
cy.window().then((win) => {
|
|
cy.stub(win, 'open').as('open')
|
|
})
|
|
|
|
cy.get('.admin-action').contains('button', 'EXPORT').click()
|
|
|
|
const ddlModal = () => cy.contains('clr-modal', 'Export DC Library DDL')
|
|
|
|
ddlModal().should('be.visible')
|
|
ddlModal().within(() => {
|
|
cy.get('select').should('have.value', 'SAS')
|
|
// the schema box only applies to the DB flavours
|
|
cy.contains('label', 'Schema (optional)').should('not.exist')
|
|
})
|
|
|
|
ddlModal().contains('button', 'Export').click()
|
|
|
|
cy.get('@open').should(
|
|
'have.been.calledWithMatch',
|
|
/\/services\/admin\/exportdb&flavour=SAS$/
|
|
)
|
|
})
|
|
|
|
it('2 | the PGSQL flavour reveals the optional schema box and passes it to the service', () => {
|
|
visitPage('system')
|
|
|
|
cy.window().then((win) => {
|
|
cy.stub(win, 'open').as('open')
|
|
})
|
|
|
|
cy.get('.admin-action').contains('button', 'EXPORT').click()
|
|
|
|
const ddlModal = () => cy.contains('clr-modal', 'Export DC Library DDL')
|
|
|
|
ddlModal().within(() => {
|
|
cy.get('select').select('PGSQL')
|
|
cy.contains('label', 'Schema (optional)').should('be.visible')
|
|
cy.get('input[type="text"]').clear().type('DC')
|
|
})
|
|
|
|
ddlModal().contains('button', 'Export').click()
|
|
|
|
cy.get('@open').should(
|
|
'have.been.calledWithMatch',
|
|
/\/services\/admin\/exportdb&flavour=PGSQL&schema=DC$/
|
|
)
|
|
})
|
|
|
|
it('3 | the TSQL flavour exports without a schema when the box is left empty', () => {
|
|
visitPage('system')
|
|
|
|
cy.window().then((win) => {
|
|
cy.stub(win, 'open').as('open')
|
|
})
|
|
|
|
cy.get('.admin-action').contains('button', 'EXPORT').click()
|
|
|
|
const ddlModal = () => cy.contains('clr-modal', 'Export DC Library DDL')
|
|
|
|
ddlModal().within(() => {
|
|
cy.get('select').select('TSQL')
|
|
cy.contains('label', 'Schema (optional)').should('be.visible')
|
|
})
|
|
|
|
ddlModal().contains('button', 'Export').click()
|
|
|
|
cy.get('@open').should(
|
|
'have.been.calledWithMatch',
|
|
/\/services\/admin\/exportdb&flavour=TSQL$/
|
|
)
|
|
})
|
|
|
|
it('4 | the SAS export streams the DC library DDL', () => {
|
|
visitPage('system')
|
|
|
|
cy.window().then((win) => {
|
|
cy.stub(win, 'open').as('open')
|
|
})
|
|
|
|
cy.get('.admin-action').contains('button', 'EXPORT').click()
|
|
|
|
const ddlModal = () => cy.contains('clr-modal', 'Export DC Library DDL')
|
|
|
|
ddlModal().contains('button', 'Export').click()
|
|
|
|
// the URL the action opens is served by the backend - against the mocks
|
|
// that is services/admin/exportdb.js, which renders the library as basic
|
|
// DDL per flavour
|
|
cy.get('@open').then((open: any) => {
|
|
const url = open.getCall(0).args[0]
|
|
expect(url).to.match(/\/services\/admin\/exportdb&flavour=SAS$/)
|
|
|
|
cy.request(url).then((res) => {
|
|
expect(res.status).to.eq(200)
|
|
expect(res.headers['content-disposition']).to.contain('DC_JSLIB.ddl')
|
|
expect(res.body).to.contain('create table DC_JSLIB.MPE_CONFIG(')
|
|
expect(res.body).to.contain('VAR_NAME char(32)')
|
|
expect(res.body).to.contain('create table DC_JSLIB.MPE_X_TEST(')
|
|
// the SAS flavour has no schema statement and no unique index
|
|
expect(res.body).not.to.contain('CREATE SCHEMA')
|
|
expect(res.body).not.to.contain('UNIQUE INDEX')
|
|
})
|
|
})
|
|
})
|
|
|
|
it('5 | the PGSQL export honours the schema and quotes its identifiers', () => {
|
|
visitPage('system')
|
|
|
|
cy.window().then((win) => {
|
|
cy.stub(win, 'open').as('open')
|
|
})
|
|
|
|
cy.get('.admin-action').contains('button', 'EXPORT').click()
|
|
|
|
const ddlModal = () => cy.contains('clr-modal', 'Export DC Library DDL')
|
|
|
|
ddlModal().within(() => {
|
|
cy.get('select').select('PGSQL')
|
|
cy.get('input[type="text"]').clear().type('DC')
|
|
})
|
|
ddlModal().contains('button', 'Export').click()
|
|
|
|
cy.get('@open').then((open: any) => {
|
|
const url = open.getCall(0).args[0]
|
|
expect(url).to.match(/&flavour=PGSQL&schema=DC$/)
|
|
|
|
cy.request(url).then((res) => {
|
|
expect(res.status).to.eq(200)
|
|
expect(res.body).to.contain('CREATE SCHEMA DC;')
|
|
expect(res.body).to.contain('CREATE TABLE DC.MPE_CONFIG (')
|
|
expect(res.body).to.contain('"VAR_NAME" VARCHAR(32)')
|
|
expect(res.body).to.contain('CREATE UNIQUE INDEX "MPE_CONFIG_pk"')
|
|
})
|
|
})
|
|
})
|
|
})
|
|
|
|
const visitPage = (url: string) => {
|
|
cy.visit(`${hostUrl}${appLocation}/#/${url}`)
|
|
}
|