Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

- Updates ActiveJob Worker to retry on errors with polynomially longer wait times, up to 10 attempts
- Improve internal error handling to rely on exceptions
- Adds support for messages

## v0.9.0 (2024-03-19)

Expand Down
1 change: 1 addition & 0 deletions Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ gem 'rubocop', '~> 1.45'
gem 'sidekiq'
gem 'activejob'
gem 'uri'
gem 'irb'
11 changes: 10 additions & 1 deletion lib/userlist/push.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@
require 'userlist/push/company'
require 'userlist/push/relationship'
require 'userlist/push/event'
require 'userlist/push/message'

require 'userlist/push/serializer'

module Userlist
class Push
class << self
[:event, :track, :user, :identify, :company, :users, :events, :companies, :relationships].each do |method|
[:event, :track, :user, :identify, :company, :message, :users, :events, :companies, :relationships, :messages].each do |method|
define_method(method) { |*args| default_push_instance.send(method, *args) }
end

Expand Down Expand Up @@ -52,6 +53,10 @@ def relationships
@relationships ||= Relation.new(self, Relationship, [Operations::Create, Operations::Delete])
end

def messages
@messages ||= Relation.new(self, Message, [Operations::Create])
end

def event(payload = {})
events.create(payload)
end
Expand All @@ -64,6 +69,10 @@ def company(payload = {})
companies.create(payload)
end

def message(payload = {})
messages.create(payload)
end

alias track event
alias identify user
end
Expand Down
19 changes: 19 additions & 0 deletions lib/userlist/push/message.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
module Userlist
class Push
class Message < Resource
include Operations::Create

has_one :user, type: 'Userlist::Push::User'

def initialize(payload = {}, config = Userlist.config)
raise Userlist::ArgumentError, 'Missing required payload' unless payload

super
end

def push?
super && (user.nil? || user.push?)
end
end
end
end
1 change: 1 addition & 0 deletions spec/support/active_job.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
require 'active_job'

ActiveJob::Base.queue_adapter = :test
ActiveJob::Base.logger = Logger.new(nil)
42 changes: 42 additions & 0 deletions spec/userlist/push/message_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
require 'spec_helper'

RSpec.describe Userlist::Push::Message do
let(:payload) do
{
template: 'template-identifier',
user: 'user-identifier',
properties: {
value: '$100.00'
}
}
end

subject { described_class.new(payload) }

it 'should raise an error when no payload is given' do
expect { described_class.new(nil) }.to raise_error(Userlist::ArgumentError, /payload/)
end

it 'should be pushable' do
expect(subject.push?).to be_truthy
end

context 'when a user hash is given' do
let(:payload) do
super().merge(
user: {
identifier: 'user-identifier',
email: 'foo@example.com'
}
)
end

it 'should convert it into a user object' do
expect(subject.user).to be_kind_of(Userlist::Push::User)
end

it 'should be pushable' do
expect(subject.push?).to be_truthy
end
end
end
32 changes: 32 additions & 0 deletions spec/userlist/push_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -160,4 +160,36 @@
subject.company(payload)
end
end

describe '#messages' do
let(:relation) { subject.messages }

it 'should return a relation' do
expect(relation).to be_an_instance_of(Userlist::Push::Relation)
expect(relation.type).to eq(Userlist::Push::Message)
end

it 'should support the create operation' do
expect(relation).to be_kind_of(Userlist::Push::Operations::Create::ClassMethods)
end
end

describe '#message' do
let(:payload) do
{
template: 'template-identifier',
user: 'user-identifier',
properties: {
value: '$100.00'
}
}
end

let(:relation) { subject.messages }

it 'should delegate the call to the relation\'s create method' do
expect(relation).to receive(:create).with(payload)
subject.message(payload)
end
end
end