Skip to content
Snippets Groups Projects
Select Git revision
  • ae0aa02d038f16bb0919eebee805624bb891f48f
  • master default protected
  • ci-test-ruby-2.5
  • drop/ruby-2.1
  • version/0.9
  • feat/drop-signup
  • version/0.8
  • version/0.7.1
  • version/0.7
  • version/0.6.1
  • version/0.6
  • 0.9.3
  • 0.9.2
  • 0.9.1
  • 0.9.0
  • 0.8.0
  • 0.7.1
  • 0.7.0
  • 0.6.0
  • 0.5.3
  • 0.5.2
  • 0.5.2-rc
  • 0.5.1
  • 0.5.1-rc2
  • 0.5.1-rc
  • 0.5.0
  • 0.5.0.rc
  • 0.2.8
  • 0.2.8.rc
  • 0.2.7
  • 0.2.6
31 results

account_test.rb

Blame
  • account_test.rb 7.19 KiB
    require_relative '../test_helper'
    
    class AccountTest < ActiveSupport::TestCase
    
      setup do
        @testcode = InviteCode.new
        @testcode.save!
      end
    
      teardown do
        @user.account.destroy if @user && @user.persisted?
        Identity.destroy_all_orphaned
      end
    
      test "create a new account when invited" do
        @user = Account.create(user_attributes( :invite_code => @testcode.invite_code))
        assert @user.valid?, "unexpected errors: #{@user.errors.inspect}"
        assert @user.persisted?
        assert id = @user.identity
        assert_equal @user.email_address, id.address
        assert_equal @user.email_address, id.destination
      end
    
      test "fail to create account without invite" do
        with_config invite_required: true do
          @user = Account.create(user_attributes)
          assert !@user.valid?, "user should not be valid"
          assert !@user.persisted?, "user should not have been saved"
          assert_has_errors @user, invite_code: "This is not a valid code"
        end
      end
    
      test "allow invite_required override" do
        with_config invite_required: true do
          @user = Account.create(user_attributes, :invite_required => false)
          assert @user.valid?, "unexpected errors: #{@user.errors.inspect}"
          assert @user.persisted?, "user should have been saved"
        end
      end
    
      test "create a new account" do
        with_config invite_required: false do
          @user = Account.create(user_attributes)
          assert @user.valid?, "unexpected errors: #{@user.errors.inspect}"
          assert @user.persisted?
        end
      end
    
      test "error on reused username" do
        with_config invite_required: false do
          attributes = user_attributes
          @user = Account.create attributes
          dup = Account.create attributes
          assert !dup.valid?
          assert_has_errors dup, login: "has already been taken"
        end
      end
    
      test "error on invalid username" do
        with_config invite_required: false do
          attributes = FactoryGirl.attributes_for :user, login: "a"
          @user = Account.create attributes
          assert !@user.valid?
          assert_has_errors @user, login: "Must have at least two characters"
        end
      end
    
      test "create and remove a @user account" do
        # We keep an identity that will block the handle from being reused.
        assert_difference "Identity.count" do
          assert_no_difference "User.count" do
            @user = Account.create(user_attributes( :invite_code => @testcode.invite_code))
            @user.account.destroy
          end
        end
      end
    
      test "change username and create alias" do
        @user = Account.create(user_attributes( :invite_code => @testcode.invite_code))
        old_id = @user.identity
        old_email = @user.email_address
        @user.account.update(user_attributes)
        @user.reload
        old_id.reload
        assert @user.valid?
        assert @user.persisted?
        assert id = @user.identity
        assert id.persisted?
        assert_equal @user.email_address, id.address
        assert_equal @user.email_address, id.destination
        assert_equal @user.email_address, old_id.destination
        assert_equal old_email, old_id.address
      end
    
      test "create recovery code if it does not exist" do
        @user = Account.create(user_attributes( :invite_code => @testcode.invite_code))
        @user.account.update(:recovery_code_verifier => "abc", :recovery_code_salt => "123")
        @user.reload
    
        assert_equal "abc", @user.recovery_code_verifier
        assert_equal "123", @user.recovery_code_salt
      end
    
      test "update recovery code that already exists" do
        @user = Account.create(user_attributes(
          :invite_code => @testcode.invite_code,
          :recovery_code_verifier => "000",
          :recovery_code_salt => "111"))
    
        @user.account.update(:recovery_code_verifier => "abc", :recovery_code_salt => "123")
        @user.reload
    
        assert_equal "abc", @user.recovery_code_verifier
        assert_equal "123", @user.recovery_code_salt
      end
    
      test "update password" do
        @user = Account.create(user_attributes( :invite_code => @testcode.invite_code))
        @user.account.update(:password_verifier => "551A8B", :password_salt => "551A8B")
    
        assert_equal "551A8B", @user.password_verifier
        assert_equal "551A8B", @user.password_salt
      end
    
      test "Invite code count goes up by 1 when the invite code is entered" do
        with_config invite_required: true do
          @user = Account.create(user_attributes( :invite_code => @testcode.invite_code))
          user_code = InviteCode.find_by_invite_code @user.invite_code
          @user.save
          assert @user.persisted?
          assert_equal 1, user_code.invite_count
        end
      end
    
      test "Single use invite code is destroyed when used by test @user" do
        with_config invite_required: true do
          attrs = user_attributes invite_code: @testcode.invite_code
          attrs[:login] = 'test_user_' + attrs[:login]
          @user = Account.create(attrs)
          @user.save
          assert @user.persisted?, @user.errors.inspect
          assert_nil InviteCode.find_by_invite_code @user.invite_code
        end
      end
    
      test "Single use invite code is destroyed when used by tmp @user" do
        with_config invite_required: true do
          attrs = user_attributes invite_code: @testcode.invite_code
          attrs[:login] = 'tmp_user_' + attrs[:login]
          @user = Account.create(attrs)
          @user.save
          assert @user.persisted?, @user.errors.inspect
          assert_nil InviteCode.find_by_invite_code @user.invite_code
        end
      end
    
      test "Invite code stays zero when invite code is not used" do
        invalid_user = FactoryGirl.build(:user, :invite_code => @testcode.invite_code)
        invalid_user.save
        user_code = InviteCode.find_by_invite_code invalid_user.invite_code
        user_code.save
    
        assert_equal 0, user_code.invite_count
      end
    
      test "disabled accounts have no cert fingerprints" do
        @user = Account.create(user_attributes)
        cert = stub(expiry: 1.month.from_now, fingerprint: SecureRandom.hex)
        @user.identity.register_cert cert
        @user.identity.save
        assert_equal(cert.fingerprint, Identity.for(@user).cert_fingerprints.keys.first)
        @user.account.disable
        assert_equal({}, Identity.for(@user).cert_fingerprints)
        assert_equal(cert.fingerprint, Identity.for(@user).read_attribute(:disabled_cert_fingerprints).keys.first)
        @user.account.enable
        assert_equal(cert.fingerprint, Identity.for(@user).cert_fingerprints.keys.first)
      end
    
      # Pixelated relies on the ability to test invite codes without sending a
      # username and password yet.
      # So we better make sure we return the appropriate errors
      test "errors trying to create account with invite only" do
        with_config invite_required: true do
          @user = Account.create invite_code: @testcode.invite_code
          assert @user.errors[:invite_code].blank?
        end
      end
    
      test "errors trying to create account with invalid invite only" do
        with_config invite_required: true do
          @user = Account.create invite_code: "wrong_invite_code"
          assert_has_errors @user, invite_code: "This is not a valid code"
        end
      end
    
      protected
    
      # Tests for the presence of the errors given.
      # Does not test for the absence of other errors - so there may be more.
      def assert_has_errors(record, errors)
        errors.each do |field, field_errors|
          Array(field_errors).each do |error|
            assert_includes record.errors[field], error
          end
        end
      end
    
      def user_attributes(attrs = {})
        FactoryGirl.attributes_for :user, attrs
      end
    
    end