summaryrefslogblamecommitdiffstats
path: root/spec/registration_spec.rb
blob: 7208d5a6bf6bad8bebfb902adc4c118566e8fb1d (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16















                                                                             
               
                             
 







                             







                                          
 






                                                                          
 




                                                         
       
 








                                            


                                                          
                                                                 
         
       

     
                                 





                                       
                                          
                     



                                        

         




                                                
 






                                                                             
 







                                                                                            
                                                                                                                                                                        












                                                                                                                                
 



                                                                                                                                                                             
 

                                                             
 


                                                               
 







                                                                                                                                                                    

         

                                                       
 

                                               

           

                                                                            
           
 



                                                                         
 

                                                           
         
 

                                                           
         
 

                                                               
         
 


                                                                   
 
                                          
                                                                                                                   
         
 


                                                                    
 


                                                                    



















                                                                                

       






                                              
 

                                             
 
                                                      

                                            
                                                                 
         
       

     
# Band registration form for Norsk Urskog Metal Sampler
# Copyright (C) 2015-2018  Harald Eilersen <haraldei@anduin.net>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

require "prawn"
require 'rack/session/cookie'

describe RegistrationApp do
  include Rack::Test::Methods

  def app
    RegistrationApp
  end

  describe 'GET index' do
    context 'when registration is open' do
      before :each do
        app.set :accept_registrations, {
          start: Date.today.iso8601,
          stop: (Date.today + 1).iso8601
        }
        get '/'
      end

      it 'should succeed' do
        expect(last_response).to be_ok
      end

      it 'displays the registration form' do
        expect(last_response.body).to match(/form id="registration-form"/)
      end

      it 'allows three songs' do
        expect(last_response.body).to match(/Låt nr. 1/)
        expect(last_response.body).to match(/Låt nr. 2/)
        expect(last_response.body).to match(/Låt nr. 3/)
      end
    end

    context 'when registration is closed' do
      before :each do
        app.set :accept_registrations, {
          start: (Date.today + 1).iso8601,
          stop: (Date.today + 30).iso8601
        }
        get '/'
      end

      it 'should redirect to registrations closed page' do
        expect(last_response).to be_redirect
        follow_redirect!
        expect(last_request.url).to match '/registrations_closed'
      end
    end
  end

  describe 'submitting a form' do
    include Mail::Matchers

    before :each do
      Mail::TestMailer.deliveries.clear
    end

    context 'when registration is open' do
      before :each do
        app.set :accept_registrations, {
          start: Date.today.iso8601,
          stop: (Date.today + 1).iso8601
        }
      end

      context 'with a valid registration' do
        let(:band_params) { create_band_params }
        before :each do
          post '/submit', 'band' => band_params
        end

        it 'should succeed' do
          expect(last_response).to be_ok
        end

        it 'should not display any errors' do
          expect(last_response.body).not_to include("Det er feil i skjemaet")
        end

        it 'displays submitted data to user' do
          expect(last_response).to match(/Bandnavn\: #{band_params['name']}/)
          expect(last_response).to match(/Hjemsted\: #{band_params['city']}/)
          expect(last_response).to match(/Webside\: #{band_params['website']}/)
          expect(last_response).to match(/Plateselskap\: #{band_params['label']}/)
          expect(last_response).to match(/Kort bio\: #{band_params['shortbio']}/)

          expect(last_response).to match(/Kontaktperson: #{band_params['contact']['name']}/)
          expect(last_response).to match(/Kontaktadresse: #{band_params['contact']['street']}, #{band_params['contact']['postcode']} #{band_params['contact']['city']}/)
          expect(last_response).to match(/Telefon: #{band_params['contact']['phone']}/)
          expect(last_response).to match(/Epost: #{band_params['contact']['email']}/)

          expect(last_response).to match(/#{band_params['members']['1']['name']}, #{band_params['members']['1']['instrument']}/)
          expect(last_response).to match(/#{band_params['members']['2']['name']}, #{band_params['members']['2']['instrument']}/)
          expect(last_response).to match(/#{band_params['members']['3']['name']}, #{band_params['members']['3']['instrument']}/)

          expect(last_response).to match(/#{band_params['songs']['1']['title']}/)
          expect(last_response).to match(/Spilletid: #{band_params['songs']['1']['time']}/)
          expect(last_response).to match(/Utøvere: #{band_params['songs']['1']['performers'].split("\n").join(", ")}/)
          expect(last_response).to match(/Låtskrivere: #{band_params['songs']['1']['composers'].split("\n").join(", ")}/)
          expect(last_response).to match(/Merknad: #{band_params['songs']['1']['notes']}/)
        end

        it "generates a PDF file" do
          expect(Prawn::Document).to have_received('new').with({ :page_size => "A4" })
          expect(@doc_spy).to have_received('render_file').with(/uploads\/[0-9]{4}-[0-9]{2}-[0-9]{2}-#{sanitize(band_params['name'])}-#{sanitize(band_params['city'])}\.pdf/)
        end

        describe 'sends an email to Norsk Urskog' do
          let(:message) { Mail::TestMailer.deliveries.first }

          it 'is not empty' do
            expect(Mail::TestMailer.deliveries).not_to be_empty
          end

          it 'contains the band info' do
            expect(message.subject).to match(/Registrering av band #{band_params['name']} til Norsk Urskog/)
          end

          it 'contains the url to the pdf file' do
            expect(message.body).to match(/example.org\/uploads\/[0-9]{4}-[0-9]{2}-[0-9]{2}-#{sanitize(band_params['name'])}-#{sanitize(band_params['city'])}\.pdf/)
          end
        end
      end

      shared_examples_for('form with errors') do |args|
        let(:band_params) { create_band_params(args) }

        before :each do
          post '/submit', 'band' => band_params
        end

        it 'should go back to the registration form' do
          expect(last_response.body).to match(/form id="registration-form"/)
        end

        it 'should display an error message' do
          expect(last_response.body).to include("Det er feil i skjemaet")
        end
      end

      context 'with no songs' do
        include_examples('form with errors', {:songs => 0})
      end

      context 'without a band name' do
        include_examples('form with errors', {:name => ''})
      end

      context 'with a band name with only spaces' do
        include_examples('form with errors', {:name => '    '})
      end

      context 'with no contact' do
        include_examples('form with errors', {:contact_name => ''})
      end

      context 'with no contact address' do
        include_examples('form with errors', {:contact_city => '', :contact_postcode => '', :contact_street => ''})
      end

      context 'with no contact phone' do
        include_examples('form with errors', {:contact_phone => ''})
      end

      context 'with no contact email' do
        include_examples('form with errors', {:contact_email => ''})
      end

      context 'with invalid contact email' do
        context 'missing domain info' do
          include_examples('form with errors', {:contact_email => 'blaff'})
        end

        context 'missing top level domain' do
          include_examples('form with errors', {:contact_email => 'blaff@merz'})
        end
      end

      context 'with invalid phone number' do
        context 'containing invalid chars' do
          include_examples('form with errors', {:contact_phone => '756balle'})
        end

        context 'containing too few numbers' do
          include_examples('form with errors', {:contact_phone => '7568923'})
        end
      end
    end

    context 'when registration is closed' do
      let(:band_params) { create_band_params }
      before :each do
        app.set :accept_registrations, {
          start: (Date.today + 1).iso8601,
          stop: (Date.today + 30).iso8601
        }

        post '/submit', 'band' => band_params
      end

      it 'redirects to registration closed message' do
        expect(last_response).to be_redirect
        follow_redirect!
        expect(last_request.url).to match '/registrations_closed'
      end
    end
  end
end