OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-note / test / unit / notebook-read-access.test.js

46 lines · javascript ref:
import test from 'brittle'
import { enforceNotebookReadAccess } from '../../lib/routes/notebooks.js'

function fakeRes () {
  return { statusCode: 200, _body: null, setHeader () {}, end (b) { this._body = b } }
}

test('enforceNotebookReadAccess - public notebook is readable without auth', async (t) => {
  const res = fakeRes()
  const nm = { getNotebook: async () => ({ slug: 'pub', visibility: 'public' }) }
  const server = { authManager: { authorizeRequest: async () => { throw new Error('public notebook must not require authorization') } } }

  const meta = await enforceNotebookReadAccess({}, res, server, nm, 'pub')
  t.ok(meta, 'returns metadata')
  t.is(res.statusCode, 200, 'no error status')
})

test('enforceNotebookReadAccess - private notebook is hidden from unauthorized (404, no leak)', async (t) => {
  const res = fakeRes()
  const nm = { getNotebook: async () => ({ slug: 'sec', visibility: 'private' }) }
  const server = { authManager: { authorizeRequest: async () => ({ authorized: false, auth: null, reason: 'Not authenticated' }) } }

  const meta = await enforceNotebookReadAccess({}, res, server, nm, 'sec')
  t.is(meta, null, 'access denied → null')
  t.is(res.statusCode, 404, 'responds 404')
  t.absent(res._body.toLowerCase().includes('private'), 'does not reveal the notebook is private')
})

test('enforceNotebookReadAccess - private notebook is readable by an authorized user', async (t) => {
  const res = fakeRes()
  const nm = { getNotebook: async () => ({ slug: 'sec', visibility: 'private' }) }
  const server = { authManager: { authorizeRequest: async () => ({ authorized: true, auth: { userId: 'u' }, reason: null }) } }

  const meta = await enforceNotebookReadAccess({}, res, server, nm, 'sec')
  t.ok(meta, 'authorized → returns metadata')
  t.is(meta.slug, 'sec')
})

test('enforceNotebookReadAccess - missing notebook → 404', async (t) => {
  const res = fakeRes()
  const nm = { getNotebook: async () => null }
  const meta = await enforceNotebookReadAccess({}, res, {}, nm, 'nope')
  t.is(meta, null)
  t.is(res.statusCode, 404)
})