Skip to content

Commit

Permalink
Merge branch 'develop' into update-chrome-stable-from-100.0.4896.75-b…
Browse files Browse the repository at this point in the history
…eta-from-101.0.4951.15
  • Loading branch information
elevatebart authored Apr 7, 2022
2 parents ab85ac4 + 3b7f0b5 commit 9b2eb4b
Show file tree
Hide file tree
Showing 2 changed files with 112 additions and 55 deletions.
73 changes: 40 additions & 33 deletions packages/driver/src/cy/commands/sessions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ const currentTestRegisteredSessions = new Map()

/**
* rules for clearing session data:
* if page reloads due to top navigation OR user hard reload, session data should NOT be cleared
* if user relaunches the browser or launches a new spec, session data SHOULD be cleared
* session data SHOULD be cleared between specs in run mode
* - if page reloads due to top navigation OR user hard reload, session data should NOT be cleared
* - if user relaunches the browser or launches a new spec, session data SHOULD be cleared
* - session data SHOULD be cleared between specs in run mode
*
* therefore session data should be cleared with spec browser launch
*/
Expand All @@ -35,8 +35,8 @@ const getSessionDetailsForTable = (sessState) => {
const isSecureContext = (url) => url.startsWith('https:')

const getCurrentOriginStorage = () => {
// localStorage.length propery is not always accurate, we must stringify to check for entries
// for ex) try setting localStorge.key = 'val' and reading localStorage.length, may be 0.
// localStorage.length property is not always accurate, we must stringify to check for entries
// for ex) try setting localStorage.key = 'val' and reading localStorage.length, may be 0.
const _localStorageStr = JSON.stringify(window.localStorage)
const _localStorage = _localStorageStr.length > 2 && JSON.parse(_localStorageStr)
const _sessionStorageStr = JSON.stringify(window.sessionStorage)
Expand Down Expand Up @@ -109,7 +109,7 @@ const setPostMessageLocalStorage = async (specWindow, originOptions) => {
specWindow.removeEventListener('message', onPostMessage)
$iframeContainer.remove()
})
.catch((err) => {
.catch(() => {
Cypress.log({
name: 'warning',
message: `failed to access session localStorage data on origin(s): ${_.xor(origins, successOrigins).join(', ')}`,
Expand All @@ -118,30 +118,38 @@ const setPostMessageLocalStorage = async (specWindow, originOptions) => {
}

const getConsoleProps = (sessState) => {
const ret = {
const sessionDetails = getSessionDetailsForTable(sessState)

const tables = _.flatMap(sessionDetails, (val, domain) => {
const cookiesTable = () => {
return {
name: `🍪 Cookies - ${domain} (${val.cookies.length})`,
data: val.cookies,
}
}

const localStorageTable = () => {
return {
name: `📁 Storage - ${domain} (${_.keys(val.localStorage.value).length})`,
data: _.map(val.localStorage.value, (value, key) => {
return {
key,
value,
}
}),
}
}

return [
val.cookies && cookiesTable,
val.localStorage && localStorageTable,
]
})

return {
id: sessState.id,
table: _.compact(_.flatMap(getSessionDetailsForTable(sessState), (val, domain) => {
return [() => {
return {
name: `🍪 Cookies - ${domain} (${val.cookies.length})`,
data: val.cookies,
}
},
val.localStorage && (() => {
return {
name: `📁 Storage - ${domain} (${_.keys(val.localStorage.value).length})`,
data: _.map(val.localStorage.value, (value, key) => {
return {
key, value,
}
}),
}
})]
}))
,
table: _.compact(tables),
}

return ret
}

const getPostMessageLocalStorage = (specWindow, origins): Promise<any[]> => {
Expand Down Expand Up @@ -211,6 +219,7 @@ export default function (Commands, Cypress, cy) {

return currentSessions[id]
}

const clearActiveSessions = () => {
const curSessions = cy.state('activeSessions') || {}

Expand Down Expand Up @@ -284,7 +293,6 @@ export default function (Commands, Cypress, cy) {
}

const sessions = {

defineSession (options = {} as any) {
const sess_state = {
id: options.id,
Expand Down Expand Up @@ -495,7 +503,6 @@ export default function (Commands, Cypress, cy) {
return
})
},

}

Cypress.on('run:start', () => {
Expand All @@ -515,20 +522,20 @@ export default function (Commands, Cypress, cy) {
// backup session command so we can set it as codeFrame location for errors later on
const sessionCommand = cy.state('current')

// stringfy deterministically if we were given an object
// stringify deterministically if we were given an object
id = typeof id === 'string' ? id : stringifyStable(id)

if (options) {
if (!_.isObject(options)) {
$errUtils.throwErrByPath('sessions.session.wrongArgOptions')
}

const validopts = {
const validOpts = {
'validate': 'function',
}

Object.keys(options).forEach((key) => {
const expectedType = validopts[key]
const expectedType = validOpts[key]

if (!expectedType) {
$errUtils.throwErrByPath('sessions.session.wrongArgOptionUnexpected', { args: { key } })
Expand Down
94 changes: 72 additions & 22 deletions packages/runner/cypress/integration/sessions.ui.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,22 @@ describe('runner/cypress sessions.ui.spec', { viewportWidth: 1000, viewportHeigh
})
})

cy.get('.sessions-container').click()
cy.get('.sessions-container')
.should('contain', 'Sessions (1)')
.click()
.should('contain', 'blank_session')

cy.get('.command-name-session')
.first()
.find('i.successful')
.siblings()
.should('contain', '(new) blank_session')

cy.get('.command-name-session')
.last()
.contains('blank_session')
.click()

cy.percySnapshot()
})

Expand All @@ -34,40 +47,77 @@ describe('runner/cypress sessions.ui.spec', { viewportWidth: 1000, viewportHeigh
})

it('t1', () => {
assert(true)
expect(window.localStorage.foo).to.eq('val')
})

it('t2', () => {
assert(true)
expect(window.localStorage.foo).to.eq('val')
})

it('t3', () => {
assert(true)
expect(window.localStorage.foo).to.eq('val')
})
})

cy.get('.test').each(($el) => cy.wrap($el).click())

cy.get('.sessions-container').eq(0).click()
.should('contain', '1')

cy.get('.sessions-container').eq(1).click()
.should('contain', '1')

cy.get('.test').eq(0)
.should('contain', 'Sessions (1)')
.should('contain', 'user1')
.should('contain', '(new)')
cy.log('validating new session was created')
cy.get('.test').eq(0).within(() => {
cy.get('.sessions-container')
.should('contain', 'Sessions (1)')
.click()
.should('contain', 'user1')

cy.get('.command-name-session')
.first()
.find('i.successful')
.siblings()
.should('contain', '(new) user1')

cy.get('.command-name-session')
.last()
.contains('user1')
.click()

cy.get('.command-name-assert')
.should('have.class', 'command-state-passed')
})

cy.get('.test').eq(1)
.should('contain', 'Sessions (1)')
.should('contain', 'user1')
.should('contain', '(saved)')
cy.log('validating previous session was used')
cy.get('.test').eq(1).within(() => {
cy.get('.sessions-container')
.should('contain', 'Sessions (1)')
.click()
.should('contain', 'user1')

cy.get('.command-name-session')
.first()
.find('i.pending')
.siblings()
.should('contain', '(saved) user1')

cy.get('.command-name-session')
.last()
.contains('user1')
})

cy.get('.test').eq(2)
.should('contain', 'Sessions (1)')
.should('contain', 'user1')
.should('contain', '(recreated)')
cy.log('validating session was recreated after it failed to verify')
cy.get('.test').eq(2).within(() => {
cy.get('.sessions-container')
.should('contain', 'Sessions (1)')
.click()
.should('contain', 'user1')

cy.get('.command-name-session')
.first()
.find('i.bad')
.siblings()
.should('contain', '(recreated) user1')

cy.get('.command-name-session')
.last()
.contains('user1')
})

cy.percySnapshot()
})
Expand Down

0 comments on commit 9b2eb4b

Please sign in to comment.