# frozen_string_literal: true
require_relative '../../../plugin_helper'

describe CustomWizard::AdminSubscriptionController do
  fab!(:admin_user) { Fabricate(:user, admin: true) }

  def generate_payload(request_id, user_id)
    uri = URI(@subscription.authentication_url(user_id, request_id))
    keys = @subscription.authentication.get_keys(request_id)
    raw_payload = {
      key: "12345",
      nonce: keys.nonce,
      push: false,
      api: UserApiKeysController::AUTH_API_VERSION
    }.to_json
    public_key = OpenSSL::PKey::RSA.new(keys.pem)
    Base64.encode64(public_key.public_encrypt(raw_payload))
  end

  before do
    @subscription = CustomWizard::Subscription.new
    sign_in(admin_user)
  end

  it "#index" do
    get "/admin/wizards/subscription.json"
    expect(response.parsed_body['server']).to eq(@subscription.server)
    expect(response.parsed_body['authentication'].deep_symbolize_keys).to eq(CustomWizard::Subscription::AuthenticationSerializer.new(@subscription.authentication, root: false).as_json)
    expect(response.parsed_body['subscription'].deep_symbolize_keys).to eq(CustomWizard::Subscription::SubscriptionSerializer.new(@subscription.subscription, root: false).as_json)
  end

  it "#authorize" do
    get "/admin/wizards/subscription/authorize"
    expect(response.status).to eq(302)
    expect(cookies[:user_api_request_id].present?).to eq(true)
  end

  it "#destroy_authentication" do
    request_id = SecureRandom.hex(32)
    payload = generate_payload(request_id, admin_user.id)
    @subscription.authentication_response(request_id, payload)

    delete "/admin/wizards/subscription/authorize.json"

    expect(response.status).to eq(200)
    expect(CustomWizard::Subscription.authorized?).to eq(false)
  end

  context "subscription" do
    before do
      stub_subscription_request(200, valid_subscription)
    end

    it "handles authentication response and the updates subscription" do
      request_id = cookies[:user_api_request_id] = SecureRandom.hex(32)
      payload = generate_payload(request_id, admin_user.id)
      get "/admin/wizards/subscription/authorize/callback", params: { payload: payload }

      expect(response).to redirect_to("/admin/wizards/subscription")
      expect(CustomWizard::Subscription.subscribed?).to eq(true)
    end

    it "updates the subscription" do
      authenticate_subscription
      post "/admin/wizards/subscription.json"

      expect(response.status).to eq(200)
      expect(CustomWizard::Subscription.subscribed?).to eq(true)
    end
  end
end