From 2dca7d8a8ee2d4f5fbb37ebf037a1f84097ae082 Mon Sep 17 00:00:00 2001 From: Alex Turchyn Date: Tue, 13 May 2025 21:27:40 +0300 Subject: [PATCH] add builder 'replace' button specs --- spec/rails_helper.rb | 2 ++ spec/request_helper.rb | 37 ++++++++++++++++++++++++++++ spec/system/template_builder_spec.rb | 34 +++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 spec/request_helper.rb create mode 100644 spec/system/template_builder_spec.rb diff --git a/spec/rails_helper.rb b/spec/rails_helper.rb index db91da56..dab44cb6 100644 --- a/spec/rails_helper.rb +++ b/spec/rails_helper.rb @@ -11,6 +11,7 @@ require 'capybara/rspec' require 'webmock/rspec' require 'sidekiq/testing' require 'signing_form_helper' +require 'request_helper' Sidekiq::Testing.fake! @@ -54,6 +55,7 @@ RSpec.configure do |config| config.include FactoryBot::Syntax::Methods config.include Devise::Test::IntegrationHelpers config.include SigningFormHelper + config.include RequestHelper config.before(:each, type: :system) do if ENV['HEADLESS'] == 'false' diff --git a/spec/request_helper.rb b/spec/request_helper.rb new file mode 100644 index 00000000..7240c076 --- /dev/null +++ b/spec/request_helper.rb @@ -0,0 +1,37 @@ +# frozen_string_literal: true + +module RequestHelper + module_function + + def wait_for_fetch + page.execute_script( + <<~JS + if (!window.fetchInitialized) { + window.pendingFetchCount = 0; + + const originalFetch = window.fetch; + + window.fetch = function(...args) { + window.pendingFetchCount++; + + return originalFetch.apply(this, args).finally(() => { + window.pendingFetchCount--; + }); + }; + + window.fetchInitialized = true; + } + JS + ) + + yield + + Timeout.timeout(Capybara.default_max_wait_time) do + loop do + break if page.evaluate_script('window.pendingFetchCount') == 0 + + sleep 0.1 + end + end + end +end diff --git a/spec/system/template_builder_spec.rb b/spec/system/template_builder_spec.rb new file mode 100644 index 00000000..f150bea9 --- /dev/null +++ b/spec/system/template_builder_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'rails_helper' + +RSpec.describe 'Template Builder' do + let(:account) { create(:account) } + let(:author) { create(:user, account:) } + let(:template) { create(:template, account:, author:, attachment_count: 3, except_field_types: %w[phone payment]) } + + before do + sign_in(author) + end + + context 'when manage template documents' do + before do + visit edit_template_path(template) + end + + it 'replaces the document' do + doc = find("div[id='documents_container'] div[data-document-uuid='#{template.schema[1]['attachment_uuid']}'") + doc.click + + expect do + wait_for_fetch do + doc.find('.replace-document-button').click + doc.find('.replace-document-button input[type="file"]', visible: false) + .attach_file(Rails.root.join('spec/fixtures/sample-image.png')) + end + end.to change { template.documents.count }.by(1) + + expect(template.reload['schema'][1]['name']).to eq('sample-image') + end + end +end