xednese 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Gemfile +2 -1
- data/README.md +22 -3
- data/Rakefile +8 -2
- data/bin/xednese +16 -0
- data/lib/xednese.rb +36 -9
- data/lib/xednese/account.rb +37 -0
- data/lib/xednese/account/dispatcher.rb +30 -0
- data/lib/xednese/account/messages.rb +47 -0
- data/lib/xednese/accounts.rb +14 -6
- data/lib/xednese/batch.rb +68 -0
- data/lib/xednese/batches.rb +33 -0
- data/lib/xednese/client.rb +46 -0
- data/lib/xednese/messages.rb +24 -0
- data/lib/xednese/requests/account.rb +17 -0
- data/lib/xednese/requests/batch.rb +17 -0
- data/lib/xednese/requests/messages.rb +1 -1
- data/lib/xednese/responses/batch.rb +20 -0
- data/lib/xednese/responses/batches.rb +15 -0
- data/lib/xednese/responses/status.rb +22 -0
- data/lib/xednese/users.rb +3 -8
- data/lib/xednese/version.rb +1 -1
- data/scenarios/accounts/getting_all_accounts.rb +37 -0
- data/scenarios/accounts/getting_an_account.rb +29 -0
- data/scenarios/helper.rb +113 -0
- data/spec/helper.rb +3 -3
- data/spec/xednese/{dispatcher_spec.rb → account/dispatcher_spec.rb} +5 -4
- data/spec/xednese/account/messages_spec.rb +56 -0
- data/spec/xednese/account_spec.rb +93 -0
- data/spec/xednese/accounts_spec.rb +19 -14
- data/spec/xednese/batch_spec.rb +121 -0
- data/spec/xednese/batches_spec.rb +70 -0
- data/spec/xednese/client_spec.rb +76 -2
- data/spec/xednese/messages_spec.rb +25 -1
- data/spec/xednese/requests/account_spec.rb +20 -0
- data/spec/xednese/requests/batch_spec.rb +20 -0
- data/spec/xednese/requests/messages_spec.rb +1 -1
- data/spec/xednese/responses/account_spec.rb +1 -1
- data/spec/xednese/responses/accounts_spec.rb +1 -1
- data/spec/xednese/responses/batch_spec.rb +83 -0
- data/spec/xednese/responses/batches_spec.rb +95 -0
- data/spec/xednese/responses/message_dispatcher_headers_spec.rb +1 -1
- data/spec/xednese/responses/message_header_spec.rb +1 -1
- data/spec/xednese/responses/message_headers_spec.rb +1 -1
- data/spec/xednese/responses/status_spec.rb +55 -0
- data/spec/xednese/users_spec.rb +1 -12
- data/spec/xednese_spec.rb +52 -12
- metadata +58 -8
- data/lib/xednese/dispatcher.rb +0 -20
data/lib/xednese/messages.rb
CHANGED
@@ -2,10 +2,15 @@ class Esendex
|
|
2
2
|
class Messages
|
3
3
|
PAGE_COUNT = 25
|
4
4
|
|
5
|
+
# @see Esendex#messages
|
6
|
+
# @api private
|
5
7
|
def initialize(credentials)
|
6
8
|
@credentials = credentials
|
7
9
|
end
|
8
10
|
|
11
|
+
# @return [Enumerable<Responses::MessageHeader>] an Enumerable that iterates
|
12
|
+
# over all sent messages. Requests are made for fixed size pages when
|
13
|
+
# required.
|
9
14
|
def sent
|
10
15
|
Seq::Paged.new do |page|
|
11
16
|
params = {
|
@@ -19,6 +24,25 @@ class Esendex
|
|
19
24
|
end
|
20
25
|
end
|
21
26
|
|
27
|
+
# @return [Enumerable<Responses::MessageHeader>] an Enumerable that iterates
|
28
|
+
# over all received messages. Requests are made for fixed size pages when
|
29
|
+
# required.
|
30
|
+
def received
|
31
|
+
Seq::Paged.new do |page|
|
32
|
+
params = {
|
33
|
+
startIndex: PAGE_COUNT * page,
|
34
|
+
count: PAGE_COUNT
|
35
|
+
}
|
36
|
+
|
37
|
+
Client.get(@credentials, "v1.0/inbox/messages", params) do |status, data|
|
38
|
+
Responses::MessageHeaders.deserialise(data).message_headers
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param id [String] the id of the message to get
|
44
|
+
# @return [Responses::MessageHeader] the MessageHeader specified by the id
|
45
|
+
# given
|
22
46
|
def get(id)
|
23
47
|
Client.get(@credentials, "v1.0/messageheaders/#{id}") do |status, data|
|
24
48
|
Responses::MessageHeader.deserialise(data)
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Esendex
|
2
|
+
module Requests
|
3
|
+
class Account
|
4
|
+
def initialize(args)
|
5
|
+
@args = args
|
6
|
+
end
|
7
|
+
|
8
|
+
def serialise
|
9
|
+
Nokogiri::XML::Builder.new(encoding: 'utf-8') do |xml|
|
10
|
+
xml.account(xmlns: 'http://api.esendex.com/ns/') {
|
11
|
+
xml.label @args[:label]
|
12
|
+
}
|
13
|
+
end.to_xml
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
class Esendex
|
2
|
+
module Requests
|
3
|
+
class Batch
|
4
|
+
def initialize(args)
|
5
|
+
@args = args
|
6
|
+
end
|
7
|
+
|
8
|
+
def serialise
|
9
|
+
Nokogiri::XML::Builder.new(encoding: 'utf-8') do |xml|
|
10
|
+
xml.messagebatch(xmlns: 'http://api.esendex.com/ns/') {
|
11
|
+
xml.name @args[:name]
|
12
|
+
}
|
13
|
+
end.to_xml
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class Esendex
|
2
|
+
module Responses
|
3
|
+
class Batch
|
4
|
+
extend Serialisable
|
5
|
+
|
6
|
+
root 'messagebatch'
|
7
|
+
|
8
|
+
attribute :id, 'id'
|
9
|
+
|
10
|
+
element :created_at, 'createdat'
|
11
|
+
element :batch_size, 'batchsize', :to_i
|
12
|
+
element :persisted_batch_size, 'persistedbatchsize', :to_i
|
13
|
+
element :account_reference, 'accountreference'
|
14
|
+
element :created_by, 'createdby'
|
15
|
+
element :name, 'name'
|
16
|
+
|
17
|
+
element :status, Status
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Esendex
|
2
|
+
module Responses
|
3
|
+
class Batches
|
4
|
+
extend Serialisable
|
5
|
+
|
6
|
+
root 'messagebatches'
|
7
|
+
|
8
|
+
attribute :start_index, 'startindex', :to_i
|
9
|
+
attribute :count, 'count', :to_i
|
10
|
+
attribute :total_count, 'totalcount', :to_i
|
11
|
+
|
12
|
+
elements :batches, Batch
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class Esendex
|
2
|
+
module Responses
|
3
|
+
class Status
|
4
|
+
extend Serialisable
|
5
|
+
|
6
|
+
root 'status'
|
7
|
+
|
8
|
+
element :acknowledged, 'acknowledged', :to_i
|
9
|
+
element :authorisation_failed, 'authorisationfailed', :to_i
|
10
|
+
element :connecting, 'connecting', :to_i
|
11
|
+
element :delivered, 'delivered', :to_i
|
12
|
+
element :failed, 'failed', :to_i
|
13
|
+
element :partially_delivered, 'partiallydelivered', :to_i
|
14
|
+
element :rejected, 'rejected', :to_i
|
15
|
+
element :scheduled, 'scheduled', :to_i
|
16
|
+
element :sent, 'sent', :to_i
|
17
|
+
element :submitted, 'submitted', :to_i
|
18
|
+
element :validity_period_expired, 'validityperiodexpired', :to_i
|
19
|
+
element :cancelled, 'cancelled', :to_i
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/xednese/users.rb
CHANGED
@@ -1,15 +1,10 @@
|
|
1
1
|
class Esendex
|
2
2
|
class Users
|
3
|
+
|
4
|
+
# @see Esendex#users
|
5
|
+
# @api private
|
3
6
|
def initialize(credentials)
|
4
7
|
@credentials = credentials
|
5
8
|
end
|
6
|
-
|
7
|
-
def username
|
8
|
-
@credentials.username
|
9
|
-
end
|
10
|
-
|
11
|
-
def password
|
12
|
-
@credentials.password
|
13
|
-
end
|
14
9
|
end
|
15
10
|
end
|
data/lib/xednese/version.rb
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe 'getting all of my accounts' do
|
4
|
+
let(:username) { String.generate }
|
5
|
+
let(:password) { String.generate }
|
6
|
+
subject { Esendex.new(username, password) }
|
7
|
+
|
8
|
+
let(:accounts) { (0..100).map { Account.generate } }
|
9
|
+
|
10
|
+
let(:response_body) {
|
11
|
+
<<EOS
|
12
|
+
<?xml version="1.0" encoding="utf-8"?>
|
13
|
+
<accounts xmlns="http://api.esendex.com/ns/">
|
14
|
+
#{accounts.map {|a| a.to_xml(true) }.join("\n")}
|
15
|
+
</accounts>
|
16
|
+
EOS
|
17
|
+
}
|
18
|
+
|
19
|
+
before {
|
20
|
+
stub_request(:get, "https://#{username}:#{password}@api.esendex.com/v1.0/accounts?")
|
21
|
+
.with(headers: {"User-Agent" => Esendex::Client::USER_AGENT})
|
22
|
+
.to_return(status: 200, body: response_body)
|
23
|
+
}
|
24
|
+
|
25
|
+
it 'returns an Enumerable that iterates over my accounts' do
|
26
|
+
subject.accounts.entries.zip(accounts) do |returned, expected|
|
27
|
+
returned.id.must_equal expected.id
|
28
|
+
returned.reference.must_equal expected.reference
|
29
|
+
returned.label.must_equal expected.label
|
30
|
+
returned.address.must_equal expected.address
|
31
|
+
returned.type.must_equal expected.type
|
32
|
+
returned.messages_remaining.must_equal expected.messagesremaining
|
33
|
+
returned.expires_on.must_equal expected.expireson
|
34
|
+
returned.role.must_equal expected.role
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe 'getting an account' do
|
4
|
+
let(:username) { String.generate }
|
5
|
+
let(:password) { String.generate }
|
6
|
+
subject { Esendex.new(username, password) }
|
7
|
+
|
8
|
+
let(:account) { Account.generate }
|
9
|
+
let(:response_body) { account.to_xml }
|
10
|
+
|
11
|
+
before {
|
12
|
+
stub_request(:get, "https://#{username}:#{password}@api.esendex.com/v1.0/accounts/#{account.id}?")
|
13
|
+
.with(headers: {"User-Agent" => Esendex::Client::USER_AGENT})
|
14
|
+
.to_return(status: 200, body: response_body)
|
15
|
+
}
|
16
|
+
|
17
|
+
it 'returns an Enumerable that iterates over my accounts' do
|
18
|
+
returned = subject.accounts.get(account.id)
|
19
|
+
|
20
|
+
returned.id.must_equal account.id
|
21
|
+
returned.reference.must_equal account.reference
|
22
|
+
returned.label.must_equal account.label
|
23
|
+
returned.address.must_equal account.address
|
24
|
+
returned.type.must_equal account.type
|
25
|
+
returned.messages_remaining.must_equal account.messagesremaining
|
26
|
+
returned.expires_on.must_equal account.expireson
|
27
|
+
returned.role.must_equal account.role
|
28
|
+
end
|
29
|
+
end
|
data/scenarios/helper.rb
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'minitest/pride'
|
3
|
+
require 'webmock/minitest'
|
4
|
+
require 'xednese'
|
5
|
+
|
6
|
+
class String
|
7
|
+
def self.generate(length = 25)
|
8
|
+
chs = ('a'..'z').to_a + ('0'..'9').to_a + ('A'..'Z').to_a
|
9
|
+
(0..length).map { chs[rand(chs.size)] }.join('')
|
10
|
+
end
|
11
|
+
|
12
|
+
def pad(with, to)
|
13
|
+
(with * (to - size)) + self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Uri
|
18
|
+
def self.generate
|
19
|
+
"https://#{String.generate(3)}.#{String.generate(15)}.com/#{String.generate(10)}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class AccountReference
|
24
|
+
def self.generate
|
25
|
+
"EX" + rand(1e6).to_s.pad("0", 6)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class Guid
|
30
|
+
def self.generate
|
31
|
+
SecureRandom.uuid
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
class PhoneNumber
|
36
|
+
def self.generate
|
37
|
+
"44" + rand(1e9).to_s.pad("0", 9)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class Int
|
42
|
+
def self.generate(max = 1e6)
|
43
|
+
rand(max)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class Time
|
48
|
+
def self.generate
|
49
|
+
Time.at(628232400 + Int.generate(1e12))
|
50
|
+
end
|
51
|
+
|
52
|
+
def format
|
53
|
+
strftime("%FT%Tz")
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class Account
|
58
|
+
def self.generate
|
59
|
+
new id: Guid.generate,
|
60
|
+
uri: Uri.generate,
|
61
|
+
reference: AccountReference.generate,
|
62
|
+
label: String.generate,
|
63
|
+
address: PhoneNumber.generate,
|
64
|
+
type: String.generate,
|
65
|
+
messagesremaining: Int.generate,
|
66
|
+
expireson: Time.generate.format,
|
67
|
+
role: String.generate,
|
68
|
+
settingsuri: Uri.generate
|
69
|
+
end
|
70
|
+
|
71
|
+
def initialize(hsh)
|
72
|
+
@hsh = hsh
|
73
|
+
end
|
74
|
+
|
75
|
+
def to_xml(partial = false)
|
76
|
+
if partial
|
77
|
+
<<EOS
|
78
|
+
<account id="#{id}" uri="#{uri}">
|
79
|
+
<reference>#{reference}</reference>
|
80
|
+
<label>#{label}</label>
|
81
|
+
<address>#{address}</address>
|
82
|
+
<type>#{type}</type>
|
83
|
+
<messagesremaining>#{messagesremaining}</messagesremaining>
|
84
|
+
<expireson>#{expireson}</expireson>
|
85
|
+
<role>#{role}</role>
|
86
|
+
<settings uri="#{settingsuri}" />
|
87
|
+
</account>
|
88
|
+
EOS
|
89
|
+
else
|
90
|
+
<<EOS
|
91
|
+
<?xml version="1.0" encoding="utf-8"?>
|
92
|
+
<account id="#{id}" uri="#{uri}" xmlns="http://api.esendex.com/ns/">
|
93
|
+
<reference>#{reference}</reference>
|
94
|
+
<label>#{label}</label>
|
95
|
+
<address>#{address}</address>
|
96
|
+
<type>#{type}</type>
|
97
|
+
<messagesremaining>#{messagesremaining}</messagesremaining>
|
98
|
+
<expireson>#{expireson}</expireson>
|
99
|
+
<role>#{role}</role>
|
100
|
+
<settings uri="#{settingsuri}" />
|
101
|
+
</account>
|
102
|
+
EOS
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def method_missing(sym, *args)
|
107
|
+
if @hsh.has_key?(sym)
|
108
|
+
return @hsh[sym]
|
109
|
+
end
|
110
|
+
|
111
|
+
super
|
112
|
+
end
|
113
|
+
end
|
data/spec/helper.rb
CHANGED
@@ -2,12 +2,12 @@ require 'minitest/autorun'
|
|
2
2
|
require 'minitest/pride'
|
3
3
|
require 'mocha/mini_test'
|
4
4
|
|
5
|
-
|
5
|
+
require 'xednese'
|
6
6
|
|
7
7
|
def dummy_esendex
|
8
|
-
Esendex.new('what', 'when'
|
8
|
+
Esendex.new('what', 'when')
|
9
9
|
end
|
10
10
|
|
11
11
|
def dummy_credentials
|
12
|
-
Esendex::Credentials.new('user', 'pass'
|
12
|
+
Esendex::Credentials.new('user', 'pass')
|
13
13
|
end
|
@@ -1,8 +1,9 @@
|
|
1
|
-
|
1
|
+
require 'helper'
|
2
2
|
|
3
|
-
describe Esendex::Dispatcher do
|
3
|
+
describe Esendex::Account::Dispatcher do
|
4
|
+
let(:reference) { mock }
|
4
5
|
let(:credentials) { dummy_credentials }
|
5
|
-
subject { Esendex::Dispatcher.new(credentials) }
|
6
|
+
subject { Esendex::Account::Dispatcher.new(credentials, reference) }
|
6
7
|
|
7
8
|
describe '.send' do
|
8
9
|
let(:body) { 'Hey I am message' }
|
@@ -13,7 +14,7 @@ describe Esendex::Dispatcher do
|
|
13
14
|
|
14
15
|
before {
|
15
16
|
args = {
|
16
|
-
account_reference:
|
17
|
+
account_reference: reference,
|
17
18
|
messages: [{ to: to, body: body }]
|
18
19
|
}
|
19
20
|
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
describe Esendex::Account::Messages do
|
4
|
+
let(:credentials) { dummy_credentials }
|
5
|
+
let(:reference) { "EX00000" }
|
6
|
+
subject { Esendex::Account::Messages.new(credentials, reference) }
|
7
|
+
|
8
|
+
describe '#sent' do
|
9
|
+
let(:xml) { "Hey I'm xml" }
|
10
|
+
let(:first_message) { Object.new }
|
11
|
+
let(:parsed_messages) { stub(message_headers: [first_message]) }
|
12
|
+
|
13
|
+
before {
|
14
|
+
Esendex::Client
|
15
|
+
.expects(:get)
|
16
|
+
.with(credentials, 'v1.0/messageheaders',
|
17
|
+
startIndex: 0, count: 25, accountReference: reference)
|
18
|
+
.yields(200, xml)
|
19
|
+
.returns(parsed_messages.message_headers)
|
20
|
+
|
21
|
+
Esendex::Responses::MessageHeaders
|
22
|
+
.expects(:deserialise)
|
23
|
+
.with(xml)
|
24
|
+
.returns(parsed_messages)
|
25
|
+
}
|
26
|
+
|
27
|
+
it 'returns the messages sent by the user on the account' do
|
28
|
+
sent = subject.sent
|
29
|
+
sent.first.must_equal first_message
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#received' do
|
34
|
+
let(:xml) { "Hey I'm xml" }
|
35
|
+
let(:first_message) { mock }
|
36
|
+
let(:parsed_messages) { stub(message_headers: [first_message]) }
|
37
|
+
|
38
|
+
before {
|
39
|
+
Esendex::Client
|
40
|
+
.expects(:get)
|
41
|
+
.with(credentials, "v1.0/inbox/#{reference}/messages", startIndex: 0, count: 25)
|
42
|
+
.yields(200, xml)
|
43
|
+
.returns(parsed_messages.message_headers)
|
44
|
+
|
45
|
+
Esendex::Responses::MessageHeaders
|
46
|
+
.expects(:deserialise)
|
47
|
+
.with(xml)
|
48
|
+
.returns(parsed_messages)
|
49
|
+
}
|
50
|
+
|
51
|
+
it 'returns the messages received by the user on the account' do
|
52
|
+
received = subject.received
|
53
|
+
received.first.must_equal first_message
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|