xednese 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|