jbuilder 2.8.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,457 +1,312 @@
1
1
  require "test_helper"
2
- require "mocha/setup"
3
- require "active_model"
4
- require "action_view"
5
2
  require "action_view/testing/resolvers"
6
- require "active_support/cache"
7
- require "jbuilder/jbuilder_template"
8
-
9
- BLOG_POST_PARTIAL = <<-JBUILDER
10
- json.extract! blog_post, :id, :body
11
- json.author do
12
- first_name, last_name = blog_post.author_name.split(nil, 2)
13
- json.first_name first_name
14
- json.last_name last_name
15
- end
16
- JBUILDER
17
-
18
- COLLECTION_PARTIAL = <<-JBUILDER
19
- json.extract! collection, :id, :name
20
- JBUILDER
21
-
22
- RACER_PARTIAL = <<-JBUILDER
23
- json.extract! racer, :id, :name
24
- JBUILDER
25
-
26
- class Racer
27
- extend ActiveModel::Naming
28
- include ActiveModel::Conversion
29
-
30
- def initialize(id, name)
31
- @id, @name = id, name
32
- end
33
-
34
- attr_reader :id, :name
35
- end
36
-
37
3
 
38
- BlogPost = Struct.new(:id, :body, :author_name)
39
- Collection = Struct.new(:id, :name)
40
- blog_authors = [ "David Heinemeier Hansson", "Pavel Pravosud" ].cycle
41
- BLOG_POST_COLLECTION = Array.new(10){ |i| BlogPost.new(i+1, "post body #{i+1}", blog_authors.next) }
42
- COLLECTION_COLLECTION = Array.new(5){ |i| Collection.new(i+1, "collection #{i+1}") }
43
-
44
- ActionView::Template.register_template_handler :jbuilder, JbuilderHandler
45
-
46
- PARTIALS = {
47
- "_partial.json.jbuilder" => "foo ||= 'hello'; json.content foo",
48
- "_blog_post.json.jbuilder" => BLOG_POST_PARTIAL,
49
- "racers/_racer.json.jbuilder" => RACER_PARTIAL,
50
- "_collection.json.jbuilder" => COLLECTION_PARTIAL
51
- }
52
-
53
- module Rails
54
- def self.cache
55
- @cache ||= ActiveSupport::Cache::MemoryStore.new
56
- end
57
- end
4
+ class JbuilderTemplateTest < ActiveSupport::TestCase
5
+ POST_PARTIAL = <<-JBUILDER
6
+ json.extract! post, :id, :body
7
+ json.author do
8
+ first_name, last_name = post.author_name.split(nil, 2)
9
+ json.first_name first_name
10
+ json.last_name last_name
11
+ end
12
+ JBUILDER
58
13
 
59
- class JbuilderTemplateTest < ActionView::TestCase
60
- setup do
61
- @context = self
62
- Rails.cache.clear
63
- end
14
+ COLLECTION_PARTIAL = <<-JBUILDER
15
+ json.extract! collection, :id, :name
16
+ JBUILDER
64
17
 
65
- def jbuild(source, options = {})
66
- @rendered = []
67
- partials = options.fetch(:partials, PARTIALS).clone
68
- partials["test.json.jbuilder"] = source
69
- resolver = ActionView::FixtureResolver.new(partials)
70
- lookup_context.view_paths = [resolver]
71
- template = ActionView::Template.new(source, "test", JbuilderHandler, virtual_path: "test")
72
- json = template.render(self, {}).strip
73
- MultiJson.load(json)
74
- end
18
+ RACER_PARTIAL = <<-JBUILDER
19
+ json.extract! racer, :id, :name
20
+ JBUILDER
75
21
 
76
- def undef_context_methods(*names)
77
- self.class_eval do
78
- names.each do |name|
79
- undef_method name.to_sym if method_defined?(name.to_sym)
80
- end
81
- end
82
- end
22
+ PARTIALS = {
23
+ "_partial.json.jbuilder" => "json.content content",
24
+ "_post.json.jbuilder" => POST_PARTIAL,
25
+ "racers/_racer.json.jbuilder" => RACER_PARTIAL,
26
+ "_collection.json.jbuilder" => COLLECTION_PARTIAL,
83
27
 
84
- def assert_collection_rendered(result, context = nil)
85
- result = result.fetch(context) if context
28
+ # Ensure we find only Jbuilder partials from within Jbuilder templates.
29
+ "_post.html.erb" => "Hello world!"
30
+ }
86
31
 
