You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
asciinema.org/spec/services/email_login_service_spec.rb

100 lines
2.3 KiB
Ruby

require 'rails_helper'
describe EmailLoginService do
let(:creator) { described_class.new }
describe "#login" do
subject { creator.login(email) }
let(:email) { "me@example.com" }
context "when given email is blank" do
let(:email) { nil }
it "returns false" do
expect(subject).to be(false)
end
end
context "when given email is invalid" do
let(:email) { "oops" }
it "returns false" do
expect(subject).to be(false)
end
end
context "when there's no user with given email" do
it "creates a user with given email" do
expect { subject }.to change(User, :count).by(1)
expect(User.last.email).to eq("me@example.com")
end
it "creates an expiring token for new user" do
expect { subject }.to change(ExpiringToken, :count).by(1)
expect(ExpiringToken.last.user).to eq(User.last)
end
it "sends login email" do
expect(Notifications).to receive(:delay_login_request)
subject
end
it "returns true" do
expect(subject).to be(true)
end
end
context "when there's a user with given email" do
let!(:user) { create(:user, email: "me@example.com") }
it "creates an expiring token this user" do
expect { subject }.to change(ExpiringToken, :count).by(1)
expect(ExpiringToken.last.user).to eq(user)
end
it "sends login email" do
expect(Notifications).to receive(:delay_login_request)
subject
end
it "returns true" do
expect(subject).to be(true)
end
end
end
describe "#validate" do
subject { creator.validate(token) }
let(:token) { "the-to-ken" }
context "when given token is valid" do
let!(:expiring_token) { create(:expiring_token, user: user, token: token) }
let(:user) { create(:user) }
it "marks token as used" do
now = Time.now
Timecop.freeze(now) do
subject
end
expect(expiring_token.reload.used_at.to_i).to eq(now.to_i)
end
it "returns user associated with the token" do
expect(subject).to eq(user)
end
end
context "when given token is invalid" do
it "returns nil" do
expect(subject).to be(nil)
end
end
end
end