Files
cypress/packages/server/test/unit/cache_spec.js
2025-04-11 13:36:21 -04:00

206 lines
6.1 KiB
JavaScript

require('../spec_helper')
require(`../../lib/cwd`)
const Promise = require('bluebird')
const cache = require(`../../lib/cache`).cache
const { fs } = require(`../../lib/util/fs`)
describe('lib/cache', () => {
beforeEach(async () => {
await cache.remove()
})
context('projects', () => {
describe('#insertProject', () => {
it('inserts project by path', async () => {
await cache.insertProject('foo/bar')
const projects = await cache.__get('PROJECTS')
expect(projects).to.deep.eq(['foo/bar'])
})
it('inserts project at the start', async () => {
await cache.insertProject('foo')
await cache.insertProject('bar')
const projects = await cache.__get('PROJECTS')
expect(projects).to.deep.eq(['bar', 'foo'])
})
it('can insert multiple projects in a row', async () => {
await cache.insertProject('baz')
await cache.insertProject('bar')
await cache.insertProject('foo')
const projects = await cache.__get('PROJECTS')
expect(projects).to.deep.eq(['foo', 'bar', 'baz'])
})
it('moves project to start if it already exists', async () => {
await cache.insertProject('foo')
await cache.insertProject('bar')
await cache.insertProject('baz')
await cache.insertProject('bar')
const projects = await cache.__get('PROJECTS')
expect(projects).to.deep.eq(['bar', 'baz', 'foo'])
})
})
describe('#removeProject', () => {
it('removes project by path', async () => {
await cache.insertProject('/Users/brian/app')
await cache.removeProject('/Users/brian/app')
const projects = await cache.__get('PROJECTS')
expect(projects).to.deep.eq([])
})
})
})
describe('#getProjectRoots', () => {
beforeEach(function () {
this.statAsync = sinon.stub(fs, 'statAsync')
})
afterEach(function () {
this.statAsync.restore()
})
it('returns an array of paths', async function () {
this.statAsync.withArgs('/Users/brian/app').resolves()
this.statAsync.withArgs('/Users/sam/app2').resolves()
await cache.insertProject('/Users/brian/app')
await cache.insertProject('/Users/sam/app2')
const paths = await cache.getProjectRoots()
expect(paths).to.deep.eq(['/Users/sam/app2', '/Users/brian/app'])
})
it('removes any paths which no longer exist on the filesystem', async function () {
this.statAsync.withArgs('/Users/brian/app').resolves()
this.statAsync.withArgs('/Users/sam/app2').rejects(new Error())
await cache.insertProject('/Users/brian/app')
await cache.insertProject('/Users/sam/app2')
const paths = await cache.getProjectRoots()
expect(paths).to.deep.eq(['/Users/brian/app'])
// we have to wait on the write event because
// of process.nextTick
await Promise.delay(100)
const projects = await cache.__get('PROJECTS')
expect(projects).to.deep.eq(['/Users/brian/app'])
})
})
})
context('project preferences', () => {
it('should insert a projects preferences into the cache', async () => {
const testProjectTitle = 'launchpad'
const testPreferences = { testingType: 'e2e', browserPath: '/some/test/path' }
await cache.insertProjectPreferences(testProjectTitle, testPreferences)
const preferences = await cache.__get('PROJECT_PREFERENCES')
expect(preferences[testProjectTitle]).to.deep.equal(testPreferences)
})
it('should insert multiple projects preferences into the cache', async () => {
const testProjectTitle = 'launchpad'
const testPreferences = { testingType: 'e2e', browserPath: '/some/test/path' }
const anotherTestProjectTitle = 'launchpad'
const anotherTestPreferene = { testingType: 'e2e', browserPath: '/some/test/path' }
await cache.insertProjectPreferences(testProjectTitle, testPreferences)
await cache.insertProjectPreferences(anotherTestProjectTitle, anotherTestPreferene)
const preferences = await cache.__get('PROJECT_PREFERENCES')
expect(preferences).to.have.property(testProjectTitle)
expect(preferences).to.have.property(anotherTestProjectTitle)
})
it('should clear the projects preferred preferences', async () => {
const testProjectTitle = 'launchpad'
const testPreferences = { testingType: 'e2e', browserPath: '/some/test/path' }
await cache.insertProjectPreferences(testProjectTitle, testPreferences)
await cache.removeProjectPreferences(testProjectTitle)
const preferences = await cache.__get('PROJECT_PREFERENCES')
expect(preferences[testProjectTitle]).to.equal(null)
})
})
context('#setUser / #getUser', () => {
beforeEach(function () {
this.user = {
id: 1,
name: 'brian',
email: 'a@b.com',
authToken: '1111-2222-3333-4444',
}
})
it('sets and gets user', async function () {
await cache.setUser(this.user)
const user = await cache.getUser()
expect(user).to.deep.eq(this.user)
})
})
context('#removeUser', () => {
it('sets user to empty object', async function () {
await cache.setUser(this.user)
await cache.removeUser()
const user = await cache.getUser()
expect(user).to.deep.eq({})
})
})
context('queues public methods', () => {
it('is able to write both values', async function () {
await Promise.all([
cache.setUser({ name: 'brian', authToken: 'auth-token-123' }),
cache.insertProject('foo'),
])
const json = await cache._read()
expect(json).to.deep.eq({
USER: {
name: 'brian',
authToken: 'auth-token-123',
},
PROJECTS: ['foo'],
PROJECT_PREFERENCES: {},
PROJECTS_CONFIG: {},
COHORTS: {},
})
})
})
context('cohorts', () => {
it('should get no cohorts when empty', async function () {
const cohorts = await cache.getCohorts()
expect(cohorts).to.deep.eq({})
})
it('should insert a cohort', async function () {
const cohort = {
name: 'cohort_id',
cohort: 'A',
}
await cache.insertCohort(cohort)
const cohorts = await cache.getCohorts()
expect(cohorts).to.deep.eq({ [cohort.name]: cohort })
})
})