From 78bba5658054acfbeb3ecbcdd5f0d98ed9e3efee Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Mon, 8 Jul 2019 15:50:01 -0700 Subject: [PATCH] Add API tests to serverless (#7774) * Add failing API tests to serverless * Add newline * Fix failing serverless tests --- packages/next-server/server/next-server.ts | 31 ++++++++++++++----- .../integration/serverless/pages/api/hello.js | 3 ++ .../serverless/pages/api/posts/[id].js | 3 ++ .../integration/serverless/test/index.test.js | 11 +++++++ 4 files changed, 41 insertions(+), 7 deletions(-) create mode 100644 test/integration/serverless/pages/api/hello.js create mode 100644 test/integration/serverless/pages/api/posts/[id].js diff --git a/packages/next-server/server/next-server.ts b/packages/next-server/server/next-server.ts index 416eef6cd9..cdc6a5a2cc 100644 --- a/packages/next-server/server/next-server.ts +++ b/packages/next-server/server/next-server.ts @@ -58,7 +58,7 @@ export default class Server { nextConfig: NextConfig distDir: string publicDir: string - buildManifest: string + pagesManifest: string buildId: string renderOpts: { poweredByHeader: boolean @@ -88,7 +88,11 @@ export default class Server { this.distDir = join(this.dir, this.nextConfig.distDir) // this.pagesDir = join(this.dir, 'pages') this.publicDir = join(this.dir, CLIENT_PUBLIC_FILES_PATH) - this.buildManifest = join(this.distDir, BUILD_MANIFEST) + this.pagesManifest = join( + this.distDir, + this.nextConfig.target || 'server', + PAGES_MANIFEST + ) // Only serverRuntimeConfig needs the default // publicRuntimeConfig gets it's default in client/index.js @@ -278,8 +282,12 @@ export default class Server { pathname: string ) { let params: Params | boolean = false + let resolverFunction: any + + try { + resolverFunction = await this.resolveApiRequest(pathname) + } catch (err) {} - let resolverFunction = await this.resolveApiRequest(pathname) if ( this.dynamicRoutes && this.dynamicRoutes.length > 0 && @@ -294,6 +302,17 @@ export default class Server { } } + if (!resolverFunction) { + return this.render404(req, res) + } + + if (!this.renderOpts.dev && this.nextConfig.target === 'serverless') { + const mod = require(resolverFunction) + if (typeof mod.default === 'function') { + return mod.default(req, res) + } + } + apiResolver( req, res, @@ -344,10 +363,8 @@ export default class Server { } private getDynamicRoutes() { - const manifest = require(this.buildManifest) - const dynamicRoutedPages = Object.keys(manifest.pages).filter( - isDynamicRoute - ) + const manifest = require(this.pagesManifest) + const dynamicRoutedPages = Object.keys(manifest).filter(isDynamicRoute) return getSortedRoutes(dynamicRoutedPages).map(page => ({ page, match: getRouteMatcher(getRouteRegex(page)), diff --git a/test/integration/serverless/pages/api/hello.js b/test/integration/serverless/pages/api/hello.js new file mode 100644 index 0000000000..a9f26c92c2 --- /dev/null +++ b/test/integration/serverless/pages/api/hello.js @@ -0,0 +1,3 @@ +export default (req, res) => { + res.send('hello world') +} diff --git a/test/integration/serverless/pages/api/posts/[id].js b/test/integration/serverless/pages/api/posts/[id].js new file mode 100644 index 0000000000..490c95a79f --- /dev/null +++ b/test/integration/serverless/pages/api/posts/[id].js @@ -0,0 +1,3 @@ +export default (req, res) => { + res.json({ post: req.query.id }) +} diff --git a/test/integration/serverless/test/index.test.js b/test/integration/serverless/test/index.test.js index 465c884aa1..21c4b25161 100644 --- a/test/integration/serverless/test/index.test.js +++ b/test/integration/serverless/test/index.test.js @@ -133,6 +133,17 @@ describe('Serverless', () => { expect(text).toMatch(/some interesting title/) }) + it('should reply on API request successfully', async () => { + const content = await renderViaHTTP(appPort, '/api/hello') + expect(content).toMatch(/hello world/) + }) + + it('should reply on dynamic API request successfully', async () => { + const result = await renderViaHTTP(appPort, '/api/posts/post-1') + const { post } = JSON.parse(result) + expect(post).toBe('post-1') + }) + describe('With basic usage', () => { it('should allow etag header support', async () => { const url = `http://localhost:${appPort}/` -- GitLab