Skip to content

Commit 9a9333f

Browse files
authored
Merge pull request #11 from userlist/messages
Add support for transactional messages endpoints
2 parents d0bac7a + ea979f1 commit 9a9333f

7 files changed

Lines changed: 106 additions & 1 deletion

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

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

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

Gemfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ gem 'rubocop', '~> 1.45'
1111
gem 'sidekiq'
1212
gem 'activejob'
1313
gem 'uri'
14+
gem 'irb'

lib/userlist/push.rb

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,14 @@
1212
require 'userlist/push/company'
1313
require 'userlist/push/relationship'
1414
require 'userlist/push/event'
15+
require 'userlist/push/message'
1516

1617
require 'userlist/push/serializer'
1718

1819
module Userlist
1920
class Push
2021
class << self
21-
[:event, :track, :user, :identify, :company, :users, :events, :companies, :relationships].each do |method|
22+
[:event, :track, :user, :identify, :company, :message, :users, :events, :companies, :relationships, :messages].each do |method|
2223
define_method(method) { |*args| default_push_instance.send(method, *args) }
2324
end
2425

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

56+
def messages
57+
@messages ||= Relation.new(self, Message, [Operations::Create])
58+
end
59+
5560
def event(payload = {})
5661
events.create(payload)
5762
end
@@ -64,6 +69,10 @@ def company(payload = {})
6469
companies.create(payload)
6570
end
6671

72+
def message(payload = {})
73+
messages.create(payload)
74+
end
75+
6776
alias track event
6877
alias identify user
6978
end

lib/userlist/push/message.rb

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
module Userlist
2+
class Push
3+
class Message < Resource
4+
include Operations::Create
5+
6+
has_one :user, type: 'Userlist::Push::User'
7+
8+
def initialize(payload = {}, config = Userlist.config)
9+
raise Userlist::ArgumentError, 'Missing required payload' unless payload
10+
11+
super
12+
end
13+
14+
def push?
15+
super && (user.nil? || user.push?)
16+
end
17+
end
18+
end
19+
end

spec/support/active_job.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
require 'active_job'
22

33
ActiveJob::Base.queue_adapter = :test
4+
ActiveJob::Base.logger = Logger.new(nil)

spec/userlist/push/message_spec.rb

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
require 'spec_helper'
2+
3+
RSpec.describe Userlist::Push::Message do
4+
let(:payload) do
5+
{
6+
template: 'template-identifier',
7+
user: 'user-identifier',
8+
properties: {
9+
value: '$100.00'
10+
}
11+
}
12+
end
13+
14+
subject { described_class.new(payload) }
15+
16+
it 'should raise an error when no payload is given' do
17+
expect { described_class.new(nil) }.to raise_error(Userlist::ArgumentError, /payload/)
18+
end
19+
20+
it 'should be pushable' do
21+
expect(subject.push?).to be_truthy
22+
end
23+
24+
context 'when a user hash is given' do
25+
let(:payload) do
26+
super().merge(
27+
user: {
28+
identifier: 'user-identifier',
29+
email: 'foo@example.com'
30+
}
31+
)
32+
end
33+
34+
it 'should convert it into a user object' do
35+
expect(subject.user).to be_kind_of(Userlist::Push::User)
36+
end
37+
38+
it 'should be pushable' do
39+
expect(subject.push?).to be_truthy
40+
end
41+
end
42+
end

spec/userlist/push_spec.rb

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,4 +160,36 @@
160160
subject.company(payload)
161161
end
162162
end
163+
164+
describe '#messages' do
165+
let(:relation) { subject.messages }
166+
167+
it 'should return a relation' do
168+
expect(relation).to be_an_instance_of(Userlist::Push::Relation)
169+
expect(relation.type).to eq(Userlist::Push::Message)
170+
end
171+
172+
it 'should support the create operation' do
173+
expect(relation).to be_kind_of(Userlist::Push::Operations::Create::ClassMethods)
174+
end
175+
end
176+
177+
describe '#message' do
178+
let(:payload) do
179+
{
180+
template: 'template-identifier',
181+
user: 'user-identifier',
182+
properties: {
183+
value: '$100.00'
184+
}
185+
}
186+
end
187+
188+
let(:relation) { subject.messages }
189+
190+
it 'should delegate the call to the relation\'s create method' do
191+
expect(relation).to receive(:create).with(payload)
192+
subject.message(payload)
193+
end
194+
end
163195
end

0 commit comments

Comments
 (0)