87
- assert_equal 10, result.length
88
- assert_equal Array, result.class
89
- assert_equal "post body 5", result[4]["body"]
90
- assert_equal "Heinemeier Hansson", result[2]["author"]["last_name"]
91
- assert_equal "Pavel", result[5]["author"]["first_name"]
92
- end
32
+ AUTHORS = [ "David Heinemeier Hansson", "Pavel Pravosud" ].cycle
33
+ POSTS = (1..10).collect { |i| Post.new(i, "Post ##{i}", AUTHORS.next) }
93
34
 
94
- test "rendering" do
95
- result = jbuild(<<-JBUILDER)
96
- json.content "hello"
97
- JBUILDER
35
+ setup { Rails.cache.clear }
98
36
 
37
+ test "basic template" do
38
+ result = render('json.content "hello"')
99
39
  assert_equal "hello", result["content"]
100
40
  end
101
41
 
102
- test "key_format! with parameter" do
103
- result = jbuild(<<-JBUILDER)
104
- json.key_format! camelize: [:lower]
105
- json.camel_style "for JS"
106
- JBUILDER
107
-
108
- assert_equal ["camelStyle"], result.keys
109
- end
110
-
111
- test "key_format! propagates to child elements" do
112
- result = jbuild(<<-JBUILDER)
113
- json.key_format! :upcase
114
- json.level1 "one"
115
- json.level2 do
116
- json.value "two"
117
- end
118
- JBUILDER
119
-
120
- assert_equal "one", result["LEVEL1"]
121
- assert_equal "two", result["LEVEL2"]["VALUE"]
42
+ test "partial by name with top-level locals" do
43
+ result = render('json.partial! "partial", content: "hello"')
44
+ assert_equal "hello", result["content"]
122
45
  end
123
46
 
124
- test "partial! renders partial" do
125
- result = jbuild(<<-JBUILDER)
126
- json.partial! "partial"
127
- JBUILDER
128
-
47
+ test "partial by name with nested locals" do
48
+ result = render('json.partial! "partial", locals: { content: "hello" }')
129
49
  assert_equal "hello", result["content"]
130
50
  end
131
51
 
132
- test "partial! + locals via :locals option" do
133
- result = jbuild(<<-JBUILDER)
134
- json.partial! "partial", locals: { foo: "howdy" }
135
- JBUILDER
136
-
137
- assert_equal "howdy", result["content"]
52
+ test "partial by options containing nested locals" do
53
+ result = render('json.partial! partial: "partial", locals: { content: "hello" }')
54
+ assert_equal "hello", result["content"]
138
55
  end
139
56
 
140
- test "partial! + locals without :locals key" do
141
- result = jbuild(<<-JBUILDER)
142
- json.partial! "partial", foo: "goodbye"
143
- JBUILDER
144
-
145
- assert_equal "goodbye", result["content"]
57
+ test "partial by options containing top-level locals" do
58
+ result = render('json.partial! partial: "partial", content: "hello"')
59
+ assert_equal "hello", result["content"]
146
60
  end
147
61
 
148
- test "partial! renders collections" do
149
- result = jbuild(<<-JBUILDER)
150
- json.partial! "blog_post", collection: BLOG_POST_COLLECTION, as: :blog_post
151
- JBUILDER
152
-
153
- assert_collection_rendered result
62
+ test "partial for Active Model" do
63
+ result = render('json.partial! @racer', racer: Racer.new(123, "Chris Harris"))
64
+ assert_equal 123, result["id"]
65
+ assert_equal "Chris Harris", result["name"]
154
66
  end
155
67
 
156
- test "partial! renders collections when as argument is a string" do
157
- result = jbuild(<<-JBUILDER)
158
- json.partial! "blog_post", collection: BLOG_POST_COLLECTION, as: "blog_post"
159
- JBUILDER
160
-
161
- assert_collection_rendered result
68
+ test "partial collection by name with symbol local" do
69
+ result = render('json.partial! "post", collection: @posts, as: :post', posts: POSTS)
70
+ assert_equal 10, result.count
71
+ assert_equal "Post #5", result[4]["body"]
72
+ assert_equal "Heinemeier Hansson", result[2]["author"]["last_name"]
73
+ assert_equal "Pavel", result[5]["author"]["first_name"]
162
74
  end
163
75
 
