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