<commit_before>require 'spec_helper'

describe "Admin Runners" do
  include StubENV
  include FilteredSearchHelpers
  include SortingHelper

  before do
    stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
    sign_in(create(:admin))
  end

  describe "Runners page" do
    let(:pipeline) { create(:ci_pipeline) }

    context "when there are runners" do
      it 'has all necessary texts' do
        runner = FactoryBot.create(:ci_runner, contacted_at: Time.now)
        FactoryBot.create(:ci_build, pipeline: pipeline, runner_id: runner.id)
        visit admin_runners_path

        expect(page).to have_text "Setup a shared Runner manually"
        expect(page).to have_text "Runners currently online: 1"
      end

      describe 'search', :js do
        before do
          FactoryBot.create :ci_runner, description: 'runner-foo'
          FactoryBot.create :ci_runner, description: 'runner-bar'

          visit admin_runners_path
        end

        it 'shows correct runner when description matches' do
          input_filtered_search_keys('runner-foo')

          expect(page).to have_content("runner-foo")
          expect(page).not_to have_content("runner-bar")
        end

        it 'shows no runner when description does not match' do
          input_filtered_search_keys('runner-baz')

          expect(page).to have_text 'No runners found'
        end
      end

      describe 'filter by status', :js do
        it 'shows correct runner when status matches' do
          FactoryBot.create :ci_runner, description: 'runner-active', active: true
          FactoryBot.create :ci_runner, description: 'runner-paused', active: false

          visit admin_runners_path

          expect(page).to have_content 'runner-active'
          expect(page).to have_content 'runner-paused'

          input_filtered_search_keys('status:active')
          expect(page).to have_content 'runner-active'
          expect(page).not_to have_content 'runner-paused'
        end

        it 'shows no runner when status does not match' do
          FactoryBot.create :ci_runner, :online, description: 'runner-active', active: true
          FactoryBot.create :ci_runner, :online, description: 'runner-paused', active: false

          visit admin_runners_path

          input_filtered_search_keys('status:offline')

          expect(page).not_to have_content 'runner-active'
          expect(page).not_to have_content 'runner-paused'

          expect(page).to have_text 'No runners found'
        end
      end

      it 'shows correct runner when status is selected and search term is entered', :js do
        FactoryBot.create :ci_runner, description: 'runner-a-1', active: true
        FactoryBot.create :ci_runner, description: 'runner-a-2', active: false
        FactoryBot.create :ci_runner, description: 'runner-b-1', active: true

        visit admin_runners_path

        input_filtered_search_keys('status:active')
        expect(page).to have_content 'runner-a-1'
        expect(page).to have_content 'runner-b-1'
        expect(page).not_to have_content 'runner-a-2'

        input_filtered_search_keys('status:active runner-a')
        expect(page).to have_content 'runner-a-1'
        expect(page).not_to have_content 'runner-b-1'
        expect(page).not_to have_content 'runner-a-2'
      end

      it 'sorts by last contact date', :js do
        FactoryBot.create :ci_runner, description: 'runner-1', created_at: '2018-07-12 15:37', contacted_at: '2018-07-12 15:37'
        FactoryBot.create :ci_runner, description: 'runner-2', created_at: '2018-07-12 16:37', contacted_at: '2018-07-12 16:37'

        visit admin_runners_path

        within '.runners-content .gl-responsive-table-row:nth-child(2)' do
          expect(page).to have_content 'runner-2'
        end

        within '.runners-content .gl-responsive-table-row:nth-child(3)' do
          expect(page).to have_content 'runner-1'
        end

        sorting_by 'Last Contact'

        within '.runners-content .gl-responsive-table-row:nth-child(2)' do
          expect(page).to have_content 'runner-1'
        end

        within '.runners-content .gl-responsive-table-row:nth-child(3)' do
          expect(page).to have_content 'runner-2'
        end
      end
    end

    context "when there are no runners" do
      before do
        visit admin_runners_path
      end

      it 'has all necessary texts including no runner message' do
        expect(page).to have_text "Setup a shared Runner manually"
        expect(page).to have_text "Runners currently online: 0"
        expect(page).to have_text 'No runners found'
      end
    end

    context 'group runner' do
      let(:group) { create(:group) }
      let!(:runner) { create(:ci_runner, :group, groups: [group]) }

      it 'shows the label and does not show the project count' do
        visit admin_runners_path

        within "#runner_#{runner.id}" do
          expect(page).to have_selector '.badge', text: 'group'
          expect(page).to have_text 'n/a'
        end
      end
    end

    context 'shared runner' do
      it 'shows the label and does not show the project count' do
        runner = create :ci_runner, :instance

        visit admin_runners_path

        within "#runner_#{runner.id}" do
          expect(page).to have_selector '.badge', text: 'shared'
          expect(page).to have_text 'n/a'
        end
      end
    end

    context 'specific runner' do
      it 'shows the label and the project count' do
        project = create :project
        runner = create :ci_runner, :project, projects: [project]

        visit admin_runners_path

        within "#runner_#{runner.id}" do
          expect(page).to have_selector '.badge', text: 'specific'
          expect(page).to have_text '1'
        end
      end
    end
  end

  describe "Runner show page" do
    let(:runner) { FactoryBot.create :ci_runner }

    before do
      @project1 = FactoryBot.create(:project)
      @project2 = FactoryBot.create(:project)
      visit admin_runner_path(runner)
    end

    describe 'runner info' do
      it { expect(find_field('runner_token').value).to eq runner.token }
    end
<commit_msg>unify the usage of factorybot's 'create'<commit_after>require 'spec_helper'

