Retrospring/spec/models/user_spec.rb

218 lines
6.8 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
2022-01-17 10:23:39 -08:00
require "rails_helper"
2014-11-14 11:45:30 -08:00
RSpec.describe User, type: :model do
let!(:me) { FactoryBot.create :user }
2022-01-17 10:23:39 -08:00
describe "basic assigns" do
before :each do
@user = User.new(
2022-01-17 10:23:39 -08:00
screen_name: "FunnyMeme2004",
password: "y_u_no_secure_password?",
email: "nice.meme@nsa.gov"
)
2021-12-28 06:09:22 -08:00
Profile.new(user: @user)
end
subject { @user }
2014-12-07 02:33:26 -08:00
it { should respond_to(:email) }
2014-12-07 02:33:26 -08:00
2022-01-17 10:23:39 -08:00
it "#email returns a string" do
expect(@user.email).to match "nice.meme@nsa.gov"
end
2014-12-07 02:33:26 -08:00
2022-01-17 10:23:39 -08:00
it "#motivation_header has a default value" do
expect(@user.profile.motivation_header).to match ""
end
2022-01-17 10:23:39 -08:00
it "does not save an invalid screen name" do
@user.screen_name = "$Funny-Meme-%&2004"
expect { @user.save! }.to raise_error(ActiveRecord::RecordInvalid)
end
2014-12-07 02:33:26 -08:00
end
2022-01-17 10:23:39 -08:00
describe "email validation" do
subject do
FactoryBot.build(:user, email: email).tap(&:validate).errors[:email]
end
2022-01-17 10:23:39 -08:00
shared_examples_for "valid email" do |example_email|
context "when email is #{example_email}" do
let(:email) { example_email }
it "does not have validation errors" do
expect(subject).to be_empty
end
end
end
2022-01-17 10:23:39 -08:00
shared_examples_for "invalid email" do |example_email|
context "when email is #{example_email}" do
let(:email) { example_email }
it "has validation errors" do
expect(subject).not_to be_empty
end
end
end
2022-01-17 10:23:39 -08:00
include_examples "valid email", "ifyouusethismailyouarebanned@nilsding.org"
include_examples "valid email", "fritz.fantom@gmail.com"
include_examples "valid email", "fritz.fantom@columbiamail.co"
include_examples "valid email", "fritz.fantom@protonmail.com"
include_examples "valid email", "fritz.fantom@example.email"
2022-01-17 10:23:39 -08:00
include_examples "valid email", "fritz.fantom@enterprise.k8s.420stripes.k8s.needs.more.k8s.jira.atlassian.k8s.eu-central-1.s3.amazonaws.com"
include_examples "invalid email", "@jack"
# examples from the real world:
# .con is not a valid TLD
2022-01-17 10:23:39 -08:00
include_examples "invalid email", "fritz.fantom@gmail.con"
include_examples "invalid email", "fritz.fantom@protonmail.con"
# neither is .coom
2022-01-17 10:23:39 -08:00
include_examples "invalid email", "fritz.fantom@gmail.coom"
# nor .mail (.email is, however)
include_examples "invalid email", "fritz.fantom@proton.mail"
# common typos:
2022-01-17 10:23:39 -08:00
include_examples "invalid email", "fritz.fantom@fmail.com"
include_examples "invalid email", "fritz.fantom@gemail.com"
include_examples "invalid email", "fritz.fantom@gmail.co"
include_examples "invalid email", "fritz.fantom@gmailcom"
include_examples "invalid email", "fritz.fantom@gmaile.com"
include_examples "invalid email", "fritz.fantom@gmaill.com"
include_examples "invalid email", "fritz.fantom@gmali.com"
2022-01-17 10:23:39 -08:00
include_examples "invalid email", "fritz.fantom@hotmailcom"
include_examples "invalid email", "fritz.fantom@hotmaill.com"
2022-01-17 10:23:39 -08:00
include_examples "invalid email", "fritz.fantom@icluod.com"
# no TLD
2022-01-17 10:23:39 -08:00
include_examples "invalid email", "fritz.fantom@gmail"
include_examples "invalid email", "fritz.fantom@protonmail"
end
# -- User::TimelineMethods --
2022-01-17 10:23:39 -08:00
shared_examples_for "result is blank" do
it "result is blank" do
expect(subject).to be_blank
end
2014-12-07 02:33:26 -08:00
end
2022-01-17 10:23:39 -08:00
describe "#timeline" do
subject { me.timeline }
2022-01-17 10:23:39 -08:00
context "user answered nothing and is not following anyone" do
include_examples "result is blank"
end
2022-01-17 10:23:39 -08:00
context "user answered something and is not following anyone" do
let(:answer) { FactoryBot.create(:answer, user: me) }
let(:expected) { [answer] }
2022-01-17 10:23:39 -08:00
it "includes the answer" do
expect(subject).to eq(expected)
end
end
2022-01-17 10:23:39 -08:00
context "user answered something and follows users with answers" do
let(:user1) { FactoryBot.create(:user) }
let(:user2) { FactoryBot.create(:user) }
let(:answer1) { FactoryBot.create(:answer, user: user1, created_at: 12.hours.ago) }
let(:answer2) { FactoryBot.create(:answer, user: me, created_at: 1.day.ago) }
let(:answer3) { FactoryBot.create(:answer, user: user2, created_at: 10.minutes.ago) }
let(:answer4) { FactoryBot.create(:answer, user: user1, created_at: Time.now.utc) }
let!(:expected) do
[answer4, answer3, answer1, answer2]
end
before(:each) do
me.follow(user1)
me.follow(user2)
end
2022-01-17 10:23:39 -08:00
it "includes all answers" do
expect(subject).to include(answer1)
expect(subject).to include(answer2)
expect(subject).to include(answer3)
expect(subject).to include(answer4)
end
2022-01-17 10:23:39 -08:00
it "result is ordered by created_at in reverse order" do
expect(subject).to eq(expected)
end
end
end
2022-01-17 10:23:39 -08:00
describe "#cursored_timeline" do
let(:last_id) { nil }
subject { me.cursored_timeline(last_id: last_id, size: 3) }
2022-01-17 10:23:39 -08:00
context "user answered nothing and is not following anyone" do
include_examples "result is blank"
end
2022-01-17 10:23:39 -08:00
context "user answered something and is not following anyone" do
let(:answer) { FactoryBot.create(:answer, user: me) }
let(:expected) { [answer] }
2022-01-17 10:23:39 -08:00
it "includes the answer" do
expect(subject).to eq(expected)
end
end
2022-01-17 10:23:39 -08:00
context "user answered something and follows users with answers" do
let(:user1) { FactoryBot.create(:user) }
let(:user2) { FactoryBot.create(:user) }
let!(:answer1) { FactoryBot.create(:answer, user: me, created_at: 1.day.ago) }
let!(:answer2) { FactoryBot.create(:answer, user: user1, created_at: 12.hours.ago) }
let!(:answer3) { FactoryBot.create(:answer, user: user2, created_at: 10.minutes.ago) }
let!(:answer4) { FactoryBot.create(:answer, user: user1, created_at: Time.now.utc) }
before(:each) do
me.follow(user1)
me.follow(user2)
end
2022-01-17 10:23:39 -08:00
context "last_id is nil" do
let(:last_id) { nil }
let(:expected) do
[answer4, answer3, answer2]
end
2022-01-17 10:23:39 -08:00
it "includes three answers" do
expect(subject).not_to include(answer1)
expect(subject).to include(answer2)
expect(subject).to include(answer3)
expect(subject).to include(answer4)
end
2022-01-17 10:23:39 -08:00
it "result is ordered by created_at in reverse order" do
expect(subject).to eq(expected)
end
end
2022-01-17 10:23:39 -08:00
context "last_id is answer2.id" do
let(:last_id) { answer2.id }
2022-01-17 10:23:39 -08:00
it "includes answer1" do
expect(subject).to include(answer1)
expect(subject).not_to include(answer2)
expect(subject).not_to include(answer3)
expect(subject).not_to include(answer4)
end
end
2022-01-17 10:23:39 -08:00
context "last_id is answer1.id" do
let(:last_id) { answer1.id }
2022-01-17 10:23:39 -08:00
include_examples "result is blank"
end
end
2014-12-07 02:33:26 -08:00
end
2014-11-14 11:45:30 -08:00
end