From 51a5f497e714ddc67059cae0e522f63e9d2c27c8 Mon Sep 17 00:00:00 2001 From: NVMakarenko Date: Sun, 1 Dec 2024 21:33:08 +0200 Subject: [PATCH] add ConvertJsonToCsv service --- .github/workflows/cd.yml | 18 -------- .github/workflows/scan_unlighthouse.yml | 39 +++++++++++++++++ app/lib/convert_json_to_csv.rb | 11 ----- app/services/convert_json_to_csv_service.rb | 19 +++++++++ spec/fixtures/files/output.csv | 3 ++ spec/lib/convert_json_to_csv_spec.rb | 26 ------------ .../convert_json_to_csv_service_spec.rb | 42 +++++++++++++++++++ 7 files changed, 103 insertions(+), 55 deletions(-) create mode 100644 .github/workflows/scan_unlighthouse.yml delete mode 100644 app/lib/convert_json_to_csv.rb create mode 100644 app/services/convert_json_to_csv_service.rb create mode 100644 spec/fixtures/files/output.csv delete mode 100644 spec/lib/convert_json_to_csv_spec.rb create mode 100644 spec/services/convert_json_to_csv_service_spec.rb diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 9b6c65de2..3a56760af 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -31,30 +31,12 @@ jobs: ruby-version: 3.3.5 bundler-cache: true - - name: Set up Unlighthouse Scan - run: npm install -g @unlighthouse/cli puppeteer - - uses: miloserdow/capistrano-deploy@v3 with: target: staging deploy_key: ${{ secrets.STAGING_KEY_PASSWORD }} enc_rsa_key_pth: config/credentials/staging_deploy_id_ed25519_enc - - name: Unlighthouse Assertions and Client - run: unlighthouse-ci --site http://51.44.25.104/en --build-static --output-path .unlighthouse/dist - - - name: Make convert_json_to_csv executable - run: chmod +x bin/convert_json_to_csv.rb - - - name: Convert JSON to CSV - run: bin/convert_json_to_csv.rb .unlighthouse/dist/ci-result.json .unlighthouse/dist/ci-result.csv - - - name: Upload Unlighthouse Report - uses: actions/upload-artifact@v4 - with: - name: unlighthouse-report - path: .unlighthouse/dist/** - deploy-to-production: runs-on: ubuntu-latest if: github.event_name == 'release' && github.event.action == 'published' diff --git a/.github/workflows/scan_unlighthouse.yml b/.github/workflows/scan_unlighthouse.yml new file mode 100644 index 000000000..963df8e4c --- /dev/null +++ b/.github/workflows/scan_unlighthouse.yml @@ -0,0 +1,39 @@ +name: Unlighthouse reports + +on: + workflow_dispatch: + +jobs: + generate-unlighthouse-report: + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' && github.event.action == 'closed' && github.event.pull_request.merged == true + steps: + - uses: actions/checkout@v2 + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: 3.3.5 + bundler-cache: true + + - name: Set up Unlighthouse Scan + run: npm install -g @unlighthouse/cli puppeteer + + - name: Unlighthouse Assertions and Client + run: unlighthouse-ci --site http://51.44.25.104/en --build-static --output-path .unlighthouse/dist + + - name: Convert JSON to CSV + run: | + ruby -e "require './lib/convert_json_to_csv_service'; ConvertJsonToCsvService.call('.unlighthouse/dist/ci-result.json', '.unlighthouse/dist/ci-result.csv')" + + - name: Upload Unlighthouse Report + uses: actions/upload-artifact@v4 + with: + name: unlighthouse-report + path: .unlighthouse/dist/** + + - name: Upload СCSV Report + uses: actions/upload-artifact@v4 + with: + name: csv-report + path: .unlighthouse/dist/ci-result.csv diff --git a/app/lib/convert_json_to_csv.rb b/app/lib/convert_json_to_csv.rb deleted file mode 100644 index 56cd32340..000000000 --- a/app/lib/convert_json_to_csv.rb +++ /dev/null @@ -1,11 +0,0 @@ -require "json" -require "csv" - -class ConvertJsonToCsv - def self.perform(input_file, output_file) - json_data = JSON.parse(File.read(input_file)) - CSV.open(output_file, "w", write_headers: true, headers: json_data.first.keys) do |csv| - json_data.each { |row| csv << row.values } - end - end -end diff --git a/app/services/convert_json_to_csv_service.rb b/app/services/convert_json_to_csv_service.rb new file mode 100644 index 000000000..50fdd2d3c --- /dev/null +++ b/app/services/convert_json_to_csv_service.rb @@ -0,0 +1,19 @@ +class ConvertJsonToCsvService + def self.call(input_file, output_file) + new(input_file, output_file).call + end + + def initialize(input_file, output_file) + @input_file = input_file + @output_file = output_file + end + + def call + json_data = JSON.parse(File.read(@input_file)) + + CSV.open(@output_file, "w", write_headers: true, headers: json_data.first.keys) do |csv| + json_data.each { |row| csv << row.values } + end + @output_file + end +end diff --git a/spec/fixtures/files/output.csv b/spec/fixtures/files/output.csv new file mode 100644 index 000000000..a51461ff4 --- /dev/null +++ b/spec/fixtures/files/output.csv @@ -0,0 +1,3 @@ +path,score,performance,accessibility,best-practices,seo +/en,0.78,0.64,0.86,0.79,0.83 +/en/about-us,0.78,0.63,0.77,0.79,0.92 diff --git a/spec/lib/convert_json_to_csv_spec.rb b/spec/lib/convert_json_to_csv_spec.rb deleted file mode 100644 index 9e98a9420..000000000 --- a/spec/lib/convert_json_to_csv_spec.rb +++ /dev/null @@ -1,26 +0,0 @@ -require "rails_helper" - -RSpec.describe ConvertJsonToCsv do - let(:input_file) { "spec/fixtures/files/unlighthouse_report.json" } - let(:output_file) { "spec/fixtures/files/output.csv" } - - after do - File.delete(output_file) if File.exist?(output_file) - end - - describe ".perform" do - it "converts JSON to CSV" do - ConvertJsonToCsv.perform(input_file, output_file) - csv_content = CSV.read(output_file, headers: true) - - expect(csv_content.headers).to eq(["path", "score", "performance", "accessibility", "best-practices", "seo"]) - - expect(csv_content[0]["path"]).to eq("/en") - expect(csv_content[0]["score"]).to eq("0.78") - expect(csv_content[0]["performance"]).to eq("0.64") - expect(csv_content[0]["accessibility"]).to eq("0.86") - expect(csv_content[0]["best-practices"]).to eq("0.79") - expect(csv_content[0]["seo"]).to eq("0.83") - end - end -end diff --git a/spec/services/convert_json_to_csv_service_spec.rb b/spec/services/convert_json_to_csv_service_spec.rb new file mode 100644 index 000000000..6e2cae856 --- /dev/null +++ b/spec/services/convert_json_to_csv_service_spec.rb @@ -0,0 +1,42 @@ +require "rails_helper" + +RSpec.describe ConvertJsonToCsvService do + let(:input_file) { "spec/fixtures/files/unlighthouse_report.json" } + let(:output_file) { "spec/fixtures/files/output.csv" } + let(:csv_content) { CSV.read(output_file, headers: true) } + + describe ".call" do + context "when initializing and calling an instance" do + let(:service_instance) { instance_double(ConvertJsonToCsvService) } + + before do + allow(ConvertJsonToCsvService).to receive(:new).with(input_file, output_file).and_return(service_instance) + allow(service_instance).to receive(:call).and_return(output_file) + end + + it "initializes and calls the instance with the provided arguments" do + result = ConvertJsonToCsvService.call(input_file, output_file) + + expect(ConvertJsonToCsvService).to have_received(:new).with(input_file, output_file) + expect(service_instance).to have_received(:call) + expect(result).to eq(output_file) + end + end + + context "when creating a CSV file" do + it "creates a csv file with correct data" do + result = ConvertJsonToCsvService.call(input_file, output_file) + + expect(result).to eq(output_file) + expect(File.exist?(output_file)).to be_truthy + expect(csv_content.headers).to eq(["path", "score", "performance", "accessibility", "best-practices", "seo"]) + expect(csv_content[0]["path"]).to eq("/en") + expect(csv_content[0]["score"]).to eq("0.78") + expect(csv_content[0]["performance"]).to eq("0.64") + expect(csv_content[0]["accessibility"]).to eq("0.86") + expect(csv_content[0]["best-practices"]).to eq("0.79") + expect(csv_content[0]["seo"]).to eq("0.83") + end + end + end +end