164
- test "partial! renders collections as collections" do
165
- result = jbuild(<<-JBUILDER)
166
- json.partial! "collection", collection: COLLECTION_COLLECTION, as: :collection
167
- JBUILDER
168
-
169
- assert_equal 5, result.length
76
+ test "partial collection by name with string local" do
77
+ result = render('json.partial! "post", collection: @posts, as: "post"', posts: POSTS)
78
+ assert_equal 10, result.count
79
+ assert_equal "Post #5", result[4]["body"]
80
+ assert_equal "Heinemeier Hansson", result[2]["author"]["last_name"]
81
+ assert_equal "Pavel", result[5]["author"]["first_name"]
170
82
  end
171
83
 
172
- test "partial! renders as empty array for nil-collection" do
173
- result = jbuild(<<-JBUILDER)
174
- json.partial! "blog_post", collection: nil, as: :blog_post
175
- JBUILDER
176
-
177
- assert_equal [], result
84
+ test "partial collection by options" do
85
+ result = render('json.partial! partial: "post", collection: @posts, as: :post', posts: POSTS)
86
+ assert_equal 10, result.count
87
+ assert_equal "Post #5", result[4]["body"]
88
+ assert_equal "Heinemeier Hansson", result[2]["author"]["last_name"]
89
+ assert_equal "Pavel", result[5]["author"]["first_name"]
178
90
  end
179
91
 
180
- test "partial! renders collection (alt. syntax)" do
181
- result = jbuild(<<-JBUILDER)
182
- json.partial! partial: "blog_post", collection: BLOG_POST_COLLECTION, as: :blog_post
183
- JBUILDER
184
-
185
- assert_collection_rendered result
92
+ test "nil partial collection by name" do
93
+ assert_equal [], render('json.partial! "post", collection: @posts, as: :post', posts: nil)
186
94
  end
187
95
 
188
- test "partial! renders as empty array for nil-collection (alt. syntax)" do
189
- result = jbuild(<<-JBUILDER)
190
- json.partial! partial: "blog_post", collection: nil, as: :blog_post
191
- JBUILDER
192
-
193
- assert_equal [], result
96
+ test "nil partial collection by options" do
97
+ assert_equal [], render('json.partial! partial: "post", collection: @posts, as: :post', posts: nil)
194
98
  end
195
99
 
196
- test "render array of partials" do
197
- result = jbuild(<<-JBUILDER)
198
- json.array! BLOG_POST_COLLECTION, partial: "blog_post", as: :blog_post
199
- JBUILDER
200
-
201
- assert_collection_rendered result
100
+ test "array of partials" do
101
+ result = render('json.array! @posts, partial: "post", as: :post', posts: POSTS)
102
+ assert_equal 10, result.count
103
+ assert_equal "Post #5", result[4]["body"]
104
+ assert_equal "Heinemeier Hansson", result[2]["author"]["last_name"]
105
+ assert_equal "Pavel", result[5]["author"]["first_name"]
202
106
  end
203
107
 
204
- test "render array of partials as empty array with nil-collection" do
205
- result = jbuild(<<-JBUILDER)
206
- json.array! nil, partial: "blog_post", as: :blog_post
207
- JBUILDER
208
-
209
- assert_equal [], result
108
+ test "empty array of partials from nil collection" do
109
+ assert_equal [], render('json.array! @posts, partial: "post", as: :post', posts: nil)
210
110
  end
211
111
 
212
- test "render array of partials as a value" do
213
- result = jbuild(<<-JBUILDER)
214
- json.posts BLOG_POST_COLLECTION, partial: "blog_post", as: :blog_post
215
- JBUILDER
216
-
217
- assert_collection_rendered result, "posts"
112
+ test "array of partials under key" do
113
+ result = render('json.posts @posts, partial: "post", as: :post', posts: POSTS)
114
+ assert_equal 10, result["posts"].count
115
+ assert_equal "Post #5", result["posts"][4]["body"]
116
+ assert_equal "Heinemeier Hansson", result["posts"][2]["author"]["last_name"]
117
+ assert_equal "Pavel", result["posts"][5]["author"]["first_name"]
218
118
  end
219
119
 
220
- test "render as empty array if partials as a nil value" do
221
- result = jbuild <<-JBUILDER
222
- json.posts nil, partial: "blog_post", as: :blog_post
223
- JBUILDER
224
-
120
+ test "empty array of partials under key from nil collection" do
121
+ result = render('json.posts @posts, partial: "post", as: :post', posts: nil)
225
122
  assert_equal [], result["posts"]
226
123
  end
227
124
 
