Skip to content

Commit

Permalink
tests: add ssr + client headers result test
Browse files Browse the repository at this point in the history
  • Loading branch information
tannerlinsley committed Jan 27, 2025
1 parent 131747e commit 2466ec1
Show file tree
Hide file tree
Showing 5 changed files with 188 additions and 76 deletions.
56 changes: 56 additions & 0 deletions e2e/start/basic/app/routes/-server-fns/response-headers.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
import * as React from 'react'
import { createServerFn } from '@tanstack/start'
import { getHeaders, setHeader } from '@tanstack/start/server'
import type { HTTPHeaderName } from '@tanstack/start/server'

export const getTestHeaders = createServerFn().handler(() => {
setHeader('x-test-header', 'test-value')

return {
serverHeaders: getHeaders(),
headers: getHeaders(),
}
})

type TestHeadersResult = {
headers?: Partial<Record<HTTPHeaderName, string | undefined>>
serverHeaders?: Partial<Record<HTTPHeaderName, string | undefined>>
}

// Usage
export function ResponseHeaders({
initialTestHeaders,
}: {
initialTestHeaders: TestHeadersResult
}) {
const [testHeadersResult, setTestHeadersResult] =
React.useState<TestHeadersResult>(initialTestHeaders)

return (
<div className="p-2 border m-2 grid gap-2">
<h3>Headers Test</h3>
<form
className="flex flex-col gap-2"
data-testid="serialize-formdata-form"
onSubmit={(evt) => {
evt.preventDefault()
getTestHeaders().then(setTestHeadersResult)
}}
>
<button
type="submit"
data-testid="test-headers-btn"
className="rounded-md bg-white px-2.5 py-1.5 text-sm font-semibold text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 hover:bg-gray-50"
>
Get Headers
</button>
</form>
<div className="overflow-y-auto">
<h4>Headers:</h4>
<pre data-testid="test-headers-result">
{JSON.stringify(testHeadersResult.headers, null, 2)}
</pre>
</div>
</div>
)
}
8 changes: 8 additions & 0 deletions e2e/start/basic/app/routes/server-fns.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,26 @@ import { ConsistentServerFnCalls } from './-server-fns/consistent-fn-calls'
import { MultipartServerFnCall } from './-server-fns/multipart-formdata-fn-call'
import { AllowServerFnReturnNull } from './-server-fns/allow-fn-return-null'
import { SerializeFormDataFnCall } from './-server-fns/serialize-formdata-fn-call'
import { ResponseHeaders, getTestHeaders } from './-server-fns/response-headers'

export const Route = createFileRoute('/server-fns')({
component: RouteComponent,
loader: async () => {
return {
testHeaders: await getTestHeaders(),
}
},
})

function RouteComponent() {
const { testHeaders } = Route.useLoaderData()
return (
<>
<ConsistentServerFnCalls />
<MultipartServerFnCall />
<AllowServerFnReturnNull />
<SerializeFormDataFnCall />
<ResponseHeaders initialTestHeaders={testHeaders} />
</>
)
}
47 changes: 47 additions & 0 deletions e2e/start/basic/tests/navigation.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { expect, test } from '@playwright/test'

test('Navigating to post', async ({ page }) => {
await page.goto('/')

await page.getByRole('link', { name: 'Posts' }).click()
await page.getByRole('link', { name: 'sunt aut facere repe' }).click()
await page.getByRole('link', { name: 'Deep View' }).click()
await expect(page.getByRole('heading')).toContainText('sunt aut facere')
})

test('Navigating to user', async ({ page }) => {
await page.goto('/')

await page.getByRole('link', { name: 'Users' }).click()
await page.getByRole('link', { name: 'Leanne Graham' }).click()
await expect(page.getByRole('heading')).toContainText('Leanne Graham')
})

test('Navigating nested layouts', async ({ page }) => {
await page.goto('/')

await page.getByRole('link', { name: 'Layout', exact: true }).click()

await expect(page.locator('body')).toContainText("I'm a layout")
await expect(page.locator('body')).toContainText("I'm a nested layout")

await page.getByRole('link', { name: 'Layout A' }).click()
await expect(page.locator('body')).toContainText("I'm layout A!")

await page.getByRole('link', { name: 'Layout B' }).click()
await expect(page.locator('body')).toContainText("I'm layout B!")
})

test('directly going to a route with scripts', async ({ page }) => {
await page.goto('/scripts')
expect(await page.evaluate('window.SCRIPT_1')).toBe(true)
expect(await page.evaluate('window.SCRIPT_2')).toBe(undefined)
})

test('Navigating to a not-found route', async ({ page }) => {
await page.goto('/')

await page.getByRole('link', { name: 'This Route Does Not Exist' }).click()
await page.getByRole('link', { name: 'Start Over' }).click()
await expect(page.getByRole('heading')).toContainText('Welcome Home!')
})
Original file line number Diff line number Diff line change
@@ -1,77 +1,5 @@
import { expect, test } from '@playwright/test'

test('Navigating to post', async ({ page }) => {
await page.goto('/')

await page.getByRole('link', { name: 'Posts' }).click()
await page.getByRole('link', { name: 'sunt aut facere repe' }).click()
await page.getByRole('link', { name: 'Deep View' }).click()
await expect(page.getByRole('heading')).toContainText('sunt aut facere')
})

