Initial commit
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
require "rails_helper"
|
||||
|
||||
RSpec.describe BlacklistedToken, type: :model do
|
||||
let(:user) { User.create!(email: "test@example.com", password: "123456", password_confirmation: "123456") }
|
||||
|
||||
describe "validations" do
|
||||
it "requires jti" do
|
||||
token = BlacklistedToken.new(user: user, exp: 1.hour.from_now)
|
||||
expect(token.valid?).to be false
|
||||
expect(token.errors[:jti]).to include("can't be blank")
|
||||
end
|
||||
|
||||
it "requires exp" do
|
||||
token = BlacklistedToken.new(user: user, jti: SecureRandom.uuid)
|
||||
expect(token.valid?).to be false
|
||||
expect(token.errors[:exp]).to include("can't be blank")
|
||||
end
|
||||
|
||||
it "requires unique jti" do
|
||||
jti = SecureRandom.uuid
|
||||
BlacklistedToken.create!(user: user, jti: jti, exp: 1.hour.from_now)
|
||||
|
||||
duplicate = BlacklistedToken.new(user: user, jti: jti, exp: 1.hour.from_now)
|
||||
expect(duplicate.valid?).to be false
|
||||
expect(duplicate.errors[:jti]).to include("has already been taken")
|
||||
end
|
||||
end
|
||||
|
||||
describe ".blacklisted?" do
|
||||
it "returns true for blacklisted tokens" do
|
||||
jti = SecureRandom.uuid
|
||||
BlacklistedToken.create!(user: user, jti: jti, exp: 1.hour.from_now)
|
||||
|
||||
expect(BlacklistedToken.blacklisted?(jti)).to be true
|
||||
end
|
||||
|
||||
it "returns false for non-blacklisted tokens" do
|
||||
expect(BlacklistedToken.blacklisted?("non-existent-jti")).to be false
|
||||
end
|
||||
end
|
||||
|
||||
describe ".cleanup_expired" do
|
||||
it "removes expired tokens" do
|
||||
expired_token = BlacklistedToken.create!(user: user, jti: SecureRandom.uuid, exp: 1.day.ago)
|
||||
valid_token = BlacklistedToken.create!(user: user, jti: SecureRandom.uuid, exp: 1.hour.from_now)
|
||||
|
||||
expect {
|
||||
BlacklistedToken.cleanup_expired
|
||||
}.to change { BlacklistedToken.count }.by(-1)
|
||||
|
||||
expect(BlacklistedToken.exists?(expired_token.id)).to be false
|
||||
expect(BlacklistedToken.exists?(valid_token.id)).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,71 @@
|
||||
require "rails_helper"
|
||||
|
||||
RSpec.describe RefreshToken, type: :model do
|
||||
let(:user) { User.create!(email: "test@example.com", password: "123456", password_confirmation: "123456") }
|
||||
|
||||
describe "validations" do
|
||||
it "generates token automatically" do
|
||||
token = RefreshToken.create!(user: user)
|
||||
expect(token.token).to be_present
|
||||
end
|
||||
|
||||
it "sets expiration automatically" do
|
||||
token = RefreshToken.create!(user: user)
|
||||
expect(token.expires_at).to be_present
|
||||
expect(token.expires_at).to be > Time.current
|
||||
end
|
||||
|
||||
it "requires unique token" do
|
||||
token1 = RefreshToken.create!(user: user)
|
||||
token2 = RefreshToken.new(user: user, token: token1.token, expires_at: 7.days.from_now)
|
||||
|
||||
expect(token2.valid?).to be false
|
||||
expect(token2.errors[:token]).to include("has already been taken")
|
||||
end
|
||||
end
|
||||
|
||||
describe "#active?" do
|
||||
it "returns true for non-revoked, non-expired tokens" do
|
||||
token = RefreshToken.create!(user: user)
|
||||
expect(token.active?).to be true
|
||||
end
|
||||
|
||||
it "returns false for revoked tokens" do
|
||||
token = RefreshToken.create!(user: user, revoked: true)
|
||||
expect(token.active?).to be false
|
||||
end
|
||||
|
||||
it "returns false for expired tokens" do
|
||||
token = RefreshToken.create!(user: user, expires_at: 1.day.ago)
|
||||
expect(token.active?).to be false
|
||||
end
|
||||
end
|
||||
|
||||
describe "#revoke!" do
|
||||
it "marks token as revoked" do
|
||||
token = RefreshToken.create!(user: user)
|
||||
expect(token.revoked).to be false
|
||||
|
||||
token.revoke!
|
||||
expect(token.revoked).to be true
|
||||
end
|
||||
end
|
||||
|
||||
describe ".cleanup_old_tokens" do
|
||||
it "removes expired and revoked tokens" do
|
||||
old_expired = RefreshToken.create!(user: user, expires_at: 31.days.ago)
|
||||
old_revoked = RefreshToken.create!(user: user, revoked: true, created_at: 31.days.ago, expires_at: 1.day.from_now)
|
||||
recent_revoked = RefreshToken.create!(user: user, revoked: true, expires_at: 1.day.from_now)
|
||||
valid_token = RefreshToken.create!(user: user)
|
||||
|
||||
expect {
|
||||
RefreshToken.cleanup_old_tokens
|
||||
}.to change { RefreshToken.count }.by(-2)
|
||||
|
||||
expect(RefreshToken.exists?(old_expired.id)).to be false
|
||||
expect(RefreshToken.exists?(old_revoked.id)).to be false
|
||||
expect(RefreshToken.exists?(recent_revoked.id)).to be true
|
||||
expect(RefreshToken.exists?(valid_token.id)).to be true
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user