require 'spec_helper'
describe Auth0::Api::V2::Connections do
  before :all do
    dummy_instance = DummyClass.new
    dummy_instance.extend(Auth0::Api::V2::Connections)
    @instance = dummy_instance
  end

  context '.connections' do
    it { expect(@instance).to respond_to(:connections) }
    it { expect(@instance).to respond_to(:get_connections) }

    it 'is expected to call /api/v2/connections' do
      expect(@instance).to receive(:get).with(
        '/api/v2/connections', {
        strategy: nil,
        name: nil,
        fields: nil,
        include_fields: nil,
        page: nil,
        per_page: nil,
        include_totals: nil
      })
      expect { @instance.connections }.not_to raise_error
    end

    it 'is expected to send get request to /api/v2/connections?fields=name' do
      expect(@instance).to receive(:get).with(
        '/api/v2/connections', {
        include_fields: true,
        fields: 'name',
        strategy: nil,
        name: nil,
        page: nil,
        per_page: nil,
        include_totals: nil
      })
      expect {
        @instance.connections(fields: 'name', include_fields: true)
      }.not_to raise_error
    end

    it 'is expected to convert fields param from Array to string' do
      expect(@instance).to receive(:get).with(
        '/api/v2/connections', {
        include_fields: true,
        fields: 'name,strategy',
        strategy: nil,
        name: nil,
        page: nil,
        per_page: nil,
        include_totals: nil
      })
      expect {
        @instance.connections(fields: ['name','strategy'], include_fields: true)
      }.not_to raise_error
    end

    it 'is expected to add pagination' do
      expect(@instance).to receive(:get).with(
        '/api/v2/connections', {
        page: 1,
        per_page: 10,
        strategy: nil,
        name: nil,
        fields: nil,
        include_fields: nil,
        include_totals: nil
      })
      expect {
        @instance.connections(page: 1, per_page: 10)
      }.not_to raise_error
    end

    it 'is expected to include totals' do
      expect(@instance).to receive(:get).with(
        '/api/v2/connections', {
        page: 1,
        per_page: 10,
        strategy: nil,
        name: nil,
        fields: nil,
        include_fields: nil,
        include_totals: true
      })
      expect {
        @instance.connections(page: 1, per_page: 10, include_totals: true)
      }.not_to raise_error
    end
  end

  context '.create_connection' do
    it { expect(@instance).to respond_to(:connection) }
    it { expect(@instance).to respond_to(:create_connection) }

    it 'is expected to call /api/v2/connections' do
      body = double
      expect(@instance).to receive(:post).with('/api/v2/connections', body)
      expect { @instance.create_connection(body) }.not_to raise_error
    end

    it 'is expected to raise an error when calling with empty body' do
      expect(@instance).not_to receive(:post)
      expect { @instance.create_connection(nil) }.to raise_error 'Must specify a body to create a connection'
    end
  end

  context '.connection' do
    it { expect(@instance).to respond_to(:connection) }
    it 'is expected to call get request to /api/v2/connection/connectionId' do
      expect(@instance).to receive(:get).with('/api/v2/connections/connectionId', { fields: nil, include_fields: true })
      expect { @instance.connection('connectionId') }.not_to raise_error
    end
    it 'is expected raise an error when calling with empty id' do
      expect(@instance).not_to receive(:get)
      expect { @instance.connection(nil) }.to raise_error 'Must supply a valid connection id'
    end
  end

  context '.delete_connection' do
    it { expect(@instance).to respond_to(:delete_connection) }
    it 'is expected to call delete to /api/v2/connections/connectionId' do
      expect(@instance).to receive(:delete).with('/api/v2/connections/connectionId')
      @instance.delete_connection('connectionId')
    end

    it 'is expected raise an error when calling with empty id' do
      expect(@instance).not_to receive(:delete)
      expect { @instance.delete_connection(nil) }.to raise_error 'Must supply a valid connection id'
    end
  end

  context '.delete_connection_user' do
    it { expect(@instance).to respond_to(:delete_connection_user) }
    it 'is expected to call delete to /api/v2/connections/connectionId/users' do
      expect(@instance).to receive(:delete).with('/api/v2/connections/connectionId/users', { email: 'email@test.com' })
      @instance.delete_connection_user('connectionId', 'email@test.com')
    end

    it 'is expected raise an error when calling with empty id' do
      expect(@instance).not_to receive(:delete)
      expect { @instance.delete_connection_user(nil, nil) }.to raise_error 'Must supply a valid connection id'
    end

    it 'is expected raise an error when calling with empty email' do
      expect(@instance).not_to receive(:delete)
      expect { @instance.delete_connection_user('Connection ID', nil) }.to raise_error 'Must supply a valid user email'
    end
  end

  context '.update_connection' do
    it { expect(@instance).to respond_to(:update_connection) }
    it 'is expected to call patch to /api/v2/connections/connectionId' do
      body = double
      expect(@instance).to receive(:patch).with('/api/v2/connections/connectionId', body)
      @instance.update_connection('connectionId', body)
    end

    it 'is expected raise an error when calling with empty id' do
      expect(@instance).not_to receive(:patch)
      expect { @instance.delete_connection(nil) }.to raise_error 'Must supply a valid connection id'
    end
  end
end