diff --git a/.github/actions/coverage-tests/action.yml b/.github/actions/coverage-tests/action.yml new file mode 100644 index 0000000000..bf8e67d4fc --- /dev/null +++ b/.github/actions/coverage-tests/action.yml @@ -0,0 +1,76 @@ +name: Coverage tests +description: runs code coverage tests + + +inputs: + docker-image: + required: true + type: string + image-tag: + required: true + type: string + use-next-academic-year: + required: true + type: boolean + azure-credentials: + required: true + type: string + slack-webhook: + required: true + type: string + codecov-token: + required: true + type: string + +runs: + using: composite + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Bring docker image up + uses: ./.github/actions/bring-docker-image-up/ + with: + azure-credentials: ${{ inputs.azure-credentials }} + docker-image: ${{ inputs.docker-image}} + image-tag: ${{ inputs.image-tag }} + + - name: Setup tests dependencies on images + shell: bash + run: | + docker compose exec -T web /bin/sh -c 'bundle config --local disable_exec_load true' + docker compose exec -T web /bin/sh -c 'bundle exec rake parallel:setup' + docker compose exec -T web /bin/sh -c "yarn add jest@29.3.1" + docker compose exec -T web /bin/sh -c "RAILS_ENV=test bundle exec rails assets:precompile" + docker compose exec -T web /bin/sh -c 'apk add chromium chromium-chromedriver' + + - name: "${{ inputs.use-next-academic-year && 'Next academic year' || 'Current academic year' }} coverage tests" + shell: bash + run: | + docker compose exec -T web /bin/sh -c 'COVERAGE=true bundle exec --verbose rspec --pattern "spec/**/*_spec.rb" --exclude-pattern "spec/smoke/*_spec.rb"' + env: + USE_NEXT_ACADEMIC_YEAR: ${{ inputs.use-next-academic-year }} + + - name: Flaky flush + shell: bash + run: | + docker compose exec -T web /bin/sh -c 'for i in {1..100} do bundle exec --verbose rspec ./spec/features/end_to_end/provider_led_undergrad_journey_spec.rb:10 end' + env: + USE_NEXT_ACADEMIC_YEAR: ${{ inputs.use-next-academic-year }} + + # - name: Check for Failure + # uses: ./.github/actions/send-slack-notification/ + # if: ${{ failure() && github.ref == 'refs/heads/main' }} + # with: + # slack-title: "${{ inputs.use-next-academic-year && 'Next academic year' || 'Current academic year' }} tests" + # slack-message: "':alert: ${{ inputs.use-next-academic-year && 'Next academic year' || 'Current academic year'}} coverage test failure on commit ${{env.IMAGE_TAG}} :sadpanda:" + # slack-webhook: ${{ inputs.slack-webhook }} + + # - name: Upload coverage to Codecov + # uses: codecov/codecov-action@v3 + # with: + # files: ./coverage/backend/coverage.json + # token: ${{ inputs.codecov-token }} + # flags: unittests + # name: codecov-umbrella + # fail_ci_if_error: false diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index 3b7f19e124..d411dbf837 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -4,6 +4,8 @@ on: workflow_dispatch: schedule: - cron: "0 23 * * *" + pull_request: + types: [opened, reopened, synchronize, labeled] permissions: contents: write @@ -35,12 +37,21 @@ jobs: slack-webhook: ${{ secrets.SLACK_WEBHOOK }} azure-credentials: ${{ secrets.AZURE_CREDENTIALS_REVIEW }} - test: + coverage_tests: name: Coverage tests needs: [build] - uses: ./.github/workflows/coverage-tests.yml - secrets: inherit - with: - docker-image: ${{needs.build.outputs.docker-image}} - image-tag: ${{ needs.build.outputs.image-tag }} - use-next-academic-year: false + + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Coverage Tests + uses: ./.github/actions/coverage-tests/ + with: + docker-image: ${{needs.build.outputs.docker-image}} + image-tag: ${{ needs.build.outputs.image-tag }} + use-next-academic-year: false + slack-webhook: ${{ secrets.SLACK_WEBHOOK }} + azure-credentials: ${{ secrets.AZURE_CREDENTIALS_REVIEW }} + codecov-token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/coverage-tests.yml b/.github/workflows/coverage-tests.yml deleted file mode 100644 index ef651f2027..0000000000 --- a/.github/workflows/coverage-tests.yml +++ /dev/null @@ -1,64 +0,0 @@ -name: Coverage tests - -on: - workflow_call: - inputs: - docker-image: - required: true - type: string - image-tag: - required: true - type: string - use-next-academic-year: - required: true - type: boolean - -jobs: - test: - runs-on: ubuntu-latest - - strategy: - fail-fast: true - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Bring docker image up - uses: ./.github/actions/bring-docker-image-up/ - with: - azure-credentials: ${{ secrets.AZURE_CREDENTIALS_REVIEW }} - docker-image: ${{ inputs.docker-image}} - image-tag: ${{ inputs.image-tag }} - - - name: Setup tests dependencies on images - shell: bash - run: | - docker compose exec -T web /bin/sh -c 'bundle config --local disable_exec_load true' - docker compose exec -T web /bin/sh -c 'bundle exec rake parallel:setup' - docker compose exec -T web /bin/sh -c "yarn add jest@29.3.1" - docker compose exec -T web /bin/sh -c "RAILS_ENV=test bundle exec rails assets:precompile" - docker compose exec -T web /bin/sh -c 'apk add chromium chromium-chromedriver' - - - name: "${{ inputs.use-next-academic-year && 'Next academic year' || 'Current academic year' }} ${{ matrix.test-type }} tests" - run: | - docker compose exec -T web /bin/sh -c 'COVERAGE=true bundle exec --verbose rspec --pattern spec/**/*_spec.rb --exclude-pattern spec/smoke/*_spec.rb' - env: - USE_NEXT_ACADEMIC_YEAR: ${{ inputs.use-next-academic-year }} - - - name: Check for Failure - uses: ./.github/actions/send-slack-notification/ - if: ${{ failure() && github.ref == 'refs/heads/main' }} - with: - slack-title: "${{ inputs.use-next-academic-year && 'Next academic year' || 'Current academic year' }} tests" - slack-message: "':alert: ${{ inputs.use-next-academic-year && 'Next academic year' || 'Current academic year'}} ${{ matrix.test-type }} test failure for ${{ matrix.tests_type }} on commit ${{env.IMAGE_TAG}} :sadpanda:" - slack-webhook: ${{ secrets.SLACK_WEBHOOK }} - - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 - with: - files: ./coverage/backend/coverage.json - token: ${{ secrets.CODECOV_TOKEN }} - flags: unittests - name: codecov-umbrella - fail_ci_if_error: false diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 20bc3791cb..a5985f9d35 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -35,27 +35,27 @@ jobs: ] include: - test-type: unit_models - include-pattern: spec/models/*_spec.rb + include-pattern: spec/models/**/*_spec.rb - test-type: unit_services - include-pattern: spec/services/*_spec.rb + include-pattern: spec/services/**/*_spec.rb - test-type: unit_forms - include-pattern: spec/forms/*_spec.rb + include-pattern: spec/forms/**/*_spec.rb - test-type: unit_components - include-pattern: spec/components/*_spec.rb + include-pattern: spec/components/**/*_spec.rb - test-type: unit_other - include-pattern: spec/*_spec.rb - exclude-pattern: spec/(features|smoke|models|services|forms|components)/*_spec.rb + include-pattern: spec/**/*_spec.rb + exclude-pattern: spec/{features,smoke,models,services,forms,components}/**/*_spec.rb - test-type: integration_end_to_end - include-pattern: spec/features/end_to_end/*_spec.rb + include-pattern: spec/features/end_to_end/**/*_spec.rb - test-type: integration_form_sections - include-pattern: spec/features/form_sections/*_spec.rb + include-pattern: spec/features/form_sections/**/*_spec.rb - test-type: integration_system_admin - include-pattern: spec/features/system_admin/*_spec.rb + include-pattern: spec/features/system_admin/**/*_spec.rb - test-type: integration_trainee_actions - include-pattern: spec/features/trainee_actions/*_spec.rb + include-pattern: spec/features/trainee_actions/**/*_spec.rb - test-type: integration_other - include-pattern: spec/features/*_spec.rb - exclude-pattern: spec/features/(end_to_end|form_sections|system_admin|trainee_actions)/*_spec.rb + include-pattern: spec/features/**/*_spec.rb + exclude-pattern: spec/features/{end_to_end,form_sections,system_admin,trainee_actions}/**/*_spec.rb steps: - name: Checkout @@ -79,8 +79,9 @@ jobs: - name: "${{ inputs.use-next-academic-year && 'Next academic year' || 'Current academic year' }} ${{ matrix.test-type }} tests" uses: Wandalen/wretry.action@v3.5.0 + timeout-minutes: 15 with: - attempt_limit: 5 + attempt_limit: 3 command: | docker compose exec -T web /bin/sh -c 'USE_NEXT_ACADEMIC_YEAR=${{env.USE_NEXT_ACADEMIC_YEAR}} bundle exec --verbose rspec --pattern "${{ env.INCLUDE_PATTERN }}" --exclude-pattern "${{ env.EXCLUDE_PATTERN }}"' env: diff --git a/app/services/lead_partner_search.rb b/app/services/lead_partner_search.rb index 39e85c1235..7e5c70041d 100644 --- a/app/services/lead_partner_search.rb +++ b/app/services/lead_partner_search.rb @@ -30,11 +30,12 @@ def all_lead_partners if query lead_partners = lead_partners .includes(:provider, :school) - .joins(:school) .where("lead_partners.name ilike ?", "%#{query}%") - .or(School.where("postcode ilike ?", "%#{query}%")) .or(LeadPartner.kept.where("lead_partners.urn ilike ?", "%#{query}%")) .or(LeadPartner.kept.where("lead_partners.ukprn ilike ?", "%#{query}%")) + .or(LeadPartner.kept.where(id: + LeadPartner.kept.joins(:school).where(school: School.where("postcode ilike ?", "%#{query}%")).select(:id))) + end lead_partners.reorder(:name) end diff --git a/spec/fixtures/files/hpitt_degree_import.csv b/spec/fixtures/files/hpitt_degree_import.csv deleted file mode 100644 index 0cc615d457..0000000000 --- a/spec/fixtures/files/hpitt_degree_import.csv +++ /dev/null @@ -1,2 +0,0 @@ -Provider trainee ID ,Region,First names,Middle names,Last names,Date of birth,Sex,Nationality,UK address: Line 1,UK address: Line 2,UK address: town or city,UK Address 1: Postcode,Outside UK address,Email,Ethnicity,Disabilities,Course level,Course education phase,Course age range,Course ITT subject 1,Course ITT subject 2,Course ITT Subject 3,Course study mode,Course ITT start date,Course Expected End Date,Trainee start date,Employing school URN ,Degree: country,Degree: subjects,Degree: UK degree types,Degree: UK awarding institution,Degree: UK grade,Degree: Non-UK degree types,Degree: graduation year -A2,London,Adam,,Test,21/09/1997,Male,british,99 Lovely Road,,Oxford,OX41RG,,adam.test@gmail.com,"White - English, Scottish, Welsh, Northern Irish or British",Not provided,,Secondary,11 to 16,Mathematics,,,full-time,2022-09-09,31/07/2023,09/09/2022,131609,United Kingdom,"Philosophy, Politics, Economics",Bachelor of Arts,University of Oxford,Upper second-class honours (2:1),,2018 diff --git a/spec/services/degrees/create_from_csv_row_spec.rb b/spec/services/degrees/create_from_csv_row_spec.rb index c33e84d511..de93aab6c5 100644 --- a/spec/services/degrees/create_from_csv_row_spec.rb +++ b/spec/services/degrees/create_from_csv_row_spec.rb @@ -9,12 +9,40 @@ module Degrees let(:trainee) { create(:trainee) } let(:degree) { trainee.degrees.first } let(:csv_row) do - CSV.read( - file_fixture("hpitt_degree_import.csv").to_path, - headers: true, - encoding: "ISO-8859-1", - header_converters: ->(f) { f&.strip }, - ).first + { "Provider trainee ID" => "A2", + "Region" => "London", + "First names" => "Adam", + "Middle names" => nil, + "Last names" => "Test", + "Date of birth" => "21/09/1997", + "Sex" => "Male", + "Nationality" => "british", + "UK address: Line 1" => "99 Lovely Road", + "UK address: Line 2" => nil, + "UK address: town or city" => "Oxford", + "UK Address 1: Postcode" => "OX41RG", + "Outside UK address" => nil, + "Email" => "adam.test@gmail.com", + "Ethnicity" => "White - English, Scottish, Welsh, Northern Irish or British", + "Disabilities" => "Not provided", + "Course level" => nil, + "Course education phase" => "Secondary", + "Course age range" => "11 to 16", + "Course ITT subject 1" => "Mathematics", + "Course ITT subject 2" => nil, + "Course ITT Subject 3" => nil, + "Course study mode" => "full-time", + "Course ITT start date" => "2022-09-09", + "Course Expected End Date" => "31/07/2023", + "Trainee start date" => "09/09/2022", + "Employing school URN" => "131609", + "Degree: country" => "United Kingdom", + "Degree: subjects" => "Philosophy, Politics, Economics", + "Degree: UK degree types" => "Bachelor of Arts", + "Degree: UK awarding institution" => "University of Oxford", + "Degree: UK grade" => "Upper second-class honours (2:1)", + "Degree: Non-UK degree types" => nil, + "Degree: graduation year" => "2018" } end describe "#call" do