Now that we've moved the logic to generate the events data to a model, and we've got access to the model in the component rendering the chart, we can render the data inside the chart instead of doing an extra AJAX request to get the same data. Originally, this was problaby done this way so the page wouldn't take several seconds to load while preparing the data for the chart when there are thousands of dates being displayed. With an AJAX call, the page would load as fast as usual, and then the chart would render after a few seconds. However, we can have an even better performance improvement in this scenario if we use a Set instead of an Array. The method `Array#include?`, which we were calling for every date in the data, is much slower that `Set#merge`. So now both the page and the chart load as fast as expected. We could also use something like: ``` def add (...) shared_keys.push(*collection.keys) end def build (...) shared_keys.uniq.each do |k| (...) end def shared_keys @shared_keys ||= [] end ``` Or other approaches to avoid using `Array#include?`. The performance would be similar to the one we get when using `Set`. We're using a `Set` because it makes more obvious that `shared_keys` is supposed to contain unique elements. We've had some tests failing in the past due to these AJAX requests being triggered automatically during the tests and no expectations checking the requests have finished, so now we're reducing the amount of flaky tests.
14 lines
454 B
Ruby
14 lines
454 B
Ruby
require "rails_helper"
|
|
|
|
describe Admin::Stats::ChartComponent do
|
|
it "renders a tag with JSON data" do
|
|
create(:user, :level_three, verified_at: "2009-09-09")
|
|
chart = Ahoy::Chart.new(:level_3_user)
|
|
|
|
render_inline Admin::Stats::ChartComponent.new(chart)
|
|
|
|
expect(page).to have_css "h2", exact_text: "Level 3 users verified (1)"
|
|
expect(page).to have_css "[data-graph='{\"x\":[\"2009-09-09\"],\"Level 3 users verified\":[1]}']"
|
|
end
|
|
end
|