require 'spec_helper'

describe "Signup", :js => true, :type => :feature, :capybara_feature => true do

  subject { page }

  before(:all) do
    @old_recaptcha=Rails.application.config.recaptcha_enable
    Rails.application.config.recaptcha_enable=false
  end

  after(:all) do
    Rails.application.config.recaptcha_enable=@old_recaptcha
  end

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

  describe "with origin" do

    # Successful signup with no invitation tells you to go sign up
    it {
      visit "/signup?utm_source=abc&utm_medium=ads&utm_campaign=campaign1"
      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: "withorigin1@jamkazam.com"
      fill_in "jam_ruby_user[password]", with: "jam123"
      fill_in "jam_ruby_user[password_confirmation]", with: "jam123"

      check("jam_ruby_user[terms_of_service]")
      click_button "CREATE ACCOUNT"
      should have_title("JamKazam | Congratulations")
      should have_content("Your account is ready.")
      user = User.find_by_email('withorigin1@jamkazam.com')
      user.musician_instruments.length.should == 1
      location = GeoIpLocations.lookup('127.0.0.1')
      user.country.should == location[:country]
      user.state.should == location[:state]
      user.city.should == location[:city]
      # an email is sent on no-invite signup
      user.origin_utm_source.should eql 'abc'
      user.origin_utm_campaign.should eql 'campaign1'
      user.origin_utm_medium.should eql 'ads'
      user.origin_referrer.should be_nil
    }
  end
  describe "signup page" do
    before { visit signup_path }

    it "should initialize successfully" do
      should have_selector('h2.create-account-header', text: '1Create your free JamKazam account')
    end

    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: "newuser1@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"

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

      # Successful signup with no invitation tells you to go sign up
      it {
          should have_title("JamKazam | Congratulations")
          should have_content("Your account is ready.")
          user = User.find_by_email('newuser1@jamkazam.com')
          user.musician_instruments.length.should == 1
          location = GeoIpLocations.lookup('127.0.0.1')
          user.country.should == location[:country]
          user.state.should == location[:state]
          user.city.should == location[:city]
          # an email is sent on no-invite signup
          UserMailer.deliveries.length.should == 2
          UserMailer.deliveries[0].html_part.body.include?("To confirm this email address")== 1
      }

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

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

        it {
          should have_title("Signup Confirmation")
          should have_selector('h1', text: "Email Confirmed")
        }
      end
    end

    describe "with service invite" do
      before do
        @invited_user = FactoryGirl.create(:invited_user, :email => "noone@jamkazam.com", :sender => FactoryGirl.create(:user))
        visit "#{signup_path}?invitation_code=#{@invited_user.invitation_code}"
        find('#jam_ruby_user_first_name')
        sleep 1 # if I don't do this, first_name and/or last name intermittently fail to fill out

        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: "newuser2@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"

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

      # Successful sign-in goes to the client
      it {
        should have_title("JamKazam")
        should have_selector('.flash-content', text: "Soon you can play with #{@invited_user.sender.name}")
        UserMailer.deliveries.length.should == 2
        uri = URI.parse(current_url)
        "#{uri.path}?#{uri.query}".should == congratulations_musician_path(:friend => @invited_user.sender.name)
      }
    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}"
        find('#jam_ruby_user_first_name')
        sleep 1 # if I don't do this, first_name and/or last name intermittently fail to fill out

        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: "newuser3@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"

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

      # Successful sign-in goes to the client
      it {
        should have_title("JamKazam")
        should have_selector('.flash-content', text: "Soon you can play with #{@invited_user.sender.name}")
        @user.friends?(User.find_by_email("newuser3@jamkazam.com"))
        User.find_by_email("newuser3@jamkazam.com").friends?(@user)
        uri = URI.parse(current_url)
        "#{uri.path}?#{uri.query}".should == congratulations_musician_path(:friend => @invited_user.sender.name)
      }
    end


    def signup_invited_user
      visit "#{signup_path}?invitation_code=#{@invited_user.invitation_code}"
      find('#jam_ruby_user_first_name')
      sleep 1 # if I don't do this, first_name and/or last name intermittently fail to fill out

      fill_in "jam_ruby_user[first_name]",    with: "Mike"
      fill_in "jam_ruby_user[last_name]", with: "Jones"
      @invited_user_email = "newuser#{rand(10000)}@jamkazam.com"
      fill_in "jam_ruby_user[email]", with: @invited_user_email
      fill_in "jam_ruby_user[password]", with: "jam123"
      fill_in "jam_ruby_user[password_confirmation]", with: "jam123"

      check("jam_ruby_user[terms_of_service]")
      click_button "CREATE ACCOUNT"
    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", :sender => FactoryGirl.create(:user))
        visit "#{signup_path}?invitation_code=#{@invited_user.invitation_code}"
        find('#jam_ruby_user_first_name')
        sleep 1 # if I don't do this, first_name and/or last name intermittently fail to fill out

        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: "newuser5@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"

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

      it {
        should have_title("JamKazam | Congratulations")
        should have_selector('.flash-content', text: "Soon you can play with #{@invited_user.sender.name}")
        User.find_by_email('newuser5@jamkazam.com').musician_instruments.length.should == 1
        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
        UserMailer.deliveries.length.should == 2
        uri = URI.parse(current_url)
        "#{uri.path}?#{uri.query}".should == congratulations_musician_path(:friend => @invited_user.sender.name)
        sign_out
      }
    end

    describe "signup_hints" do
      it "redirects to custom location on matched signup_hint" do

        # causes anon cookie to show
        visit '/'
        find('h2', text: 'Play music live and in sync with others from different locations')

        # get a anonymous cookie set up
        anon_user_id = get_me_the_cookie("user_uuid")
        puts "#ANON_USER_ID #{anon_user_id.inspect}"
        anon_user = AnonymousUser.new(anon_user_id[:value], {})
        SignupHint.refresh_by_anoymous_user(anon_user, {redirect_location: '/affiliateProgram'})

        visit signup_path

        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: "signup_hint_guy@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"

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

        find('h1', text:'JamKazam Affiliate Program')

        user = User.find_by_email('signup_hint_guy@jamkazam.com')
        user.should_not be_nil
      end

      it "ignores expired_at signup_hint" do

        # causes anon cookie to show
        visit '/'
        find('h2', text: 'Play music live and in sync with others from different locations')

        # get a anonymous cookie set up
        anon_user_id = get_me_the_cookie("user_uuid")
        anon_user = AnonymousUser.new(anon_user_id[:value], {})
        hint = SignupHint.refresh_by_anoymous_user(anon_user, {redirect_location: '/products/jamblaster', want_jamblaster: true})
        hint.expires_at = 1.day.ago
        hint.save!

        visit signup_path

        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: "signup_hint_guy2@jamkazam.com"
        fill_in "jam_ruby_user[password]", with: "jam123"
        fill_in "jam_ruby_user[password_confirmation]", with: "jam123"

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

        should have_title("JamKazam | Congratulations")

        user = User.find_by_email('signup_hint_guy2@jamkazam.com')
        user.want_jamblaster.should be false
      end
    end

  end

end
