RSpec content matchers for turbo-stream response

Edit
equivalent Web Development
Public
Rails
RSpec

if you have RSpec request test  and 
In capybara if you want to check turbo stream content like

# spec/requests/hello_spec.rb
it do
put my_path, params: { }, as: :turbo_stream
expect(page).to have_content("hello")
end

it will not work

reason is that

page   is alias to 

def page
Capybara.string(response.body)
end


which gets pretty much converted to #text  on have_content RSpec natcher evaluation

And `Capybara.string`  will remove any <template>  tags. 

try this in Rails c

 Capybara.string("<template>foo</template> bar").text
=> bar # foo was ignored


Guess what: Turbo stream response wraps the response in  <template> ...frames... </template>

Source: this GH ticket for more info

so only way to test response with capybara

it do 
put my_path, params: { }, as: :turbo_stream
template = Nokogiri(response.body).css('template').last.inner_html # fetch inner content of <template> that contains frames
parsed = Capybara.string(template # parse the template content so RSpec matcher have_content works
expect(parsed).to have_content("Is this good?")
end

Helper 

# rails_spec.rb
# ...
def turbo_stream_page
# turbo_stream wraps response in <template> tag, Capybara ignore template tags
template_content = Nokogiri(response.body).css('template').last.inner_html
Capybara.string(template_content)
end


test

# spec/requests/hello_spec.rb
it do
put my_path, params: { }, as: :turbo_stream
expect(turbo_stream_page).to have_content("hello")
end

Payment successful

Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur amet labore.