# Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/

require 'rails_helper'

RSpec.describe 'QUnit', time_zone: 'Europe/London', type: :system do

  matcher :pass_qunit_test do
    match do
      actual.has_css?('.total', wait: 120)

      actual.has_css? '.result .failed', text: '0', wait: 0
    end

    failure_message do
      messages = actual
        .all('.qunit-assert-list li.fail')
        .map { |elem| "> #{failure_name(elem)}\n#{failure_source(elem)}" }
        .join("\n")

      "Failed #{failed_count} out of #{total_count}:\n#{messages}"
    end

    def failure_source(row)
      row
        .find('.test-source pre')
        .text
        .strip
        .lines[0, 2]
        .reject { |line| line.include? 'qunit-' }
        .join
    end

    def failure_name(row)
      row
        .find('.test-message')
        .text
        .strip
    end

    def failed_count
      actual.find('.result .failed').text
    end

    def total_count
      actual.find('.result .total').text
    end
  end

  files = if (basename = ENV['QUNIT_TEST'])
            [basename]
          else
            Pathname
              .glob('public/assets/tests/qunit/*.js')
              .map { |elem| elem.basename(elem.extname).to_s }
              .sort
          end

  files.each do |elem|
    context "when testing #{elem.humanize}", authenticated_as: :user do
      # Some tests require an authenticated session.
      let(:needs_user) { elem.include?('form') || elem.include?('taskbar') }
      let(:user)       { needs_user ? create(:agent) : false }

      it "#{elem.humanize} qunit tests" do
        visit "/tests_#{elem}"
        expect(page).to pass_qunit_test
      end
    end
  end
end