require "rails_helper" RSpec.describe RetiredToken, type: :model do let(:user) { User.create!(email: "test@example.com", password: "123456", password_confirmation: "123456") } describe "validations" do it "requires jti" do token = RetiredToken.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 = RetiredToken.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 RetiredToken.create!(user: user, jti: jti, exp: 1.hour.from_now) duplicate = RetiredToken.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 ".retired?" do it "returns true for retired tokens" do jti = SecureRandom.uuid RetiredToken.create!(user: user, jti: jti, exp: 1.hour.from_now) expect(RetiredToken.retired?(jti)).to be true end it "returns false for non-retired tokens" do expect(RetiredToken.retired?("non-existent-jti")).to be false end end describe ".cleanup_expired" do it "removes expired tokens" do expired_token = RetiredToken.create!(user: user, jti: SecureRandom.uuid, exp: 1.day.ago) valid_token = RetiredToken.create!(user: user, jti: SecureRandom.uuid, exp: 1.hour.from_now) expect { RetiredToken.cleanup_expired }.to change { RetiredToken.count }.by(-1) expect(RetiredToken.exists?(expired_token.id)).to be false expect(RetiredToken.exists?(valid_token.id)).to be true end end end