# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. licenses this file to you under
# the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

require 'bundler/gem_tasks'
require 'json'

task(:default) { system 'rake --tasks' }
task test: 'test:unit'
require 'rake/testtask'
require 'rspec/core/rake_task'

# Test Tasks

namespace :test do
  desc 'Wait for Elasticsearch to be in a green state'
  task :wait_for_green do
    sh '../scripts/wait-cluster.sh'
  end

  desc 'Run unit tests'
  task unit: :spec
  RSpec::Core::RakeTask.new(:spec) do |t|
    t.pattern = 'spec/elasticsearch/api/**/*_spec.rb'
    t.exclude_pattern = 'spec/platinum/**/*_spec.rb'
    t.exclude_pattern += ',spec/elasticsearch/api/perform_request_spec.rb' unless ENV['TEST_WITH_OTEL']
  end

  desc 'Run Rest API Spec tests'
  RSpec::Core::RakeTask.new(:rest_api) do |t|
    test_dir = Rake.application.original_dir
    t.pattern = "#{test_dir}/spec/rest_api/rest_api_yaml_spec.rb"
  end

  desc 'Run unit and integration tests'
  task :all do
    Rake::Task['test:unit'].invoke
    Rake::Task['test:integration'].invoke
  end

  desc 'Run tests with yaml runner'
  task :yaml do
    ruby './spec/yaml-test-runner/run.rb'
  end

  namespace :platinum do
    desc 'Run Platinum Rest API Spec tests'
    RSpec::Core::RakeTask.new(:api) do
      ENV['TEST_SUITE'] = 'platinum'
      Rake::Task['test:rest_api'].invoke
    end

    desc 'Run Platinum Unit tests - DEPRECATED: Will be migrated to RSpec'
    Rake::TestTask.new(:unit) do |test|
      test.libs << 'spec/platinum/unit'
      test.test_files = FileList['spec/platinum/unit/**/*_test.rb']
      test.verbose = false
      test.warning = false
    end

    desc 'Run Platinum Integration Specs'
    RSpec::Core::RakeTask.new(:integration) do |t|
      t.pattern = if ENV['TEST_SUITE'] == 'platinum'
                    'spec/platinum/integration/**/*_spec.rb'
                  else
                    'spec/free/integration/**/*_spec.rb'
                  end
      t.ruby_opts = '-W0'
    end
  end
end

# Documentation tasks

require 'yard'
YARD::Rake::YardocTask.new(:doc) do |t|
  t.options = %w| --embed-mixins --markup=markdown |
end

# Code analysis tasks

require 'cane/rake_task'
Cane::RakeTask.new(:quality) do |cane|
  cane.abc_max = 15
  cane.no_style = true
end