describe "Admin Runners" do
  include StubENV
  include FilteredSearchHelpers
  include SortingHelper

  before do
    stub_env('IN_MEMORY_APPLICATION_SETTINGS', 'false')
    sign_in(create(:admin))
  end

  describe "Runners page" do
    let(:pipeline) { create(:ci_pipeline) }

    context "when there are runners" do
      it 'has all necessary texts' do
        runner = create(:ci_runner, contacted_at: Time.now)
        create(:ci_build, pipeline: pipeline, runner_id: runner.id)
        visit admin_runners_path

        expect(page).to have_text "Setup a shared Runner manually"
        expect(page).to have_text "Runners currently online: 1"
      end

      describe 'search', :js do
        before do
          create(:ci_runner, description: 'runner-foo')
          create(:ci_runner, description: 'runner-bar')

          visit admin_runners_path
        end

        it 'shows correct runner when description matches' do
          input_filtered_search_keys('runner-foo')

          expect(page).to have_content("runner-foo")
          expect(page).not_to have_content("runner-bar")
        end

        it 'shows no runner when description does not match' do
          input_filtered_search_keys('runner-baz')

          expect(page).to have_text 'No runners found'
        end
      end

      describe 'filter by status', :js do
        it 'shows correct runner when status matches' do
          create(:ci_runner, description: 'runner-active', active: true)
          create(:ci_runner, description: 'runner-paused', active: false)

          visit admin_runners_path

          expect(page).to have_content 'runner-active'
          expect(page).to have_content 'runner-paused'

          input_filtered_search_keys('status:active')
          expect(page).to have_content 'runner-active'
          expect(page).not_to have_content 'runner-paused'
        end

        it 'shows no runner when status does not match' do
          create(:ci_runner, :online, description: 'runner-active', active: true)
          create(:ci_runner, :online, description: 'runner-paused', active: false)

          visit admin_runners_path

          input_filtered_search_keys('status:offline')

          expect(page).not_to have_content 'runner-active'
          expect(page).not_to have_content 'runner-paused'

          expect(page).to have_text 'No runners found'
        end
      end

      it 'shows correct runner when status is selected and search term is entered', :js do
        create(:ci_runner, description: 'runner-a-1', active: true)
        create(:ci_runner, description: 'runner-a-2', active: false)
        create(:ci_runner, description: 'runner-b-1', active: true)

        visit admin_runners_path

        input_filtered_search_keys('status:active')
        expect(page).to have_content 'runner-a-1'
        expect(page).to have_content 'runner-b-1'
        expect(page).not_to have_content 'runner-a-2'

        input_filtered_search_keys('status:active runner-a')
        expect(page).to have_content 'runner-a-1'
        expect(page).not_to have_content 'runner-b-1'
        expect(page).not_to have_content 'runner-a-2'
      end

      it 'sorts by last contact date', :js do
        create(:ci_runner, description: 'runner-1', created_at: '2018-07-12 15:37', contacted_at: '2018-07-12 15:37')
        create(:ci_runner, description: 'runner-2', created_at: '2018-07-12 16:37', contacted_at: '2018-07-12 16:37')

        visit admin_runners_path

        within '.runners-content .gl-responsive-table-row:nth-child(2)' do
          expect(page).to have_content 'runner-2'
        end

        within '.runners-content .gl-responsive-table-row:nth-child(3)' do
          expect(page).to have_content 'runner-1'
        end

        sorting_by 'Last Contact'

        within '.runners-content .gl-responsive-table-row:nth-child(2)' do
          expect(page).to have_content 'runner-1'
        end

        within '.runners-content .gl-responsive-table-row:nth-child(3)' do
          expect(page).to have_content 'runner-2'
        end
      end
    end

    context "when there are no runners" do
      before do
        visit admin_runners_path
      end

      it 'has all necessary texts including no runner message' do
        expect(page).to have_text "Setup a shared Runner manually"
        expect(page).to have_text "Runners currently online: 0"
        expect(page).to have_text 'No runners found'
      end
    end

    context 'group runner' do
      let(:group) { create(:group) }
      let!(:runner) { create(:ci_runner, :group, groups: [group]) }

      it 'shows the label and does not show the project count' do
        visit admin_runners_path

        within "#runner_#{runner.id}" do
          expect(page).to have_selector '.badge', text: 'group'
          expect(page).to have_text 'n/a'
        end
      end
    end

    context 'shared runner' do
      it 'shows the label and does not show the project count' do
        runner = create(:ci_runner, :instance)

        visit admin_runners_path

        within "#runner_#{runner.id}" do
          expect(page).to have_selector '.badge', text: 'shared'
          expect(page).to have_text 'n/a'
        end
      end
    end

    context 'specific runner' do
      it 'shows the label and the project count' do
        project = create(:project)
        runner = create(:ci_runner, :project, projects: [project])

        visit admin_runners_path

        within "#runner_#{runner.id}" do
          expect(page).to have_selector '.badge', text: 'specific'
          expect(page).to have_text '1'
        end
      end
    end
  end

  describe "Runner show page" do
    let(:runner) { create(:ci_runner) }

    before do
      @project1 = create(:project)
      @project2 = create(:project)
      visit admin_runner_path(runner)
    end

    describe 'runner info' do
      it { expect(find_field('runner_token').value).to eq runner.token }
    end

{'fraction_non_alphanumeric': 0.09870364292746964, 'fraction_numerical': 0.0118148999015425, 'mean_word_length': 2.590279823269514, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6259206', 'n_tokens_mistral': 3718, 'n_tokens_neox': 3528, 'n_words': 986}