require "rails_helper" RSpec.describe AccessKey do it "creates a current access key when one does not exist" do expect { described_class.current }.to change(described_class, :count).by(1) expect(described_class.current.raw_key).to be_present end it "matches the submitted raw key" do access_key = described_class.current expect(access_key.matches?(access_key.raw_key)).to be(true) expect(access_key.matches?("wrong-key")).to be(false) end it "rotates the key and invalidates user sessions" do old_key = described_class.current user = create(:user) UserSession.create_for!(user) expect do described_class.rotate! end.to change(described_class, :count).by(1).and change(UserSession, :count).to(0) expect(described_class.current.raw_key).not_to eq(old_key.raw_key) end it "does not auto-rotate when auto rotation is disabled" do access_key = described_class.current access_key.update!(generated_at: 31.days.ago) access_key.disable_auto_rotation! expect do described_class.rotate_if_needed! end.not_to change(described_class, :count) end it "auto-rotates when enabled and expired" do access_key = described_class.current access_key.update!(generated_at: 31.days.ago) expect do described_class.rotate_if_needed! end.to change(described_class, :count).by(1) end it "uses the configured auto rotation frequency" do access_key = described_class.current access_key.update!(generated_at: 10.days.ago, auto_rotation_frequency_days: 7) expect(access_key).to be_expired end end