Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
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
26 changes: 20 additions & 6 deletions packages/jest-fela-bindings/src/createSnapshotFactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,14 +32,28 @@ export default function createSnapshotFactory(
) {
// reset renderer to have a clean setup
renderer.clear()
let markup

const markup = renderToMarkup(
createElement(
RendererProvider,
{ renderer },
createElement(ThemeProvider, { theme }, component)
if (renderToMarkup.renderToStaticMarkup) {
markup = renderToMarkup.renderToStaticMarkup(
createElement(
RendererProvider,
{ renderer },
createElement(ThemeProvider, { theme }, component)
)
)
)
} else {
const div = document.createElement('div')
renderToMarkup.render(
createElement(
RendererProvider,
{ renderer },
createElement(ThemeProvider, { theme }, component)
),
div
)
markup = div.innerHTML
}

return `${formatCSS(renderToString(renderer))}\n\n${formatHTML(markup)}`
}
Expand Down
8 changes: 4 additions & 4 deletions packages/jest-react-fela/src/createSnapshot.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { createElement } from 'react'
import { renderToStaticMarkup } from 'react-dom/server'
import { createRenderer } from 'fela'
import { renderToStaticMarkup } from 'react-dom/server'
import { render } from 'react-dom'

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The problem is, that this is not going to work with React 18 which is now the stable release. You‘ll get a „render is deprecated“ warning for every snapshot 😕

@alizeait alizeait May 20, 2022

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I see, how about we either

  • Create a second React < 18 export that uses render
  • try/catch react 18 like we did previously but then projects on React 18 still using render fail
  • or allow passing extra arguments to createSnapshot to decide between render/createRoot, this can be helpful if people are on React 18 and still using render

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think 2 separate exports in the same package would be my preferred way.
I tried it before, but I couldn't get React 18 with createRoot to output any markup for jest since it renders async now and thus one would have to await the snapshot in every test instead.

TBH I think the current renderToStaticMarkup is all you need for snapshots. I'd even argue that snapshots with jsdom logic in it are out of scope for component snapshot tests.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The problem now is the usage of useLayoutEffect on the server. The recommended way by the React team is to replace useLayoutEffect with useEffect server-side like:

const useUniversalLayoutEffect =
  typeof window !== 'undefined' ? useLayoutEffect : useEffect;

The problem with using renderToStaticMarkup in a jsdom environment is that the above snippet would return useLayoutEffect since window is defined in jsdom and React will complain about using useLayoutEffect server-side

import { RendererProvider, ThemeProvider } from 'react-fela'

import { createSnapshotFactory } from 'jest-fela-bindings'

function renderToMarkup(component) {
return renderToStaticMarkup(component)
}
const renderToMarkup =
typeof window === 'undefined' ? { renderToStaticMarkup } : { render }

export default createSnapshotFactory(
createElement,
Expand Down
Loading