Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore(e2e): Setup e2e test for streaming SSR #9349

Merged
merged 34 commits into from
Nov 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
612d9ff
Setup handler now setups up apollo ssr
dac09 Oct 26, 2023
03fda29
Add ability to generate delayedPage and setup streaming experiment in…
dac09 Oct 26, 2023
4d89a29
Merge branch 'main' into feat/stream-ssr-e2e
dac09 Oct 26, 2023
f140db5
Undo tui-tasks change
dac09 Oct 26, 2023
bebbe47
Add plugin to swap apollo provider
dac09 Oct 27, 2023
3a34e87
Swap localhost for 127.0.0.1 in production
dac09 Oct 27, 2023
045affa
Enable canary for streaming test-project
dac09 Oct 27, 2023
5fefc3a
Add script to convert test-project to ssr-fixture
dac09 Oct 29, 2023
458b48d
Add initial test for cell ssr
dac09 Oct 29, 2023
f06eb66
Add playwright tests for progressive rendering
dac09 Oct 30, 2023
1b362b0
Add to ci
dac09 Oct 30, 2023
42dd0dc
Typo
dac09 Oct 30, 2023
a65fa2f
Upgrade to canary as part of streaming fixture setup
dac09 Oct 30, 2023
3a1fef9
Disable telemetry for converting to ssr-fixture
dac09 Oct 30, 2023
9d24227
Merge branch 'main' into feat/stream-ssr-e2e
dac09 Oct 31, 2023
f3f9a7f
Keep upgrading to canary in test-project
dac09 Oct 31, 2023
8019409
Add ability to create canary test project
dac09 Oct 31, 2023
210a022
Update yarn.lock
dac09 Oct 31, 2023
c02d35b
Tweaks
dac09 Oct 31, 2023
904e166
Fix delayed page codemod bug
dac09 Nov 1, 2023
6416f42
Bump to latest react experimental package
dac09 Nov 1, 2023
c8feb80
Rebuild fixture
dac09 Nov 1, 2023
b28988f
Add tests for ssr prod
dac09 Nov 1, 2023
4c4b85e
Fix broken import
dac09 Nov 1, 2023
b96b471
Couple more imports
dac09 Nov 1, 2023
a5f6327
Merge branch 'main' into feat/stream-ssr-e2e
dac09 Nov 1, 2023
06bee5d
Hash all files in test-project
dac09 Nov 1, 2023
55067f0
Undo change, add extra line to yarn.lock
dac09 Nov 1, 2023
50e9888
Force cache to be invalidated
dac09 Nov 1, 2023
c8e6eda
Revert "Rebuild fixture"
dac09 Nov 1, 2023
386c6e8
Revert "Bump to latest react experimental package"
dac09 Nov 1, 2023
df16073
Merge branch 'main' into feat/stream-ssr-e2e
dac09 Nov 2, 2023
9d7303d
Merge branch 'main' into feat/stream-ssr-e2e
dac09 Nov 3, 2023
e40a6ec
Disable windows ssr tests for now
dac09 Nov 3, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions .github/actions/actionsLib.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,9 @@ export function projectCopy(redwoodProjectCwd) {
}

/**
* @param {{ baseKeyPrefix: string, distKeyPrefix: string }} options
* @param {{ baseKeyPrefix: string, distKeyPrefix: string, canary: boolean }} options
*/
export async function createCacheKeys({ baseKeyPrefix, distKeyPrefix }) {
export async function createCacheKeys({ baseKeyPrefix, distKeyPrefix, canary }) {
const baseKey = [
baseKeyPrefix,
process.env.RUNNER_OS,
Expand All @@ -76,7 +76,7 @@ export async function createCacheKeys({ baseKeyPrefix, distKeyPrefix }) {
baseKey,
'dependencies',
await hashFiles(['yarn.lock', '.yarnrc.yml'].join('\n')),
].join('-')
].join('-') + (canary ? '-canary' : '')

const distKey = [
dependenciesKey,
Expand All @@ -91,7 +91,7 @@ export async function createCacheKeys({ baseKeyPrefix, distKeyPrefix }) {
'lerna.json',
'packages',
].join('\n'))
].join('-')
].join('-') + (canary ? '-canary' : '')

