@ -1,62 +0,0 @@ | |||
# frozen_string_literal: true | |||
# == Schema Information | |||
# | |||
# Table name: subscriptions | |||
# | |||
# id :bigint(8) not null, primary key | |||
# callback_url :string default(""), not null | |||
# secret :string | |||
# expires_at :datetime | |||
# confirmed :boolean default(FALSE), not null | |||
# created_at :datetime not null | |||
# updated_at :datetime not null | |||
# last_successful_delivery_at :datetime | |||
# domain :string | |||
# account_id :bigint(8) not null | |||
# | |||
class Subscription < ApplicationRecord | |||
MIN_EXPIRATION = 1.day.to_i | |||
MAX_EXPIRATION = 30.days.to_i | |||
belongs_to :account | |||
validates :callback_url, presence: true | |||
validates :callback_url, uniqueness: { scope: :account_id } | |||
scope :confirmed, -> { where(confirmed: true) } | |||
scope :future_expiration, -> { where(arel_table[:expires_at].gt(Time.now.utc)) } | |||
scope :expired, -> { where(arel_table[:expires_at].lt(Time.now.utc)) } | |||
scope :active, -> { confirmed.future_expiration } | |||
def lease_seconds=(value) | |||
self.expires_at = future_expiration(value) | |||
end | |||
def lease_seconds | |||
(expires_at - Time.now.utc).to_i | |||
end | |||
def expired? | |||
Time.now.utc > expires_at | |||
end | |||
before_validation :set_min_expiration | |||
private | |||
def future_expiration(value) | |||
Time.now.utc + future_offset(value).seconds | |||
end | |||
def future_offset(seconds) | |||
[ | |||
[MIN_EXPIRATION, seconds.to_i].max, | |||
MAX_EXPIRATION, | |||
].min | |||
end | |||
def set_min_expiration | |||
self.lease_seconds = 0 unless expires_at | |||
end | |||
end |
@ -1,7 +0,0 @@ | |||
# frozen_string_literal: true | |||
class SubscriptionPolicy < ApplicationPolicy | |||
def index? | |||
admin? | |||
end | |||
end |
@ -0,0 +1,11 @@ | |||
# frozen_string_literal: true | |||
class DropSubscriptions < ActiveRecord::Migration[5.2] | |||
def up | |||
drop_table :subscriptions | |||
end | |||
def down | |||
raise ActiveRecord::IrreversibleMigration | |||
end | |||
end |
@ -1,7 +0,0 @@ | |||
Fabricator(:subscription) do | |||
account | |||
callback_url "http://example.com/callback" | |||
secret "foobar" | |||
expires_at "2016-11-28 11:30:07" | |||
confirmed false | |||
end |
@ -1,67 +0,0 @@ | |||
require 'rails_helper' | |||
RSpec.describe Subscription, type: :model do | |||
let(:alice) { Fabricate(:account, username: 'alice') } | |||
subject { Fabricate(:subscription, account: alice) } | |||
describe '#expired?' do | |||
it 'return true when expires_at is past' do | |||
subject.expires_at = 2.days.ago | |||
expect(subject.expired?).to be true | |||
end | |||
it 'return false when expires_at is future' do | |||
subject.expires_at = 2.days.from_now | |||
expect(subject.expired?).to be false | |||
end | |||
end | |||
describe 'lease_seconds' do | |||
it 'returns the time remaining until expiration' do | |||
datetime = 1.day.from_now | |||
subscription = Subscription.new(expires_at: datetime) | |||
travel_to(datetime - 12.hours) do | |||
expect(subscription.lease_seconds).to eq(12.hours) | |||
end | |||
end | |||
end | |||
describe 'lease_seconds=' do | |||
it 'sets expires_at to min expiration when small value is provided' do | |||
subscription = Subscription.new | |||
datetime = 1.day.from_now | |||
too_low = Subscription::MIN_EXPIRATION - 1000 | |||
travel_to(datetime) do | |||
subscription.lease_seconds = too_low | |||
end | |||
expected = datetime + Subscription::MIN_EXPIRATION.seconds | |||
expect(subscription.expires_at).to be_within(1.0).of(expected) | |||
end | |||
it 'sets expires_at to value when valid value is provided' do | |||
subscription = Subscription.new | |||
datetime = 1.day.from_now | |||
valid = Subscription::MIN_EXPIRATION + 1000 | |||
travel_to(datetime) do | |||
subscription.lease_seconds = valid | |||
end | |||
expected = datetime + valid.seconds | |||
expect(subscription.expires_at).to be_within(1.0).of(expected) | |||
end | |||
it 'sets expires_at to max expiration when large value is provided' do | |||
subscription = Subscription.new | |||
datetime = 1.day.from_now | |||
too_high = Subscription::MAX_EXPIRATION + 1000 | |||
travel_to(datetime) do | |||
subscription.lease_seconds = too_high | |||
end | |||
expected = datetime + Subscription::MAX_EXPIRATION.seconds | |||
expect(subscription.expires_at).to be_within(1.0).of(expected) | |||
end | |||
end | |||
end |
@ -1,24 +0,0 @@ | |||
# frozen_string_literal: true | |||
require 'rails_helper' | |||
require 'pundit/rspec' | |||
RSpec.describe SubscriptionPolicy do | |||
let(:subject) { described_class } | |||
let(:admin) { Fabricate(:user, admin: true).account } | |||
let(:john) { Fabricate(:user).account } | |||
permissions :index? do | |||
context 'admin?' do | |||
it 'permits' do | |||
expect(subject).to permit(admin, Subscription) | |||
end | |||
end | |||
context '!admin?' do | |||
it 'denies' do | |||
expect(subject).to_not permit(john, Subscription) | |||
end | |||
end | |||
end | |||
end |