FactoryBot.define do
  factory :user do
    sequence(:email) { |n| "user#{n}@example.com" }
    sequence(:display_name) { |n| "User #{n}" }
    pass_crypt Digest::MD5.hexdigest("test")

    # These attributes are not the defaults, but in most tests we want
    # a 'normal' user who can log in without being redirected etc.
    status "active"
    terms_seen true
    data_public true

    trait :with_home_location do
      home_lat { rand(-90.0...90.0) }
      home_lon { rand(-180.0...180.0) }
    end

    trait :pending do
      status "pending"
    end

    trait :active do
      status "active"
    end

    trait :confirmed do
      status "confirmed"
    end

    trait :suspended do
      status "suspended"
    end

    trait :deleted do
      status "deleted"
    end

    factory :moderator_user do
      after(:create) do |user, _evaluator|
        create(:user_role, :role => "moderator", :user => user)
      end
    end

    factory :administrator_user do
      after(:create) do |user, _evaluator|
        create(:user_role, :role => "administrator", :user => user)
      end
    end

    factory :super_user do
      after(:create) do |user, _evaluator|
        UserRole::ALL_ROLES.each do |role|
          create(:user_role, :role => role, :user => user)
        end
      end
    end
  end
end
