require 'spec_helper'

describe CreateDossier do
  let(:session) { Fabricate :roqua_core_api_token_session }
  let(:person) { Fabricate :roqua_core_api_person, id: nil }
  let(:dossier) { Fabricate :roqua_core_api_dossier, id: nil }
  let(:response) { httparty_response('id' => 'some_id') }

  it 'performs a post on the /dossiers api path' do
    expect(session).to receive(:post) do |path, options|
      expect(path).to eq '/dossier_groups/some_dossier_group_id/dossiers'
      expect(options[:person][:firstname]).to eq 'John'
      expect(options[:dossier][:external_identifier]).to eq 'external-dossier-identifier'
    end.and_return(response)

    CreateDossier.run!(session: session,
                       person: person,
                       dossier: dossier,
                       dossier_group_id: 'some_dossier_group_id')
  end

  it 'works without dossier params' do
    expect(session).to receive(:post) do |path, options|
      expect(path).to eq '/dossier_groups/some_dossier_group_id/dossiers'
      expect(options[:person][:firstname]).to eq 'John'
    end.and_return(response)

    CreateDossier.run!(session: session,
                       person: person,
                       dossier_group_id: 'some_dossier_group_id')
  end

  it 'works without person params' do
    expect(session).to receive(:post) do |path, options|
      expect(path).to eq '/dossier_groups/some_dossier_group_id/dossiers'
    end.and_return(response)

    CreateDossier.run!(session: session,
                       dossier_group_id: 'some_dossier_group_id')
  end

  it 'returns a Dossier model' do
    allow(session).to receive(:post).and_return(response)
    new_dossier = CreateDossier.run!(session: session,
                                     person: person,
                                     dossier: dossier,
                                     dossier_group_id: 'some_dossier_group_id')
    expect(new_dossier).to be_a(Dossier)
    expect(new_dossier.id).to eq('some_id')
  end

  describe 'with validation errors' do
    let(:response) { httparty_response({'errors' => {'person' => {'email' => ['invalid_email']},
                                                     'dossier' => {'external_identifier' => ['blank']},
                                                     'credential' => {'password' => ['too_short']}}},
                                       422) }
    let(:credential) { Roqua::CoreApi::Models::Credential.new \
                         username: 'foobar', password: '123', password_confirmation: '123' }

    it 'sets the errors on the objects' do
      allow(session).to receive(:post).and_return(response)
      new_dossier = CreateDossier.run!(session: session,
                                       person: person,
                                       dossier: dossier,
                                       credential: credential,
                                       dossier_group_id: 'some_dossier_group_id')
      expect(new_dossier.persisted?).to be_falsy
      expect(person.errors[:email]).to eq ['Geen geldig email adres']
      expect(dossier.errors[:external_identifier]).to eq ['moet opgegeven zijn']
      expect(credential.errors[:password]).to eq ['is te kort']
    end
  end
end