require 'spec_helper'

describe "Signup" do

  subject { page }

  before(:each) do
    @mac_client = FactoryGirl.create(:artifact_update)
    UserMailer.deliveries.clear
  end

  describe "signup page" do
    before { visit signup_path }

    it { should have_selector('h1',    text: 'create a jamkazam account') }

    describe "with valid musician information" do
      before do
        fill_in "jam_ruby_user[first_name]",    with: "Mike"
        fill_in "jam_ruby_user[last_name]", with: "Jones"
        fill_in "jam_ruby_user[email]", with: "noone@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"
        check("jam_ruby_user[instruments][drums][selected]")
        check("jam_ruby_user[terms_of_service]")
        click_button "CREATE ACCOUNT"
      end

      # Successful signup with no invitation tells you to go sign up
      it { page.should have_title("JamKazam | Congratulations")  }
      it { should have_selector('.overlay-inner', text: "You have successfully registered as a JamKazam musician.") }
      it { User.find_by_email('noone@jamkazam.com').musician_instruments.length.should == 1 }
      # an email is sent on no-invite signup
      it { UserMailer.deliveries.length.should == 1 }
      it { UserMailer.deliveries[0].html_part.body.include?("To confirm this email address")== 1 }
      it {uri = URI.parse(current_url); "#{uri.path}?#{uri.query}".should == congratulations_musician_path(:type => 'Native')}

      describe "user can confirm email and receive welcome email" do

        before(:each) do
          UserMailer.deliveries.clear
          visit signup_confirm_path(User.find_by_email('noone@jamkazam.com').signup_token)
        end

        it { page.should have_title("JamKazam")  }
        it { should have_selector('h2', text: "musicians") }
        it { UserMailer.deliveries.length.should == 1 }
        it { UserMailer.deliveries[0].html_part.body.include?("Following are links to some resources")== 1 }
      end
    end

    describe "with valid fan information" do
      before do
        fill_in "jam_ruby_user[first_name]",    with: "Mike"
        fill_in "jam_ruby_user[last_name]", with: "Jones"
        fill_in "jam_ruby_user[email]", with: "somefan@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"
        choose "jam_ruby_user_musician_false"

         check("jam_ruby_user[terms_of_service]")
        click_button "CREATE ACCOUNT"
      end

      # Successful signup with no invitation tells you to go sign up
      it { page.should have_title("JamKazam | Congratulations")  }
      it { should have_selector('.overlay-inner', text: "You have successfully registered as a JamKazam fan.") }
      it { should have_selector('a.button-orange.m0', text: 'PROCEED TO JAMKAZAM SITE') }
      it { User.find_by_email('somefan@jamkazam.com').musician_instruments.length.should == 0 }
      # an email is sent on no-invite signup
      it { UserMailer.deliveries.length.should == 1 }
      it {uri = URI.parse(current_url); "#{uri.path}?#{uri.query}".should == congratulations_fan_path(:type => 'Native')}
    end

    describe "with service invite" do
      before do
        @invited_user = FactoryGirl.create(:invited_user, :email => "noone@jamkazam.com")
        visit "#{signup_path}?invitation_code=#{@invited_user.invitation_code}"

        UserMailer.deliveries.clear
        fill_in "jam_ruby_user[first_name]",    with: "Mike"
        fill_in "jam_ruby_user[last_name]", with: "Jones"
        fill_in "jam_ruby_user[email]", with: "noone@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"
        check("jam_ruby_user[instruments][drums][selected]")
        check("jam_ruby_user[terms_of_service]")
        click_button "CREATE ACCOUNT"
      end

      # Successful sign-in goes to the client
      it { page.should have_title("JamKazam")  }
      it { should have_selector('h1', text: "congratulations") }

      it { UserMailer.deliveries.length.should == 1 }
      it {uri = URI.parse(current_url); "#{uri.path}?#{uri.query}".should == congratulations_musician_path(:type => 'Native')}
    end

    describe "with user invite and autofriend" do
      before do
        @user = FactoryGirl.create(:user)
        @invited_user = FactoryGirl.create(:invited_user, :sender => @user, :autofriend => true, :email => "noone@jamkazam.com")
        visit "#{signup_path}?invitation_code=#{@invited_user.invitation_code}"

        fill_in "jam_ruby_user[first_name]",    with: "Mike"
        fill_in "jam_ruby_user[last_name]", with: "Jones"
        fill_in "jam_ruby_user[email]", with: "noone@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"
        check("jam_ruby_user[instruments][drums][selected]")
        check("jam_ruby_user[terms_of_service]")
        click_button "CREATE ACCOUNT"
      end

      # Successful sign-in goes to the client
      it { page.should have_title("JamKazam")  }
      it { should have_selector('h1', text: "congratulations") }
      it { @user.friends?(User.find_by_email("noone@jamkazam.com")) }
      it { User.find_by_email("noone@jamkazam.com").friends?(@user) }
      it {uri = URI.parse(current_url); "#{uri.path}?#{uri.query}".should == congratulations_musician_path(:type => 'Native')}
    end

    describe "can't signup to the same invite twice" do
      before do
        @invited_user = FactoryGirl.create(:invited_user, :email => "noone@jamkazam.com")
        visit "#{signup_path}?invitation_code=#{@invited_user.invitation_code}"

        fill_in "jam_ruby_user[first_name]",    with: "Mike"
        fill_in "jam_ruby_user[last_name]", with: "Jones"
        fill_in "jam_ruby_user[email]", with: "noone@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"
        check("jam_ruby_user[instruments][drums][selected]")
        check("jam_ruby_user[terms_of_service]")
        click_button "CREATE ACCOUNT"
        page.should have_title("JamKazam")
        should have_selector('h1', text: "congratulations")
        visit "#{signup_path}?invitation_code=#{@invited_user.invitation_code}"
      end

      it { should have_selector('h1', text: "You have already signed up with this invitation") }

    end

    describe "can signup with an email different than the one used to invite" do
      before do
        @invited_user = FactoryGirl.create(:invited_user, :email => "what@jamkazam.com")
        visit "#{signup_path}?invitation_code=#{@invited_user.invitation_code}"

        UserMailer.deliveries.clear

        fill_in "jam_ruby_user[first_name]",    with: "Mike"
        fill_in "jam_ruby_user[last_name]", with: "Jones"
        fill_in "jam_ruby_user[email]", with: "noone@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"
        check("jam_ruby_user[instruments][drums][selected]")
        check("jam_ruby_user[terms_of_service]")
        click_button "CREATE ACCOUNT"
      end

      it { page.should have_title("JamKazam | Congratulations")  }
      it { should have_selector('.overlay-inner', text: "You have successfully registered as a JamKazam musician.") }
      it { User.find_by_email('noone@jamkazam.com').musician_instruments.length.should == 1 }
      it { User.find_by_email('what@jamkazam.com').should be_nil }
      # an email is sent when you invite but use a different email than the one used to invite
      it { UserMailer.deliveries.length.should == 1 }
      it {uri = URI.parse(current_url); "#{uri.path}?#{uri.query}".should == congratulations_musician_path(:type => 'Native')}
      it {
        visit "#{signup_path}?invitation_code=#{@invited_user.invitation_code}"
        should have_selector('h1', text: "You have already signed up with this invitation")
      }

    end


  end

end
