# frozen_string_literal: true

require 'test_helper'

class AuthProvidersTest < ActionDispatch::IntegrationTest
  def setup
    @admin = User.find_by(username: 'admin')
    login_as(@admin, scope: :user)
  end

  test 'create an auth external provider and activate it' do
    name = 'GitHub'
    post '/api/auth_providers',
         params: {
           auth_provider: {
             name: name,
             providable_type: 'OAuth2Provider',
             providable_attributes: {
               authorization_endpoint: 'authorize',
               token_endpoint: 'access_token',
               base_url: 'https://github.com/login/oauth/',
               profile_url: 'https://github.com/settings/profile',
               client_id: ENV.fetch('OAUTH_CLIENT_ID', 'github-oauth-app-id'),
               client_secret: ENV.fetch('OAUTH_CLIENT_SECRET', 'github-oauth-app-secret')
             },
             auth_provider_mappings_attributes: [
               {
                 api_data_type: 'json',
                 api_endpoint: 'https://api.github.com/user',
                 api_field: 'id',
                 local_field: 'uid',
                 local_model: 'user'
               },
               {
                 api_data_type: 'json',
                 api_endpoint: 'https://api.github.com/user',
                 api_field: 'html_url',
                 local_field: 'github',
                 local_model: 'profile'
               }
             ]
           }
         }.to_json,
         headers: default_headers

    # Check response format & status
    assert_equal 201, response.status, response.body
    assert_equal Mime[:json], response.content_type

    # Check the provider was correctly created
    db_provider = OAuth2Provider.includes(:auth_provider).where('auth_providers.name': name).first&.auth_provider
    assert_not_nil db_provider

    provider = json_response(response.body)
    assert_equal name, provider[:name]
    assert_equal db_provider&.id, provider[:id]
    assert_equal 'pending', provider[:status]
    assert_equal 2, provider[:auth_provider_mappings_attributes].length

    # now let's activate this new provider
    Fablab::Application.load_tasks if Rake::Task.tasks.empty?
    Rake::Task['fablab:auth:switch_provider'].invoke(name)

    db_provider&.reload
    assert_equal 'active', db_provider&.status
    assert_equal AuthProvider.active.id, db_provider&.id
    User.all.each do |u|
      assert_not_nil u.auth_token
    end
  end
end