Files
vercel__next.js/test/unit/incremental-cache/file-system-cache.test.ts
Hendrik Liebau 6a1b6336a3 Remove revalidate property from incremental cache ctx for FETCH kind (#76500)
The `revalidate` property of the `ctx` object that is passed into the
incremental cache by the patched `fetch` as well as `unstable_cache` is
unused since it was introduced in #43659. It was just added because of
how the method signature for `set()` was changed back then.

However, for those kinds of cache entries, the `revalidate` context
property is never used, and instead the `revalidate` property of the
passed-in `data` is used.

To avoid further confusion (e.g. in [this
question](https://github.com/vercel/next.js/pull/76207#discussion_r1968478141)),
this PR improves the method signatures and types of the incremental
cache so that the different call-site use cases can be clearly
discriminated, and superfluous context properties can be omitted.
2025-02-28 14:44:57 +01:00

130 lines
3.0 KiB
TypeScript

import { promises as fs } from 'node:fs'
import { fileURLToPath } from 'node:url'
import FileSystemCache from 'next/dist/server/lib/incremental-cache/file-system-cache'
import { nodeFs } from 'next/dist/server/lib/node-fs-methods'
import {
CachedRouteKind,
IncrementalCacheKind,
} from 'next/dist/server/response-cache'
const cacheDir = fileURLToPath(new URL('./cache', import.meta.url))
describe('FileSystemCache', () => {
it('set image route', async () => {
const fsCache = new FileSystemCache({
_requestHeaders: {},
flushToDisk: true,
fs: nodeFs,
serverDistDir: cacheDir,
revalidatedTags: [],
})
const binary = await fs.readFile(
fileURLToPath(new URL('./images/icon.png', import.meta.url))
)
await fsCache.set(
'icon.png',
{
body: binary,
headers: {
'Content-Type': 'image/png',
},
status: 200,
kind: CachedRouteKind.APP_ROUTE,
},
{}
)
expect(
(
await fsCache.get('icon.png', {
kind: IncrementalCacheKind.APP_ROUTE,
isFallback: undefined,
})
)?.value
).toEqual({
body: binary,
headers: {
'Content-Type': 'image/png',
},
status: 200,
kind: IncrementalCacheKind.APP_ROUTE,
})
})
})
describe('FileSystemCache (isrMemory 0)', () => {
const fsCache = new FileSystemCache({
_requestHeaders: {},
flushToDisk: true,
fs: nodeFs,
serverDistDir: cacheDir,
revalidatedTags: [],
maxMemoryCacheSize: 0, // disable memory cache
})
it('should cache fetch', async () => {
await fsCache.set(
'fetch-cache',
{
kind: CachedRouteKind.FETCH,
data: {
headers: {},
body: 'MTcwMDA1NjM4MQ==',
status: 200,
url: 'http://my-api.local',
},
revalidate: 30,
},
{
fetchCache: true,
fetchUrl: 'http://my-api.local',
fetchIdx: 5,
tags: ['server-time'],
}
)
const res = await fsCache.get('fetch-cache', {
tags: ['server-time'],
kind: IncrementalCacheKind.FETCH,
})
expect(res?.value).toEqual({
kind: 'FETCH',
data: {
headers: {},
body: 'MTcwMDA1NjM4MQ==',
status: 200,
url: 'http://my-api.local',
},
revalidate: 30,
tags: ['server-time'],
})
})
it('should cache unstable_cache', async () => {
await fsCache.set(
'unstable-cache',
{
kind: CachedRouteKind.FETCH,
data: { headers: {}, body: '1700056381', status: 200, url: '' },
revalidate: 30,
},
{ fetchCache: true, tags: ['server-time2'] }
)
const res = await fsCache.get('unstable-cache', {
tags: ['server-time'],
kind: IncrementalCacheKind.FETCH,
})
expect(res?.value).toEqual({
kind: 'FETCH',
data: { headers: {}, body: '1700056381', status: 200, url: '' },
revalidate: 30,
tags: ['server-time2'],
})
})
})