82 lines
3.0 KiB
TypeScript
82 lines
3.0 KiB
TypeScript
// Marks this file as an ES module so its top-level consts don't collide with
|
|
// other spec files under the TS type-checker.
|
|
export {}
|
|
//
|
|
// When the startup service fails without a usable response, the error modal
|
|
// offers a button that runs the same service in a new browser window, where the
|
|
// SAS log is returned instead. This spec forces a startup failure against the
|
|
// mock backend and checks the button and the URL it opens.
|
|
const hostUrl = Cypress.env('hosturl')
|
|
|
|
const STARTUP_PROGRAM = '/Public/app/dc/services/public/startupservice'
|
|
|
|
/** The body a Viya Compute task returns when the run outlives the
|
|
* execution-task timeout: a bare string, so the adapter has no webout and no
|
|
* log to report. */
|
|
const rawJobError = [
|
|
'Job error',
|
|
'The Compute service could not execute the task c74a707a-8b88-46a5-8f28-9a7694ad5e13 because the context is not reusable.',
|
|
'path: /compute/tasks',
|
|
'correlator: dc1a9fda-8f65-4f32-b4d4-2a70e02179b1;1bcb6a4c-8a16-4053-a790-292544c25a03'
|
|
].join('\n')
|
|
|
|
context('startupservice launcher: ', function () {
|
|
it('1 | runs the startupservice in a new window when its response is malformed', () => {
|
|
// Report an empty admin folder so the app loads the startup service: on a
|
|
// freshly seeded mock estate makedata is still present, which sends the app
|
|
// to the deploy screen instead.
|
|
cy.intercept('GET', '**/drive/folder**', (req) => {
|
|
// Guarded parse: a lone '%' in the URL would make decodeURIComponent
|
|
// throw, and an exception here aborts the request.
|
|
let url = req.url
|
|
try {
|
|
url = decodeURIComponent(req.url)
|
|
} catch (e) {
|
|
url = req.url
|
|
}
|
|
|
|
if (url.includes('services/admin')) {
|
|
req.reply({ files: [], folders: [] })
|
|
return
|
|
}
|
|
req.continue()
|
|
})
|
|
|
|
cy.intercept('**/stp/execute/**', (req) => {
|
|
if (req.url.includes('public/startupservice')) {
|
|
// The adapter cannot use a bare string as a response payload, so the
|
|
// startup request fails with nothing to show.
|
|
req.reply({
|
|
statusCode: 200,
|
|
headers: { 'content-type': 'application/json' },
|
|
body: JSON.stringify(rawJobError)
|
|
})
|
|
return
|
|
}
|
|
req.continue()
|
|
})
|
|
|
|
// The launcher must not actually open a tab under test.
|
|
cy.visit(hostUrl, {
|
|
timeout: 60000,
|
|
onBeforeLoad(win) {
|
|
cy.stub(win, 'open').as('windowOpen')
|
|
}
|
|
})
|
|
|
|
cy.get('.clr-abort-modal', { timeout: 60000 }).should('be.visible')
|
|
cy.get('.clr-abort-modal').last().should('contain.text', 'startupservice')
|
|
cy.get('.clr-abort-modal').last().contains('button', 'Show log').click()
|
|
|
|
cy.get('@windowOpen').should('have.been.calledOnce')
|
|
cy.get('@windowOpen').then((stub: any) => {
|
|
const url = stub.firstCall.args[0]
|
|
|
|
expect(url).to.contain(STARTUP_PROGRAM)
|
|
expect(url).to.contain('_debug=131')
|
|
// The browser route is what makes the log available: no execution task.
|
|
expect(url).not.to.contain('_executionTasks')
|
|
})
|
|
})
|
|
})
|