return {
baseKey,
Expand Down
3 changes: 3 additions & 0 deletions .github/actions/set-up-test-project/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@ inputs:
bundler:
description: The bundler to use (vite or webpack)
default: vite
canary:
description: Upgrade the project to canary?
default: "false"

outputs:
test-project-path:
Expand Down
19 changes: 16 additions & 3 deletions .github/actions/set-up-test-project/setUpTestProject.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -25,16 +25,20 @@ core.setOutput('test-project-path', TEST_PROJECT_PATH)

const bundler = core.getInput('bundler')

const canary = core.getInput('canary') === 'true'


console.log({
bundler,
canary
})

console.log()

const {
dependenciesKey,
distKey
} = await createCacheKeys({ baseKeyPrefix: 'test-project', distKeyPrefix: bundler })
} = await createCacheKeys({ baseKeyPrefix: 'test-project', distKeyPrefix: bundler, canary })

/**
* @returns {Promise<void>}
Expand All @@ -54,17 +58,20 @@ async function main() {
await sharedTasks()
} else {
console.log(`Cache not found for input keys: ${distKey}, ${dependenciesKey}`)
await setUpTestProject()
await setUpTestProject({
canary: true
})
}

await cache.saveCache([TEST_PROJECT_PATH], distKey)
console.log(`Cache saved with key: ${distKey}`)
}

/**
* *@param {{canary: boolean}} options
* @returns {Promise<void>}
*/
async function setUpTestProject() {
async function setUpTestProject({ canary }) {
const TEST_PROJECT_FIXTURE_PATH = path.join(
REDWOOD_FRAMEWORK_PATH,
'__fixtures__',
Expand All @@ -83,6 +90,12 @@ async function setUpTestProject() {
await execInProject('yarn install')
console.log()

if (canary) {
console.log(`Upgrading project to canary`)
await execInProject('yarn rw upgrade -t canary')
console.log()
}

await cache.saveCache([TEST_PROJECT_PATH], dependenciesKey)
console.log(`Cache saved with key: ${dependenciesKey}`)

Expand Down
8 changes: 8 additions & 0 deletions .github/actions/ssr_related_changes/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
name: Streaming-SSR Related Changes
description: Determines if the PR makes any changes related to SSR or streaming
outputs:
rsc-related-changes:
description: If the PR makes any SSR related changes
runs:
using: node20
main: ssr_related_changes.mjs
9 changes: 9 additions & 0 deletions .github/actions/ssr_related_changes/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "ssr_related_changes",
"private": true,
"dependencies": {
"@actions/core": "1.10.0",
"@actions/exec": "1.1.1"
},
"packageManager": "[email protected]"
}
43 changes: 43 additions & 0 deletions .github/actions/ssr_related_changes/ssr_related_changes.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import core from '@actions/core'
import { exec, getExecOutput } from '@actions/exec'

async function main() {
const branch = process.env.GITHUB_BASE_REF

// If there is no branch, we're not in a pull request
if (!branch) {
core.setOutput('ssr-related-changes', false)
return
}

await exec(`git fetch origin ${branch}`)

const { stdout } = await getExecOutput(
`git diff origin/${branch} --name-only`
)

const changedFiles = stdout.toString().trim().split('\n').filter(Boolean)

for (const changedFile of changedFiles) {
console.log('changedFile', changedFile)

if (
changedFile.startsWith('tasks/smoke-tests/streaming-ssr') ||
changedFile.startsWith('tasks/smoke-tests/basePlaywright.config.ts') ||
changedFile.startsWith('github/actions/ssr_related_changes/') ||
changedFile.startsWith('packages/internal/') ||
changedFile.startsWith('packages/project-config/') ||
changedFile.startsWith('packages/web/') ||
changedFile.startsWith('packages/router/') ||
changedFile.startsWith('packages/web-server/') ||
changedFile.startsWith('packages/vite/')
) {
core.setOutput('ssr-related-changes', true)
return
}
}

core.setOutput('ssr-related-changes', false)
}

main()
66 changes: 66 additions & 0 deletions .github/actions/ssr_related_changes/yarn.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!

__metadata:
version: 6
cacheKey: 8c0

"@actions/core@npm:1.10.0":
version: 1.10.0
resolution: "@actions/core@npm:1.10.0"
dependencies:
"@actions/http-client": ^2.0.1
uuid: ^8.3.2
checksum: 9214d1e0cf5cf2a5d48b8f3b12488c6be9f6722ea60f2397409226e8410b5a3e12e558d9b66c93469d180399865ec20180119408a1770f026bd9ecac6965fcda
languageName: node
linkType: hard

"@actions/exec@npm:1.1.1":
version: 1.1.1
resolution: "@actions/exec@npm:1.1.1"
dependencies:
"@actions/io": ^1.0.1
checksum: 4a09f6bdbe50ce68b5cf8a7254d176230d6a74bccf6ecc3857feee209a8c950ba9adec87cc5ecceb04110182d1c17117234e45557d72fde6229b7fd3a395322a
languageName: node
linkType: hard

"@actions/http-client@npm:^2.0.1":
version: 2.0.1
resolution: "@actions/http-client@npm:2.0.1"
dependencies:
tunnel: ^0.0.6
checksum: b58987ba2f53d7988f612ede7ff834573a3360c21f8fdea9fea92f26ada0fd0efafb22aa7d83f49c18965a5b765775d5253e2edb8d9476d924c4b304ef726b67
languageName: node
linkType: hard

"@actions/io@npm:^1.0.1":
version: 1.1.2
resolution: "@actions/io@npm:1.1.2"
checksum: 61c871bbee1cf58f57917d9bb2cf6bb7ea4dc40de3f65c7fb4ec619ceff57fc98f56be9cca2d476b09e7a96e1cba0d88cd125c4f690d384b9483935186f256c1
languageName: node
linkType: hard

"ssr_related_changes@workspace:.":
version: 0.0.0-use.local
resolution: "ssr_related_changes@workspace:."
dependencies:
"@actions/core": 1.10.0
"@actions/exec": 1.1.1
languageName: unknown
linkType: soft

"tunnel@npm:^0.0.6":
version: 0.0.6
resolution: "tunnel@npm:0.0.6"
checksum: e27e7e896f2426c1c747325b5f54efebc1a004647d853fad892b46d64e37591ccd0b97439470795e5262b5c0748d22beb4489a04a0a448029636670bfd801b75
languageName: node
linkType: hard

"uuid@npm:^8.3.2":
version: 8.3.2
resolution: "uuid@npm:8.3.2"
bin:
uuid: dist/bin/uuid
checksum: bcbb807a917d374a49f475fae2e87fdca7da5e5530820ef53f65ba1d12131bd81a92ecf259cc7ce317cbe0f289e7d79fdfebcef9bfa3087c8c8a2fa304c9be54
languageName: node
linkType: hard
99 changes: 99 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,31 @@ jobs:
id: rsc-related-changes
uses: ./.github/actions/rsc_related_changes

ssr-related-changes:
needs: check
if: github.repository == 'redwoodjs/redwood'
name: 🌤️ SSR related changes?
runs-on: ubuntu-latest
outputs:
ssr-related-changes: ${{ steps.ssr-related-changes.outputs.ssr-related-changes }}
steps:
- uses: actions/checkout@v3

- name: ⬢ Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 18

- name: 🐈 Yarn install
working-directory: ./.github/actions/ssr_related_changes
run: yarn install --inline-builds
env:
GITHUB_TOKEN: ${{ github.token }}

- name: 🌤️ SSR related changes?
id: ssr-related-changes
uses: ./.github/actions/ssr_related_changes

check:
needs: only-doc-changes
if: needs.only-doc-changes.outputs.only-doc-changes == 'false'
Expand Down Expand Up @@ -232,6 +257,80 @@ jobs:
steps:
- run: echo "Only doc changes"

ssr-smoke-tests:
needs: ssr-related-changes
if: needs.ssr-related-changes.outputs.ssr-related-changes == 'true'

strategy:
matrix:
os: [ubuntu-latest]
# [ubuntu-latest, windows-latest] disabled, because windows misbehaving
# waiting for help from main-man Josh

name: 🔁 SSR Smoke tests / ${{ matrix.os }}
runs-on: ${{ matrix.os }}

env:
REDWOOD_CI: 1
REDWOOD_VERBOSE_TELEMETRY: 1

steps:
- uses: actions/checkout@v3

- name: ⬢ Set up Node.js
uses: actions/setup-node@v3
with:
node-version: 18

- name: 🐈 Set up yarn cache
uses: ./.github/actions/set-up-yarn-cache

- name: 🐈 Yarn install
run: yarn install --inline-builds
env:
GITHUB_TOKEN: ${{ github.token }}

- name: 🔨 Build
run: yarn build

- name: 🌲 Set up test project
id: set-up-test-project
uses: ./.github/actions/set-up-test-project
with:
bundler: vite
canary: true
env:
REDWOOD_DISABLE_TELEMETRY: 1
YARN_ENABLE_IMMUTABLE_INSTALLS: false

- name: Run SSR codemods on test project
run: ./tasks/test-project/convert-to-ssr-fixture ${{ steps.set-up-test-project.outputs.test-project-path }}
env:
REDWOOD_DISABLE_TELEMETRY: 1

- name: 🎭 Install playwright dependencies
run: npx playwright install --with-deps chromium

- name: Run SSR [DEV] smoke tests
working-directory: ./tasks/smoke-tests/streaming-ssr-dev
run: npx playwright test
env:
REDWOOD_TEST_PROJECT_PATH: '${{ steps.set-up-test-project.outputs.test-project-path }}'
REDWOOD_DISABLE_TELEMETRY: 1

- name: Build for production
working-directory: ${{ steps.set-up-test-project.outputs.test-project-path }}
run: yarn rw build --no-prerender
env:
REDWOOD_DISABLE_TELEMETRY: 1

- name: Run SSR [PROD] smoke tests
working-directory: ./tasks/smoke-tests/streaming-ssr-prod
run: npx playwright test
env:
REDWOOD_TEST_PROJECT_PATH: '${{ steps.set-up-test-project.outputs.test-project-path }}'
REDWOOD_DISABLE_TELEMETRY: 1

smoke-tests:
needs: check

Expand Down
1 change: 1 addition & 0 deletions .yarnrc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,4 @@ plugins:
preferInteractive: true

yarnPath: .yarn/releases/yarn-3.6.3.cjs

Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import path from 'path'

import { Listr } from 'listr2'

import { addWebPackages } from '@redwoodjs/cli-helpers'
import { getConfigPath } from '@redwoodjs/project-config'
import { errorTelemetry } from '@redwoodjs/telemetry'

Expand Down Expand Up @@ -158,6 +159,9 @@ export const handler = async ({ force, verbose }) => {
})
},
},
addWebPackages([
'@apollo/[email protected]',
]),
{
task: () => {
printTaskEpilogue(command, description, EXPERIMENTAL_TOPIC_ID)
Expand Down
3 changes: 3 additions & 0 deletions packages/vite/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { getConfig, getPaths } from '@redwoodjs/project-config'

import handleJsAsJsx from './plugins/vite-plugin-jsx-loader'
import removeFromBundle from './plugins/vite-plugin-remove-from-bundle'
import swapApolloProvider from './plugins/vite-plugin-swap-apollo-provider'

/**
* Pre-configured vite plugin, with required config for Redwood apps.
Expand Down Expand Up @@ -261,6 +262,8 @@ export default function redwoodPluginVite(): PluginOption[] {
}
},
},
// We can remove when streaming is stable
rwConfig.experimental.streamingSsr.enabled && swapApolloProvider(),
// -----------------
handleJsAsJsx(),
// Remove the splash-page from the bundle.
Expand Down
18 changes: 18 additions & 0 deletions packages/vite/src/plugins/__tests__/swap-apollo-provider.test.mts
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import assert from 'node:assert/strict'
import { describe, it } from 'node:test'

import plugin from '../vite-plugin-swap-apollo-provider.js'

// @ts-expect-error node test not configured correctly
const swapApolloProvider = plugin.default


describe('excludeModule', () => {
it('should swap the import', async() => {
const plugin = swapApolloProvider()

const output = await plugin.transform(`import ApolloProvider from '@redwoodjs/web/apollo'`, '/Users/dac09/Experiments/ssr-2354/web/src/App.tsx')

assert.strictEqual(output, "import ApolloProvider from '@redwoodjs/web/dist/apollo/suspense'")
})
})
Loading
Loading