JavaScript is used by about 98% of web users, so by testing without it enabled, we're only testing that the application works for a very reduced number of users. We proceeded this way in the past because CONSUL started using Rails 4.2 and truncating the database between JavaScript tests with database cleaner, which made these tests terribly slow. When we upgraded to Rails 5.1 and introduced system tests, we started using database transactions in JavaScript tests, making these tests much faster. So now we can use JavaScript tests everywhere without critically slowing down our test suite.
242 lines
8.2 KiB
Ruby
242 lines
8.2 KiB
Ruby
shared_examples "remotely_translatable" do |factory_name, path_name, path_arguments|
|
|
let(:arguments) do
|
|
path_arguments.map do |argument_name, path_to_value|
|
|
[argument_name, resource.send(path_to_value)]
|
|
end.to_h
|
|
end
|
|
let(:path) { send(path_name, arguments) }
|
|
let!(:resource) { create(factory_name) }
|
|
|
|
before do
|
|
Setting["feature.remote_translations"] = true
|
|
available_locales_response = %w[de en es fr pt zh-Hans]
|
|
expect(RemoteTranslations::Microsoft::AvailableLocales).to receive(:available_locales).at_most(4).times.
|
|
and_return(available_locales_response)
|
|
allow(Rails.application.secrets).to receive(:microsoft_api_key).and_return("123")
|
|
end
|
|
|
|
context "Button to request remote translation" do
|
|
scenario "should not be present when current locale translation exists" do
|
|
visit path
|
|
|
|
expect(page).not_to have_button("Translate page")
|
|
end
|
|
|
|
scenario "should be present when current locale translation does not exists" do
|
|
visit path
|
|
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect(page).to have_button("Traducir página")
|
|
end
|
|
|
|
scenario "should not be present when new current locale translation exists" do
|
|
add_translations(resource, :es)
|
|
visit path
|
|
expect(page).not_to have_button("Translate page")
|
|
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect(page).not_to have_button("Traducir página")
|
|
end
|
|
|
|
scenario "should not be present when there are no resources to translate" do
|
|
skip("only index_path") if show_path?(path_name)
|
|
resource.destroy!
|
|
visit path
|
|
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect(page).not_to have_button("Traducir página")
|
|
end
|
|
|
|
describe "with delayed job active", :delay_jobs do
|
|
scenario "should not be present when an equal RemoteTranslation is enqueued" do
|
|
create(:remote_translation, remote_translatable: resource, locale: :es)
|
|
visit path
|
|
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect(page).not_to have_button("Traducir página")
|
|
expect(page).to have_content("En un breve periodo de tiempo refrescando la página podrá ver todo el contenido en su idioma")
|
|
end
|
|
end
|
|
|
|
describe "should ignore missing translations on resource comments" do
|
|
before do
|
|
if show_path?(path_name) || !commentable?(resource)
|
|
skip("only index_path")
|
|
end
|
|
end
|
|
|
|
scenario "is not present when a resource translation exists but its comment has not tanslations" do
|
|
add_translations(resource, :es)
|
|
create(:comment, commentable: resource)
|
|
visit path
|
|
expect(page).not_to have_button("Translate page")
|
|
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect(page).not_to have_button("Traducir página")
|
|
end
|
|
end
|
|
|
|
describe "should evaluate missing translations on resource comments" do
|
|
before do
|
|
if index_path?(path_name)
|
|
skip("only show_path")
|
|
end
|
|
end
|
|
|
|
scenario "display when exists resource translations but the comment does not have a translation" do
|
|
add_translations(resource, :es)
|
|
create(:comment, commentable: resource)
|
|
visit path
|
|
expect(page).not_to have_button("Translate page")
|
|
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect(page).to have_button("Traducir página")
|
|
end
|
|
|
|
scenario "not display when exists resource translations but his comment has tanslations" do
|
|
add_translations(resource, :es)
|
|
create_comment_with_translations(resource, :es)
|
|
visit path
|
|
expect(page).not_to have_button("Translate page")
|
|
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect(page).not_to have_button("Traducir página")
|
|
end
|
|
end
|
|
|
|
describe "should evaluate missing translations on featured_debates" do
|
|
before { skip("only debates index path") if path_name != "debates_path" }
|
|
|
|
scenario "display when exists featured_debates without tanslations" do
|
|
add_translations(resource, :es)
|
|
create_featured_debates
|
|
visit path
|
|
expect(page).not_to have_button("Translate page")
|
|
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect(page).to have_button("Traducir página")
|
|
end
|
|
end
|
|
|
|
describe "should evaluate missing translations on featured_proposals" do
|
|
before { skip("only proposals index path") if path_name != "proposals_path" }
|
|
|
|
scenario "display when exists featured_proposals without tanslations" do
|
|
add_translations(resource, :es)
|
|
create_featured_proposals
|
|
visit path
|
|
expect(page).not_to have_button("Translate page")
|
|
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect(page).to have_button("Traducir página")
|
|
end
|
|
end
|
|
end
|
|
|
|
context "After click remote translations button" do
|
|
describe "with delayed jobs", :delay_jobs do
|
|
scenario "the remote translation button should not be present" do
|
|
visit path
|
|
select("Español", from: "locale-switcher")
|
|
|
|
click_button "Traducir página"
|
|
|
|
expect(page).not_to have_button("Traducir página")
|
|
end
|
|
|
|
scenario "the remote translation is pending to translate" do
|
|
visit path
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect { click_button "Traducir página" }.to change { RemoteTranslation.count }.from(0).to(1)
|
|
end
|
|
|
|
scenario "should be present enqueued notice and informative text" do
|
|
visit path
|
|
select("Español", from: "locale-switcher")
|
|
|
|
click_button "Traducir página"
|
|
|
|
expect(page).to have_content("Se han solicitado correctamente las traducciones.")
|
|
expect(page).to have_content("En un breve periodo de tiempo refrescando la página podrá ver todo el contenido en su idioma")
|
|
end
|
|
|
|
scenario "should be present only informative text when user visit page with all content enqueued" do
|
|
visit path
|
|
select("Español", from: "locale-switcher")
|
|
click_button "Traducir página"
|
|
expect(page).to have_content("Se han solicitado correctamente las traducciones.")
|
|
|
|
visit path
|
|
select("Español", from: "locale-switcher")
|
|
|
|
expect(page).not_to have_button "Traducir página"
|
|
expect(page).not_to have_content("Se han solicitado correctamente las traducciones.")
|
|
expect(page).to have_content("En un breve periodo de tiempo refrescando la página podrá ver todo el contenido en su idioma")
|
|
end
|
|
end
|
|
|
|
describe "without delayed jobs" do
|
|
scenario "the remote translation button should not be present" do
|
|
microsoft_translate_client_response = generate_response(resource)
|
|
expect_any_instance_of(RemoteTranslations::Microsoft::Client).to receive(:call).and_return(microsoft_translate_client_response)
|
|
visit path
|
|
select("Español", from: "locale-switcher")
|
|
|
|
click_button "Traducir página"
|
|
|
|
expect(page).not_to have_button("Traducir página")
|
|
end
|
|
|
|
scenario "the remote translation has been translated and destoyed" do
|
|
microsoft_translate_client_response = generate_response(resource)
|
|
expect_any_instance_of(RemoteTranslations::Microsoft::Client).to receive(:call).and_return(microsoft_translate_client_response)
|
|
visit path
|
|
select("Español", from: "locale-switcher")
|
|
|
|
click_button "Traducir página"
|
|
|
|
expect(RemoteTranslation.count).to eq(0)
|
|
expect(resource.translations.count).to eq(2)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def add_translations(resource, locale)
|
|
new_translation = resource.translations.first.dup
|
|
new_translation.update!(locale: locale)
|
|
resource
|
|
end
|
|
|
|
def create_comment_with_translations(resource, locale)
|
|
comment = create(:comment, commentable: resource)
|
|
add_translations(comment, locale)
|
|
end
|
|
|
|
def index_path?(path)
|
|
["debates_path", "proposals_path", "root_path", "budget_investments_path"].include?(path)
|
|
end
|
|
|
|
def show_path?(path)
|
|
!index_path?(path)
|
|
end
|
|
|
|
def commentable?(resource)
|
|
Comment::COMMENTABLE_TYPES.include?(resource.class.to_s)
|
|
end
|
|
|
|
def generate_response(resource)
|
|
field_text = Faker::Lorem.characters(10)
|
|
resource.translated_attribute_names.map { field_text }
|
|
end
|