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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -1
  3. data/README.md +22 -3
  4. data/Rakefile +8 -2
  5. data/bin/xednese +16 -0
  6. data/lib/xednese.rb +36 -9
  7. data/lib/xednese/account.rb +37 -0
  8. data/lib/xednese/account/dispatcher.rb +30 -0
  9. data/lib/xednese/account/messages.rb +47 -0
  10. data/lib/xednese/accounts.rb +14 -6
  11. data/lib/xednese/batch.rb +68 -0
  12. data/lib/xednese/batches.rb +33 -0
  13. data/lib/xednese/client.rb +46 -0
  14. data/lib/xednese/messages.rb +24 -0
  15. data/lib/xednese/requests/account.rb +17 -0
  16. data/lib/xednese/requests/batch.rb +17 -0
  17. data/lib/xednese/requests/messages.rb +1 -1
  18. data/lib/xednese/responses/batch.rb +20 -0
  19. data/lib/xednese/responses/batches.rb +15 -0
  20. data/lib/xednese/responses/status.rb +22 -0
  21. data/lib/xednese/users.rb +3 -8
  22. data/lib/xednese/version.rb +1 -1
  23. data/scenarios/accounts/getting_all_accounts.rb +37 -0
  24. data/scenarios/accounts/getting_an_account.rb +29 -0
  25. data/scenarios/helper.rb +113 -0
  26. data/spec/helper.rb +3 -3
  27. data/spec/xednese/{dispatcher_spec.rb → account/dispatcher_spec.rb} +5 -4
  28. data/spec/xednese/account/messages_spec.rb +56 -0
  29. data/spec/xednese/account_spec.rb +93 -0
  30. data/spec/xednese/accounts_spec.rb +19 -14
  31. data/spec/xednese/batch_spec.rb +121 -0
  32. data/spec/xednese/batches_spec.rb +70 -0
  33. data/spec/xednese/client_spec.rb +76 -2
  34. data/spec/xednese/messages_spec.rb +25 -1
  35. data/spec/xednese/requests/account_spec.rb +20 -0
  36. data/spec/xednese/requests/batch_spec.rb +20 -0
  37. data/spec/xednese/requests/messages_spec.rb +1 -1
  38. data/spec/xednese/responses/account_spec.rb +1 -1
  39. data/spec/xednese/responses/accounts_spec.rb +1 -1
  40. data/spec/xednese/responses/batch_spec.rb +83 -0
  41. data/spec/xednese/responses/batches_spec.rb +95 -0
  42. data/spec/xednese/responses/message_dispatcher_headers_spec.rb +1 -1
  43. data/spec/xednese/responses/message_header_spec.rb +1 -1
  44. data/spec/xednese/responses/message_headers_spec.rb +1 -1
  45. data/spec/xednese/responses/status_spec.rb +55 -0
  46. data/spec/xednese/users_spec.rb +1 -12
  47. data/spec/xednese_spec.rb +52 -12
  48. metadata +58 -8
  49. data/lib/xednese/dispatcher.rb +0 -20
@@ -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
@@ -6,7 +6,7 @@ class Esendex
6
6
  end
7
7
 
8
8
  def serialise
9
- Nokogiri::XML::Builder.new(:encoding => 'utf-8') do |xml|
9
+ Nokogiri::XML::Builder.new(encoding: 'utf-8') do |xml|
10
10
  xml.messages {
11
11
  xml.accountreference @args[:account_reference]
12
12
 
@@ -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
@@ -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
@@ -1,3 +1,3 @@
1
1
  class Esendex
2
- VERSION = '0.0.1'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -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
@@ -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
@@ -2,12 +2,12 @@ require 'minitest/autorun'
2
2
  require 'minitest/pride'
3
3
  require 'mocha/mini_test'
4
4
 
5
- require_relative '../lib/xednese'
5
+ require 'xednese'
6
6
 
7
7
  def dummy_esendex
8
- Esendex.new('what', 'when', 'really?')
8
+ Esendex.new('what', 'when')
9
9
  end
10
10
 
11
11
  def dummy_credentials
12
- Esendex::Credentials.new('user', 'pass', 'what?')
12
+ Esendex::Credentials.new('user', 'pass')
13
13
  end
@@ -1,8 +1,9 @@
1
- require_relative '../helper'
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: credentials.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