228
- test "cache an empty block" do
229
- undef_context_methods :fragment_name_with_digest, :cache_fragment_name
230
-
231
- jbuild <<-JBUILDER
232
- json.cache! "nothing" do
125
+ test "object fragment caching" do
126
+ render(<<-JBUILDER)
127
+ json.cache! "cache-key" do
128
+ json.name "Hit"
233
129
  end
234
130
  JBUILDER
235
131
 
236
- result = nil
237
-
238
- assert_nothing_raised do
239
- result = jbuild(<<-JBUILDER)
240
- json.foo "bar"
241
- json.cache! "nothing" do
242
- end
243
- JBUILDER
244
- end
245
-
246
- assert_equal "bar", result["foo"]
132
+ hit = render('json.cache! "cache-key" do; end')
133
+ assert_equal "Hit", hit["name"]
247
134
  end
248
135
 
249
- test "fragment caching a JSON object" do
250
- undef_context_methods :fragment_name_with_digest, :cache_fragment_name
251
-
252
- jbuild <<-JBUILDER
253
- json.cache! "cachekey" do
254
- json.name "Cache"
136
+ test "conditional object fragment caching" do
137
+ render(<<-JBUILDER)
138
+ json.cache_if! true, "cache-key" do
139
+ json.a "Hit"
255
140
  end
256
- JBUILDER
257
141
 
258
- result = jbuild(<<-JBUILDER)
259
- json.cache! "cachekey" do
260
- json.name "Miss"
142
+ json.cache_if! false, "cache-key" do
143
+ json.b "Hit"
261
144
  end
262
145
  JBUILDER
263
146
 
264
- assert_equal "Cache", result["name"]
265
- end
266
-
267
- test "conditionally fragment caching a JSON object" do
268
- undef_context_methods :fragment_name_with_digest, :cache_fragment_name
269
-
270
- jbuild <<-JBUILDER
271
- json.cache_if! true, "cachekey" do
272
- json.test1 "Cache"
147
+ result = render(<<-JBUILDER)
148
+ json.cache_if! true, "cache-key" do
149
+ json.a "Miss"
273
150
  end
274
- json.cache_if! false, "cachekey" do
275
- json.test2 "Cache"
276
- end
277
- JBUILDER
278
151
 
279
- result = jbuild(<<-JBUILDER)
280
- json.cache_if! true, "cachekey" do
281
- json.test1 "Miss"
282
- end
283
- json.cache_if! false, "cachekey" do
284
- json.test2 "Miss"
152
+ json.cache_if! false, "cache-key" do
153
+ json.b "Miss"
285
154
  end
286
155
  JBUILDER
287
156
 
288
- assert_equal "Cache", result["test1"]
289
- assert_equal "Miss", result["test2"]
157
+ assert_equal "Hit", result["a"]
158
+ assert_equal "Miss", result["b"]
290
159
  end
291
160
 
292
- test "fragment caching deserializes an array" do
293
- undef_context_methods :fragment_name_with_digest, :cache_fragment_name
161
+ test "object fragment caching with expiry" do
162
+ travel_to "2018-05-12 11:29:00 -0400"
294
163
 
295
- jbuild <<-JBUILDER
296
- json.cache! "cachekey" do
297
- json.array! %w[a b c]
164
+ render <<-JBUILDER
165
+ json.cache! "cache-key", expires_in: 1.minute do
166
+ json.name "Hit"
298
167
  end
299
168
  JBUILDER
300
169
 
301
- result = jbuild(<<-JBUILDER)
302
- json.cache! "cachekey" do
303
- json.array! %w[1 2 3]
170
+ travel 30.seconds
171
+
172
+ result = render(<<-JBUILDER)
173
+ json.cache! "cache-key", expires_in: 1.minute do
174
+ json.name "Miss"
304
175
  end
305
176
  JBUILDER
306
177
 
307
- assert_equal %w[a b c], result
308
- end
309
-
310
- test "fragment caching works with current cache digests" do
311
- undef_context_methods :fragment_name_with_digest
178
+ assert_equal "Hit", result["name"]
312
179
 
313
- @context.expects :cache_fragment_name
314
- ActiveSupport::Cache.expects :expand_cache_key
180
+ travel 31.seconds
315
181
 
316
- jbuild <<-JBUILDER
317
- json.cache! "cachekey" do
318
- json.name "Cache"
182
+ result = render(<<-JBUILDER)
183
+ json.cache! "cache-key", expires_in: 1.minute do
184
+ json.name "Miss"
319
185
  end
320
186
  JBUILDER
