0

In a page on my Rails 6 app, I have table cells rendered from the database, and sometimes the text in them is rendered with converted fancy quotes or other HTML entities encoded by our own t method, which does this:

def t(sanitize = true)
  Textile.textilize_without_paragraph_safe(self, false, sanitize)
end

It's used like this:

<span class="current_notes"><%= key.notes.t %></span>

So a stored string like Doesn't, pulled from the db, is converted by Textile to Doesn&#8217;t and rendered in the page as Doesn’t. Of course, testing the db value against the output of the page fails, because the quote has been converted.

expected to find visible css "#key_notes_135836989 span.current_notes" with text 
"Doesn't get used very often." within #<Capybara::Node::Element> but there were no matches. 

Also found "Doesn’t get used very often.", which matched the selector but not all filters. 

It also fails if I test against the db value, encoded with t, because that contains the HTML entity, not the special character:

expected to find visible css "#key_notes_135836989 span.current_notes" with text 
"Doesn&#8217;t get used very often." within #<Capybara::Node::Element> but there were no matches. 

Also found "Doesn’t get used very often.", which matched the selector but not all filters. 

If I assert against CGI.unescapeHTML(string.t), Capybara finds them equivalent.

      assert_selector("#key_notes_#{marys_key.id} span.current_notes",
                      text: CGI.unescapeHTML(marys_key.notes.t))

My question is, since Capybara is always testing against rendered HTML, it seems like there must be an easier way to do this? I can't imagine using CGI.unescapeHTML every time i have some fancy text on the page (it's everywhere in this app).

nimmolo
  • 191
  • 3
  • 14

0 Answers0