xednese 0.0.1 → 0.1.0

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