Skip to content

Commit c1ef99f

Browse files
add specs for packs generator
1 parent 5fcbd85 commit c1ef99f

File tree

8 files changed

+171
-6
lines changed

8 files changed

+171
-6
lines changed

node_package/tests/ComponentRegistry.test.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,28 @@ const onPageLoadedCallbacks = [];
1313
const onPageUnloadedCallbacks = [];
1414

1515
jest.mock('../src/pageLifecycle', () => ({
16-
onPageLoaded: jest.fn(cb => {
16+
onPageLoaded: jest.fn((cb) => {
1717
onPageLoadedCallbacks.push(cb);
1818
cb();
1919
}),
20-
onPageUnloaded: jest.fn(cb => {
20+
onPageUnloaded: jest.fn((cb) => {
2121
onPageUnloadedCallbacks.push(cb);
2222
cb();
23-
})
23+
}),
2424
}));
2525

2626
jest.mock('../src/context', () => ({
27-
getContextAndRailsContext: () => ({ railsContext: { componentRegistryTimeout: 100 } })
27+
getContextAndRailsContext: () => ({ railsContext: { componentRegistryTimeout: 100 } }),
2828
}));
2929

3030
describe('ComponentRegistry', () => {
3131
beforeEach(() => {
3232
ComponentRegistry.clear();
33-
onPageLoadedCallbacks.forEach(cb => cb());
33+
onPageLoadedCallbacks.forEach((cb) => cb());
3434
});
3535

3636
afterEach(() => {
37-
onPageUnloadedCallbacks.forEach(cb => cb());
37+
onPageUnloadedCallbacks.forEach((cb) => cb());
3838
});
3939

4040
it('registers and retrieves React function components', () => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
'use client';
2+
3+
// File with "use client" directive which makes it a client component
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
'use client';
2+
3+
// File with "use client" directive which makes it a client component
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
'use client';
2+
3+
// File with "use client" directive which makes it a client component
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// File without "use client" directive which makes it a server component
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// File without "use client" directive which makes it a server component
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// File without "use client" directive which makes it a server component

spec/dummy/spec/packs_generator_spec.rb

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ module ReactOnRails
2222
let(:old_auto_load_bundle) { ReactOnRails.configuration.auto_load_bundle }
2323

2424
before do
25+
stub_const("ReactOnRailsPro", Class.new do
26+
def self.configuration
27+
@configuration ||= Struct.new(:enable_rsc_support, :rsc_rendering_url_path).new(false, nil)
28+
end
29+
end)
2530
ReactOnRails.configuration.server_bundle_js_file = server_bundle_js_file
2631
ReactOnRails.configuration.components_subdirectory = "ror_components"
2732
ReactOnRails.configuration.webpack_generated_files = webpack_generated_files
@@ -209,6 +214,154 @@ module ReactOnRails
209214
end
210215
end
211216

217+
context "when RSC support is enabled" do
218+
let(:components_directory) { "ReactServerComponents" }
219+
let(:rsc_rendering_url_path) { "/rsc" }
220+
221+
before do
222+
stub_packer_source_path(component_name: components_directory,
223+
packer_source_path: packer_source_path)
224+
allow(ReactOnRails::Utils).to receive(:react_on_rails_pro?).and_return(true)
225+
allow(ReactOnRailsPro.configuration).to receive_messages(
226+
enable_rsc_support: true,
227+
rsc_rendering_url_path: rsc_rendering_url_path
228+
)
229+
end
230+
231+
context "when common component is not a client entrypoint" do
232+
before do
233+
described_class.instance.generate_packs_if_stale
234+
end
235+
236+
it "creates pack with server component registration" do
237+
component_name = "ReactServerComponent"
238+
component_pack = "#{generated_directory}/#{component_name}.js"
239+
pack_content = File.read(component_pack)
240+
expected_content = <<~CONTENT.strip
241+
import registerServerComponent from 'react-on-rails/registerServerComponent';
242+
243+
registerServerComponent({
244+
rscRenderingUrlPath: "#{rsc_rendering_url_path}",
245+
}, "#{component_name}")
246+
CONTENT
247+
248+
expect(pack_content).to eq(expected_content)
249+
end
250+
end
251+
252+
context "when client component is not a client entrypoint" do
253+
before do
254+
described_class.instance.generate_packs_if_stale
255+
end
256+
257+
it "creates pack with client component registration" do
258+
component_name = "ReactClientComponentWithClientAndServer"
259+
component_pack = "#{generated_directory}/#{component_name}.js"
260+
pack_content = File.read(component_pack)
261+
expect(pack_content).to include("import ReactOnRails from 'react-on-rails';")
262+
expect(pack_content).to include("ReactOnRails.register({#{component_name}});")
263+
expect(pack_content).not_to include("registerServerComponent")
264+
end
265+
end
266+
267+
context "when server component is a client entrypoint" do
268+
before do
269+
described_class.instance.generate_packs_if_stale
270+
end
271+
272+
it "creates pack with server component registration" do
273+
component_name = "ReactServerComponentWithClientAndServer"
274+
component_pack = "#{generated_directory}/#{component_name}.js"
275+
pack_content = File.read(component_pack)
276+
expected_content = <<~CONTENT.strip
277+
import registerServerComponent from 'react-on-rails/registerServerComponent';
278+
279+
registerServerComponent({
280+
rscRenderingUrlPath: "#{rsc_rendering_url_path}",
281+
}, "#{component_name}")
282+
CONTENT
283+
284+
expect(pack_content).to eq(expected_content)
285+
end
286+
end
287+
288+
context "when common component is a client entrypoint" do
289+
before do
290+
described_class.instance.generate_packs_if_stale
291+
end
292+
293+
it "creates pack with client component registration" do
294+
component_name = "ReactClientComponent"
295+
component_pack = "#{generated_directory}/#{component_name}.js"
296+
pack_content = File.read(component_pack)
297+
expect(pack_content).to include("import ReactOnRails from 'react-on-rails';")
298+
expect(pack_content).to include("ReactOnRails.register({#{component_name}});")
299+
expect(pack_content).not_to include("registerServerComponent")
300+
end
301+
end
302+
303+
context "when RSC support is disabled" do
304+
before do
305+
allow(ReactOnRailsPro.configuration).to receive(:enable_rsc_support).and_return(false)
306+
described_class.instance.generate_packs_if_stale
307+
end
308+
309+
it "creates pack with client component registration" do
310+
component_name = "ReactServerComponent"
311+
component_pack = "#{generated_directory}/#{component_name}.js"
312+
pack_content = File.read(component_pack)
313+
expect(pack_content).to include("import ReactOnRails from 'react-on-rails';")
314+
expect(pack_content).to include("ReactOnRails.register({#{component_name}});")
315+
expect(pack_content).not_to include("registerServerComponent")
316+
end
317+
end
318+
319+
context "when not using ReactOnRailsPro" do
320+
before do
321+
allow(ReactOnRails::Utils).to receive(:react_on_rails_pro?).and_return(false)
322+
described_class.instance.generate_packs_if_stale
323+
end
324+
325+
it "creates pack with client component registration" do
326+
component_name = "ReactServerComponent"
327+
component_pack = "#{generated_directory}/#{component_name}.js"
328+
pack_content = File.read(component_pack)
329+
expect(pack_content).to include("import ReactOnRails from 'react-on-rails';")
330+
expect(pack_content).to include("ReactOnRails.register({#{component_name}});")
331+
expect(pack_content).not_to include("registerServerComponent")
332+
end
333+
end
334+
335+
context "when registered on server bundle" do
336+
before do
337+
described_class.instance.generate_packs_if_stale
338+
end
339+
340+
it "register all components using ReactOnRails.register" do
341+
generated_server_bundle_path = File.join(
342+
Pathname(packer_source_entry_path).parent,
343+
"generated/server-bundle-generated.js"
344+
)
345+
generated_server_bundle_content = File.read(generated_server_bundle_path)
346+
expected_content = <<~CONTENT.strip
347+
import ReactOnRails from 'react-on-rails';
348+
349+
import ReactClientComponent from '../components/ReactServerComponents/ror_components/ReactClientComponent.jsx';
350+
import ReactServerComponent from '../components/ReactServerComponents/ror_components/ReactServerComponent.jsx';
351+
import ReactClientComponentWithClientAndServer from '../components/ReactServerComponents/ror_components/ReactClientComponentWithClientAndServer.server.jsx';
352+
import ReactServerComponentWithClientAndServer from '../components/ReactServerComponents/ror_components/ReactServerComponentWithClientAndServer.server.jsx';
353+
354+
ReactOnRails.register({ReactClientComponent,
355+
ReactServerComponent,
356+
ReactClientComponentWithClientAndServer,
357+
ReactServerComponentWithClientAndServer});
358+
CONTENT
359+
360+
expect(generated_server_bundle_content.strip).to eq(expected_content.strip)
361+
end
362+
end
363+
end
364+
212365
context "when pack generator is called" do
213366
let(:component_name) { "ComponentWithCommonOnly" }
214367
let(:component_pack) { "#{generated_directory}/#{component_name}.js" }

0 commit comments

Comments
 (0)