321
- end
322
187
 
323
- test "fragment caching uses combined_fragment_cache_key" do
324
- undef_context_methods :fragment_name_with_digest, :cache_fragment_name
325
-
326
- @context.expects(:combined_fragment_cache_key).with("cachekey")
188
+ assert_equal "Miss", result["name"]
189
+ end
327
190
 
328
- jbuild <<-JBUILDER
329
- json.cache! "cachekey" do
330
- json.name "Cache"
191
+ test "object root caching" do
192
+ render <<-JBUILDER
193
+ json.cache_root! "cache-key" do
194
+ json.name "Hit"
331
195
  end
332
196
  JBUILDER
333
- end
334
-
335
- test "fragment caching instrumentation" do
336
- undef_context_methods :fragment_name_with_digest, :cache_fragment_name
337
197
 
338
- payloads = {}
339
- ActiveSupport::Notifications.subscribe("read_fragment.action_controller") { |*args| payloads[:read_fragment] = args.last }
340
- ActiveSupport::Notifications.subscribe("write_fragment.action_controller") { |*args| payloads[:write_fragment] = args.last }
198
+ assert_equal JSON.dump(name: "Hit"), Rails.cache.read("jbuilder/root/cache-key")
341
199
 
342
- jbuild <<-JBUILDER
343
- json.cache! "cachekey" do
344
- json.name "Cache"
200
+ result = render(<<-JBUILDER)
201
+ json.cache_root! "cache-key" do
202
+ json.name "Miss"
345
203
  end
346
204
  JBUILDER
347
205
 
348
- assert_equal "jbuilder/cachekey", payloads[:read_fragment][:key]
349
- assert_equal "jbuilder/cachekey", payloads[:write_fragment][:key]
206
+ assert_equal "Hit", result["name"]
350
207
  end
351
208
 
352
- test "current cache digest option accepts options" do
353
- undef_context_methods :fragment_name_with_digest
354
-
355
- @context.expects(:cache_fragment_name).with("cachekey", skip_digest: true)
356
- ActiveSupport::Cache.expects :expand_cache_key
357
-
358
- jbuild <<-JBUILDER
359
- json.cache! "cachekey", skip_digest: true do
360
- json.name "Cache"
209
+ test "array fragment caching" do
210
+ render <<-JBUILDER
211
+ json.cache! "cache-key" do
212
+ json.array! %w[ a b c ]
361
213
  end
362
214
  JBUILDER
363
- end
364
215
 
365
- test "fragment caching accepts expires_in option" do
366
- undef_context_methods :fragment_name_with_digest
367
-
368
- @context.expects(:cache_fragment_name).with("cachekey", {})
369
-
370
- jbuild <<-JBUILDER
371
- json.cache! "cachekey", expires_in: 1.minute do
372
- json.name "Cache"
373
- end
374
- JBUILDER
216
+ assert_equal %w[ a b c ], render('json.cache! "cache-key" do; end')
375
217
  end
376
218
 
377
- test "caching root structure" do
378
- undef_context_methods :fragment_name_with_digest, :cache_fragment_name
379
-
380
- cache_miss_result = jbuild <<-JBUILDER
381
- json.cache_root! "cachekey" do
382
- json.name "Miss"
219
+ test "array root caching" do
220
+ render <<-JBUILDER
221
+ json.cache_root! "cache-key" do
222
+ json.array! %w[ a b c ]
383
223
  end
384
224
  JBUILDER
385
225
 
386
- cache_hit_result = jbuild <<-JBUILDER
387
- json.cache_root! "cachekey" do
388
- json.name "Hit"
226
+ assert_equal JSON.dump(%w[ a b c ]), Rails.cache.read("jbuilder/root/cache-key")
227
+
228
+ assert_equal %w[ a b c ], render(<<-JBUILDER)
229
+ json.cache_root! "cache-key" do
230
+ json.array! %w[ d e f ]
389
231
  end
390
232
  JBUILDER
391
-
392
- assert_equal cache_miss_result, cache_hit_result
393
233
  end
394
234
 
395
- test "failing to cache root after attributes have been defined" do
235
+ test "failing to cache root after JSON structures have been defined" do
396
236
  assert_raises ActionView::Template::Error, "cache_root! can't be used after JSON structures have been defined" do
397
- jbuild <<-JBUILDER
237
+ render <<-JBUILDER
398
238
  json.name "Kaboom"
399
- json.cache_root! "cachekey" do
239
+ json.cache_root! "cache-key" do
400
240
  json.name "Miss"