test('Navigating to user', async ({ page }) => {
await page.goto('/')

await page.getByRole('link', { name: 'Users' }).click()
await page.getByRole('link', { name: 'Leanne Graham' }).click()
await expect(page.getByRole('heading')).toContainText('Leanne Graham')
})

test('Navigating nested layouts', async ({ page }) => {
await page.goto('/')

await page.getByRole('link', { name: 'Layout', exact: true }).click()

await expect(page.locator('body')).toContainText("I'm a layout")
await expect(page.locator('body')).toContainText("I'm a nested layout")

await page.getByRole('link', { name: 'Layout A' }).click()
await expect(page.locator('body')).toContainText("I'm layout A!")

await page.getByRole('link', { name: 'Layout B' }).click()
await expect(page.locator('body')).toContainText("I'm layout B!")
})

test('directly going to a route with scripts', async ({ page }) => {
await page.goto('/scripts')
expect(await page.evaluate('window.SCRIPT_1')).toBe(true)
expect(await page.evaluate('window.SCRIPT_2')).toBe(undefined)
})

test('Navigating to a not-found route', async ({ page }) => {
await page.goto('/')

await page.getByRole('link', { name: 'This Route Does Not Exist' }).click()
await page.getByRole('link', { name: 'Start Over' }).click()
await expect(page.getByRole('heading')).toContainText('Welcome Home!')
})

test('Navigating to deferred route', async ({ page }) => {
await page.goto('/')

await page.getByRole('link', { name: 'Deferred' }).click()

await expect(page.getByTestId('regular-person')).toContainText('John Doe')
await expect(page.getByTestId('deferred-person')).toContainText(
'Tanner Linsley',
)
await expect(page.getByTestId('deferred-stuff')).toContainText(
'Hello deferred!',
)
})

test('Directly visiting the deferred route', async ({ page }) => {
await page.goto('/deferred')

await expect(page.getByTestId('regular-person')).toContainText('John Doe')
await expect(page.getByTestId('deferred-person')).toContainText(
'Tanner Linsley',
)
await expect(page.getByTestId('deferred-stuff')).toContainText(
'Hello deferred!',
)
})

test('invoking a server function with custom response status code', async ({
page,
}) => {
Expand Down Expand Up @@ -241,9 +169,48 @@ test('Server function can correctly send and receive FormData', async ({
).toContainText(expected)
})

test('streaming loader data', async ({ page }) => {
await page.goto('/stream')
test('server function can correctly send and receive headers', async ({
page,
}) => {
await page.goto('/server-fns')

await page.waitForLoadState('networkidle')
// console.log(await page.getByTestId('test-headers-result').textContent())
await expect(page.getByTestId('test-headers-result')).toContainText(`{
"accept": "application/json",
"accept-encoding": "gzip, deflate, br, zstd",
"accept-language": "en-US",
"connection": "keep-alive",
"content-type": "application/json",
"host": "localhost:42322",
"sec-ch-ua": "\\"Not(A:Brand\\";v=\\"99\\", \\"HeadlessChrome\\";v=\\"133\\", \\"Chromium\\";v=\\"133\\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\\"Windows\\"",
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.6943.16 Safari/537.36"
}`)

await page.getByTestId('test-headers-btn').click()
await page.waitForLoadState('networkidle')

await expect(page.getByTestId('promise-data')).toContainText('promise-data')
await expect(page.getByTestId('stream-data')).toContainText('stream-data')
await expect(page.getByTestId('test-headers-result')).toContainText(`{
"host": "localhost:42322",
"connection": "keep-alive",
"sec-ch-ua-platform": "\\"Windows\\"",
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.6943.16 Safari/537.36",
"accept": "application/json",
"sec-ch-ua": "\\"Not(A:Brand\\";v=\\"99\\", \\"HeadlessChrome\\";v=\\"133\\", \\"Chromium\\";v=\\"133\\"",
"content-type": "application/json",
"sec-ch-ua-mobile": "?0",
"accept-language": "en-US",
"sec-fetch-site": "same-origin",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
"referer": "http://localhost:42322/server-fns",
"accept-encoding": "gzip, deflate, br, zstd"
}`)
})
34 changes: 34 additions & 0 deletions e2e/start/basic/tests/streaming.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { expect, test } from '@playwright/test'

test('Navigating to deferred route', async ({ page }) => {
await page.goto('/')

await page.getByRole('link', { name: 'Deferred' }).click()

await expect(page.getByTestId('regular-person')).toContainText('John Doe')
await expect(page.getByTestId('deferred-person')).toContainText(
'Tanner Linsley',
)
await expect(page.getByTestId('deferred-stuff')).toContainText(
'Hello deferred!',
)
})

test('Directly visiting the deferred route', async ({ page }) => {
await page.goto('/deferred')

await expect(page.getByTestId('regular-person')).toContainText('John Doe')
await expect(page.getByTestId('deferred-person')).toContainText(
'Tanner Linsley',
)
await expect(page.getByTestId('deferred-stuff')).toContainText(
'Hello deferred!',
)
})

test('streaming loader data', async ({ page }) => {
await page.goto('/stream')

await expect(page.getByTestId('promise-data')).toContainText('promise-data')
await expect(page.getByTestId('stream-data')).toContainText('stream-data')
})

0 comments on commit 2466ec1

Please sign in to comment.