require 'spec_helper' describe Users::DossiersController, type: :controller do let(:user) { create(:user) } let(:procedure) { create(:procedure) } let(:procedure_id) { procedure.id } let(:dossier) { create(:dossier, :with_entreprise, user: user, procedure: procedure) } let(:dossier_id) { dossier.id } let(:siret_not_found) { 999_999_999_999 } let(:rna_status) { 404 } let(:rna_body) { '' } let(:exercices_status) { 200 } let(:exercices_body) { File.read('spec/support/files/exercices.json') } let(:siren) { dossier.siren } let(:siret) { dossier.siret } let(:siret_with_whitespaces) { '440 1176 2001 530' } let(:bad_siret) { 1 } describe 'GET #show' do before do sign_in dossier.user end it 'returns http success with dossier_id valid' do get :show, id: dossier_id expect(response).to have_http_status(:success) end it 'redirection vers liste dossier si mauvais dossier ID' do get :show, id: siret_not_found expect(response).to redirect_to root_path end describe 'before_action authorized_routes?' do context 'when dossier does not have a valid state' do before do dossier.state = 'validated' dossier.save get :show, id: dossier.id end it { is_expected.to redirect_to root_path } end end end describe 'GET #new' do subject { get :new, procedure_id: procedure_id } context 'when params procedure_id is present' do context 'when procedure_id is valid' do context 'when user is logged in' do before do sign_in create(:user) end it { is_expected.to have_http_status(:success) } context 'when procedure is archived' do let(:procedure) { create(:procedure, archived: 'true') } it { is_expected.to redirect_to users_dossiers_path } end end context 'when user is not logged' do it { is_expected.to have_http_status(302) } end end context 'when procedure_id is not valid' do let(:procedure_id) { 0 } before do sign_in create(:user) end it { is_expected.to redirect_to users_dossiers_path } end end end describe 'POST #create' do before do stub_request(:get, "https://apientreprise.fr/api/v1/etablissements/#{siret_not_found}?token=#{SIADETOKEN}") .to_return(status: 404, body: 'fake body') stub_request(:get, "https://apientreprise.fr/api/v1/etablissements/#{siret}?token=#{SIADETOKEN}") .to_return(status: 200, body: File.read('spec/support/files/etablissement.json')) stub_request(:get, "https://apientreprise.fr/api/v1/entreprises/#{siren}?token=#{SIADETOKEN}") .to_return(status: 200, body: File.read('spec/support/files/entreprise.json')) stub_request(:get, "https://apientreprise.fr/api/v1/etablissements/exercices/#{siret}?token=#{SIADETOKEN}") .to_return(status: exercices_status, body: exercices_body) stub_request(:get, "https://apientreprise.fr/api/v1/associations/#{siret}?token=#{SIADETOKEN}") .to_return(status: rna_status, body: rna_body) end describe 'dossier attributs' do let(:user) { create(:user) } shared_examples 'with valid siret' do before do sign_in user end subject { post :create, dossier: {siret: example_siret, procedure_id: Procedure.last} } it 'create a dossier' do expect { subject }.to change { Dossier.count }.by(1) end it 'creates entreprise' do expect { subject }.to change { Entreprise.count }.by(1) end it 'links entreprise to dossier' do subject expect(Entreprise.last.dossier).to eq(Dossier.last) end it "links dossier to user" do subject expect(Dossier.last.user).to eq(user) end it 'creates etablissement for dossier' do expect { subject }.to change { Etablissement.count }.by(1) end it 'links etablissement to dossier' do subject expect(Etablissement.last.dossier).to eq(Dossier.last) end it 'links etablissement to entreprise' do subject expect(Etablissement.last.entreprise).to eq(Entreprise.last) end it 'creates exercices for dossier' do expect { subject }.to change { Exercice.count }.by(3) expect(Exercice.last.etablissement).to eq(Dossier.last.etablissement) end context 'when siret have no exercices' do let(:exercices_status) { 404 } let(:exercices_body) { '' } it { expect { subject }.not_to change { Exercice.count } } end it 'links procedure to dossier' do subject expect(Dossier.last.procedure).to eq(Procedure.last) end it 'state of dossier is draft' do subject expect(Dossier.last.state).to eq('draft') end describe 'Mandataires Sociaux' do let(:france_connect_information) { create(:france_connect_information, given_name: given_name, family_name: family_name, birthdate: birthdate, france_connect_particulier_id: '1234567') } let(:user) { create(:user, france_connect_information: france_connect_information) } before do subject end context 'when user is present in mandataires sociaux' do let(:given_name) { 'GERARD' } let(:family_name) { 'DEGONSE' } let(:birthdate) { '1947-07-03' } it { expect(Dossier.last.mandataire_social).to be_truthy } end context 'when user is not present in mandataires sociaux' do let(:given_name) { 'plop' } let(:family_name) { 'plip' } let(:birthdate) { '1965-01-27' } it { expect(Dossier.last.mandataire_social).to be_falsey } end end describe 'get rna informations' do context 'when siren have not rna informations' do let(:rna_status) { 404 } let(:rna_body) { '' } it 'not creates rna information for entreprise' do expect { subject }.to change { RNAInformation.count }.by(0) end end context 'when siren have rna informations' do let(:rna_status) { 200 } let(:rna_body) { File.read('spec/support/files/rna.json') } it 'creates rna information for entreprise' do expect { subject }.to change { RNAInformation.count }.by(1) end it 'links rna informations to entreprise' do subject expect(RNAInformation.last.entreprise).to eq(Entreprise.last) end end end end describe "with siret without whitespaces" do let(:example_siret) { siret } it_should_behave_like "with valid siret" end describe "with siret with whitespaces" do let(:example_siret) { siret_with_whitespaces } it_should_behave_like "with valid siret" end context 'with non existant siret' do before do sign_in create(:user) end let(:siret_not_found) { '11111111111111' } subject { post :create, dossier: {siret: siret_not_found, procedure_id: procedure.id} } it 'does not create new dossier' do expect { subject }.not_to change { Dossier.count } end it 'redirects to show' do expect(subject).to redirect_to new_users_dossiers_path(procedure_id: procedure_id) end end end end describe 'PUT #update' do before do sign_in dossier.user put :update, id: dossier_id, dossier: {autorisation_donnees: autorisation_donnees} end context 'when Checkbox is checked' do let(:autorisation_donnees) { '1' } context 'procedure not use api carto' do it 'redirects to demande' do expect(response).to redirect_to(controller: :description, action: :show, dossier_id: dossier.id) end end context 'procedure use api carto' do let(:procedure) { create(:procedure, :with_api_carto) } before do put :update, id: dossier_id, dossier: {autorisation_donnees: autorisation_donnees} end it 'redirects to carte' do expect(response).to redirect_to(controller: :carte, action: :show, dossier_id: dossier.id) end end it 'update dossier' do dossier.reload expect(dossier.autorisation_donnees).to be_truthy end end context 'when Checkbox is not checked' do let(:autorisation_donnees) { '0' } it 'uses flash alert to display message' do expect(flash[:alert]).to have_content('Les conditions sont obligatoires.') end it "doesn't update dossier autorisation_donnees" do dossier.reload expect(dossier.autorisation_donnees).to be_falsy end end end describe 'PUT #archive' do let(:dossier) { create(:dossier, user: user) } context 'when user is the owner of the file' do before do sign_in user put :archive, dossier_id: dossier.id dossier.reload end it { expect(dossier.archived).to be_truthy } it { expect(response).to redirect_to :users_dossiers } it { expect(flash[:notice]).to have_content 'Dossier archivé' } end context 'when user is not the owner of the file' do let(:user_2) { create(:user) } before do sign_in user_2 put :archive, dossier_id: dossier.id procedure.reload end it { expect(response).to redirect_to :users_dossiers } it { expect(flash[:alert]).to have_content 'Dossier inéxistant' } end end describe 'GET #a_traiter' do context 'when user is connected' do before do sign_in user end it 'returns http success' do get :index, liste: :a_traiter expect(response).to have_http_status(200) end end end describe 'GET #en_attente' do context 'when user is connected' do before do sign_in user end it 'returns http success' do get :index, liste: :en_attente expect(response).to have_http_status(200) end end end describe 'GET #termine' do context 'when user is connected' do before do sign_in user end it 'returns http success' do get :index, liste: :termine expect(response).to have_http_status(200) end end end describe 'GET #invite' do context 'when user is connected' do before do sign_in user end it 'returns http success' do get :index, liste: :invite expect(response).to have_http_status(200) end end end end