import { apiCallProperties } from "./apiauth" export function ensureSomethingExists(api: apiCallProperties, searchPath: string, find: (entity: any) => boolean, createPath: string, body: any): Cypress.Chainable { return searchSomething(api, searchPath, find).then(sRes => { if (sRes.entity) { return cy.wrap({ id: sRes.entity.id, initialSequence: 0 }) } return cy.request({ method: 'POST', url: `${api.mgntBaseURL}${createPath}`, headers: { Authorization: api.authHeader }, body: body, failOnStatusCode: false, followRedirect: false, }).then(cRes => { expect(cRes.status).to.equal(200) return { id: cRes.body.id, initialSequence: sRes.sequence } }) }).then((data) => { awaitDesired(90, (entity) => !!entity, data.initialSequence, api, searchPath, find) return cy.wrap(data.id) }) } export function ensureSomethingDoesntExist(api: apiCallProperties, searchPath: string, find: (entity: any) => boolean, deletePath: (entity: any) => string): Cypress.Chainable { return searchSomething(api, searchPath, find).then(sRes => { if (!sRes.entity) { return cy.wrap(0) } return cy.request({ method: 'DELETE', url: `${api.mgntBaseURL}${deletePath(sRes.entity)}`, headers: { Authorization: api.authHeader }, failOnStatusCode: false }).then((dRes) => { expect(dRes.status).to.equal(200) return sRes.sequence }) }).then((initialSequence) => { awaitDesired(90, (entity) => !entity , initialSequence, api, searchPath, find) return null }) } type SearchResult = { entity: any sequence: number } function searchSomething(api: apiCallProperties, searchPath: string, find: (entity: any) => boolean): Cypress.Chainable { return cy.request({ method: 'POST', url: `${api.mgntBaseURL}${searchPath}`, headers: { Authorization: api.authHeader }, }).then(res => { return { entity: res.body.result?.find(find) || null, sequence: res.body.details.processedSequence } }) } function awaitDesired(trials: number, expectEntity: (entity: any) => boolean, initialSequence: number, api: apiCallProperties, searchPath: string, find: (entity: any) => boolean) { searchSomething(api, searchPath, find).then(resp => { const foundExpectedEntity = expectEntity(resp.entity) const foundExpectedSequence = resp.sequence > initialSequence if (!foundExpectedEntity || !foundExpectedSequence) { expect(trials, `trying ${trials} more times`).to.be.greaterThan(0); cy.wait(1000) awaitDesired(trials - 1, expectEntity, initialSequence, api, searchPath, find) } }) }