401
241
  end
402
242
  JBUILDER
403
243
  end
404
244
  end
405
245
 
406
- test "does not perform caching when controller.perform_caching is false" do
407
- controller.perform_caching = false
246
+ test "empty fragment caching" do
247
+ render 'json.cache! "nothing" do; end'
408
248
 
409
- jbuild <<-JBUILDER
410
- json.cache! "cachekey" do
411
- json.name "Cache"
412
- end
413
- JBUILDER
249
+ result = nil
250
+
251
+ assert_nothing_raised do
252
+ result = render(<<-JBUILDER)
253
+ json.foo "bar"
254
+ json.cache! "nothing" do; end
255
+ JBUILDER
256
+ end
414
257
 
415
- assert_equal Rails.cache.inspect[/entries=(\d+)/, 1], "0"
258
+ assert_equal "bar", result["foo"]
416
259
  end
417
260
 
418
- test "invokes templates via params via set!" do
419
- @post = BLOG_POST_COLLECTION.first
261
+ test "cache instrumentation" do
262
+ payloads = {}
420
263
 
421
- result = jbuild(<<-JBUILDER)
422
- json.post @post, partial: "blog_post", as: :blog_post
264
+ ActiveSupport::Notifications.subscribe("read_fragment.action_controller") { |*args| payloads[:read] = args.last }
265
+ ActiveSupport::Notifications.subscribe("write_fragment.action_controller") { |*args| payloads[:write] = args.last }
266
+
267
+ render <<-JBUILDER
268
+ json.cache! "cache-key" do
269
+ json.name "Cache"
270
+ end
423
271
  JBUILDER
424
272
 
425
- assert_equal 1, result["post"]["id"]
426
- assert_equal "post body 1", result["post"]["body"]
427
- assert_equal "David", result["post"]["author"]["first_name"]
273
+ assert_equal "jbuilder/cache-key", payloads[:read][:key]
274
+ assert_equal "jbuilder/cache-key", payloads[:write][:key]
428
275
  end
429
276
 
430
- test "invokes templates implicitly for ActiveModel objects" do
431
- @racer = Racer.new(123, "Chris Harris")
432
-
433
- result = jbuild(<<-JBUILDER)
434
- json.partial! @racer
277
+ test "camelized keys" do
278
+ result = render(<<-JBUILDER)
279
+ json.key_format! camelize: [:lower]
280
+ json.first_name "David"
435
281
  JBUILDER
436
282
 
437
- assert_equal %w[id name], result.keys
438
- assert_equal 123, result["id"]
439
- assert_equal "Chris Harris", result["name"]
283
+ assert_equal "David", result["firstName"]
440
284
  end
441
285
 
442
- test "renders partial via set! with same name as HTML partial" do
443
- partials = {
444
- "_blog_post.html.erb" => "Hello!",
445
- "_blog_post.json.jbuilder" => BLOG_POST_PARTIAL
446
- }
286
+ private
287
+ def render(*args)
288
+ JSON.load render_without_parsing(*args)
289
+ end
447
290
 
448
- @post = BLOG_POST_COLLECTION.first
291
+ def render_without_parsing(source, assigns = {})
292
+ view = build_view(fixtures: PARTIALS.merge("source.json.jbuilder" => source), assigns: assigns)
293
+ view.render(template: "source.json.jbuilder")
294
+ end
449
295
 
450
- result = jbuild(<<-JBUILDER, partials: partials)
451
- json.post @post, partial: "blog_post", as: :blog_post
452
- JBUILDER
296
+ def build_view(options = {})
297
+ resolver = ActionView::FixtureResolver.new(options.fetch(:fixtures))
298
+ lookup_context = ActionView::LookupContext.new([ resolver ], {}, [""])
299
+ controller = ActionView::TestCase::TestController.new
453
300
 
454
- assert_not_nil result["post"]
455
- assert_equal 1, result["post"]["id"]
456
- end
301
+ # TODO: Use with_empty_template_cache unconditionally after dropping support for Rails <6.0.
302
+ view = if ActionView::Base.respond_to?(:with_empty_template_cache)
303
+ ActionView::Base.with_empty_template_cache.new(lookup_context, options.fetch(:assigns, {}), controller)
304
+ else
305
+ ActionView::Base.new(lookup_context, options.fetch(:assigns, {}), controller)
306
+ end
307
+
308
+ def view.view_cache_dependencies; []; end
309
+
310
+ view
311
+ end
457
312
  end