ppl 1.23.0 → 1.24.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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +6 -0
  3. data/features/email.feature +38 -1
  4. data/features/phone.feature +21 -0
  5. data/features/step_definitions/ppl_steps.rb +31 -1
  6. data/lib/ppl/adapter/vcard/greencard.rb +8 -2
  7. data/lib/ppl/application/bootstrap.rb +14 -0
  8. data/lib/ppl/command/email.rb +58 -4
  9. data/lib/ppl/command/mutt.rb +2 -2
  10. data/lib/ppl/command/phone.rb +46 -31
  11. data/lib/ppl/entity/email_address.rb +13 -0
  12. data/lib/ppl/entity/phone_number.rb +2 -0
  13. data/lib/ppl/format/address_book/email_addresses.rb +4 -1
  14. data/lib/ppl/format/address_book/mutt_query.rb +1 -1
  15. data/lib/ppl/format/address_book/one_line.rb +10 -1
  16. data/lib/ppl/format/contact/email_addresses.rb +7 -17
  17. data/lib/ppl/format/contact/full.rb +27 -8
  18. data/lib/ppl/format/contact/phone_number.rb +6 -1
  19. data/lib/ppl/format/table.rb +2 -2
  20. data/lib/ppl/service/email_address.rb +37 -0
  21. data/lib/ppl/service/phone_number.rb +40 -0
  22. data/lib/ppl.rb +8 -1
  23. data/ppl.gemspec +2 -2
  24. data/spec/ppl/adapter/vcard/greencard_spec.rb +40 -2
  25. data/spec/ppl/command/email_spec.rb +58 -0
  26. data/spec/ppl/command/mutt_spec.rb +10 -10
  27. data/spec/ppl/command/phone_spec.rb +30 -26
  28. data/spec/ppl/entity/email_address_spec.rb +28 -0
  29. data/spec/ppl/entity/phone_number_spec.rb +6 -0
  30. data/spec/ppl/format/address_book/email_addresses_spec.rb +1 -1
  31. data/spec/ppl/format/address_book/mutt_query_spec.rb +2 -2
  32. data/spec/ppl/format/address_book/one_line_spec.rb +11 -1
  33. data/spec/ppl/format/contact/email_addresses_spec.rb +27 -13
  34. data/spec/ppl/format/contact/full_spec.rb +25 -13
  35. data/spec/ppl/format/contact/phone_number_spec.rb +13 -1
  36. data/spec/ppl/service/email_address_spec.rb +73 -0
  37. data/spec/ppl/service/phone_number_spec.rb +75 -0
  38. metadata +8 -2
@@ -0,0 +1,37 @@
1
+
2
+ class Ppl::Service::EmailAddress
3
+
4
+ attr_writer :storage
5
+
6
+ def add(contact, address, options)
7
+ email_address = Ppl::Entity::EmailAddress.new(address)
8
+ contact.email_addresses << email_address
9
+ update_email_address(contact, email_address, options)
10
+ @storage.save_contact(contact)
11
+ end
12
+
13
+ def update(contact, address, options)
14
+ email_address = contact.email_addresses.find { |e| e.address == address }
15
+ update_email_address(contact, email_address, options)
16
+ @storage.save_contact(contact)
17
+ end
18
+
19
+ def remove(contact, address)
20
+ contact.email_addresses.select! do |email_address|
21
+ email_address.address != address
22
+ end
23
+ @storage.save_contact(contact)
24
+ end
25
+
26
+ private
27
+
28
+ def update_email_address(contact, email_address, options)
29
+ if options[:preferred] == true
30
+ contact.email_addresses.each { |e| e.preferred = (e.address == email_address.address) }
31
+ elsif options[:preferred] == false
32
+ email_address.preferred = false
33
+ end
34
+ end
35
+
36
+ end
37
+
@@ -0,0 +1,40 @@
1
+
2
+ class Ppl::Service::PhoneNumber
3
+
4
+ attr_writer :storage
5
+
6
+ def add(contact, number, options)
7
+ phone_number = Ppl::Entity::PhoneNumber.new(number)
8
+ contact.phone_numbers << phone_number
9
+ update_phone_number(contact, phone_number, options)
10
+ @storage.save_contact(contact)
11
+ end
12
+
13
+ def update(contact, number, options)
14
+ matching_numbers = contact.phone_numbers.select { |p| p.number == number }
15
+ matching_numbers.each { |mn| update_phone_number(contact, mn, options) }
16
+ @storage.save_contact(contact)
17
+ end
18
+
19
+ def remove(contact, number)
20
+ contact.phone_numbers.select! do |phone_number|
21
+ phone_number.number != number
22
+ end
23
+ @storage.save_contact(contact)
24
+ end
25
+
26
+ private
27
+
28
+ def update_phone_number(contact, phone_number, options)
29
+ if options[:type]
30
+ phone_number.type = options[:type]
31
+ end
32
+ if options[:preferred] == true
33
+ contact.phone_numbers.each { |p| p.preferred = (p.number == phone_number.number) }
34
+ elsif options[:preferred] == false
35
+ phone_number.preferred = false
36
+ end
37
+ end
38
+
39
+ end
40
+
data/lib/ppl.rb CHANGED
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Ppl
3
3
 
4
- Version = "1.23.0"
4
+ Version = "1.24.0"
5
5
 
6
6
  module Adapter
7
7
  end
@@ -21,6 +21,9 @@ module Ppl
21
21
  module Format
22
22
  end
23
23
 
24
+ module Service
25
+ end
26
+
24
27
  end
25
28
 
26
29
 
@@ -70,6 +73,7 @@ require "ppl/command/scrape"
70
73
 
71
74
  require "ppl/entity/address_book"
72
75
  require "ppl/entity/contact"
76
+ require "ppl/entity/email_address"
73
77
  require "ppl/entity/phone_number"
74
78
  require "ppl/entity/postal_address"
75
79
 
@@ -104,6 +108,9 @@ require "ppl/format/postal_address"
104
108
  require "ppl/format/postal_address/one_line"
105
109
  require "ppl/format/table"
106
110
 
111
+ require "ppl/service/email_address"
112
+ require "ppl/service/phone_number"
113
+
107
114
  class String
108
115
  alias_method :each, :each_line
109
116
  end
data/ppl.gemspec CHANGED
@@ -2,8 +2,8 @@
2
2
  Gem::Specification.new do |spec|
3
3
 
4
4
  spec.name = "ppl"
5
- spec.version = "1.23.0"
6
- spec.date = "2013-04-21"
5
+ spec.version = "1.24.0"
6
+ spec.date = "2013-04-23"
7
7
 
8
8
  spec.required_ruby_version = ">= 1.9.3"
9
9
 
@@ -19,15 +19,28 @@ describe Ppl::Adapter::Vcard::GreenCard, "#encode" do
19
19
  end
20
20
 
21
21
  it "should encode the contact's email address" do
22
- @contact.email_addresses = ["john@example.org"]
22
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("john@example.org")
23
23
  @adapter.encode(@contact).should include("EMAIL:john@example.org")
24
24
  end
25
25
 
26
+ it "should encode the contact's preferred email address as such" do
27
+ email_address = Ppl::Entity::EmailAddress.new("john@example.org")
28
+ email_address.preferred = true
29
+ @contact.email_addresses << email_address
30
+ @adapter.encode(@contact).should include("EMAIL;TYPE=pref:john@example.org")
31
+ end
32
+
26
33
  it "should encode the contact's phone number" do
27
34
  @contact.phone_numbers << Ppl::Entity::PhoneNumber.new("01234567890")
28
35
  @adapter.encode(@contact).should include("TEL:01234567890")
29
36
  end
30
37
 
38
+ it "should encode the contact's preferred phone number as such" do
39
+ @contact.phone_numbers << Ppl::Entity::PhoneNumber.new("01234567890")
40
+ @contact.phone_numbers[0].preferred = true
41
+ @adapter.encode(@contact).should include("TEL;TYPE=pref:01234567890")
42
+ end
43
+
31
44
  it "should encode the contact's phone number's type" do
32
45
  @contact.phone_numbers << Ppl::Entity::PhoneNumber.new("01234567890", "cell")
33
46
  @adapter.encode(@contact).should include("TEL;TYPE=cell:01234567890")
@@ -137,7 +150,19 @@ describe Ppl::Adapter::Vcard::GreenCard, "#decode" do
137
150
  "END:VCARD",
138
151
  ].join("\n")
139
152
  contact = @adapter.decode(vcard)
140
- contact.email_addresses.first.should eq "home@example.org"
153
+ contact.email_addresses.first.address.should eq "home@example.org"
154
+ end
155
+
156
+ it "should mark preferred email addresses as such" do
157
+ vcard = [
158
+ "BEGIN:VCARD",
159
+ "N:,test",
160
+ "VERSION:3.0",
161
+ "EMAIL;PREF:home@example.org",
162
+ "END:VCARD",
163
+ ].join("\n")
164
+ contact = @adapter.decode(vcard)
165
+ contact.email_addresses.first.preferred.should eq true
141
166
  end
142
167
 
143
168
  it "should decode the contact's phone number" do
@@ -153,6 +178,19 @@ describe Ppl::Adapter::Vcard::GreenCard, "#decode" do
153
178
  phone_number.number.should eq "01234567890"
154
179
  end
155
180
 
181
+ it "should mark preferred phone numbers as such" do
182
+ vcard = [
183
+ "BEGIN:VCARD",
184
+ "N:,test",
185
+ "VERSION:3.0",
186
+ "TEL;TYPE=pref:01234567890",
187
+ "END:VCARD",
188
+ ].join("\n")
189
+ contact = @adapter.decode(vcard)
190
+ phone_number = contact.phone_numbers.first
191
+ phone_number.preferred.should eq true
192
+ end
193
+
156
194
  it "should decode the contact's phone number's type" do
157
195
  vcard = [
158
196
  "BEGIN:VCARD",
@@ -11,5 +11,63 @@ describe Ppl::Command::Email do
11
11
  end
12
12
  end
13
13
 
14
+ describe "#execute" do
15
+
16
+ before(:each) do
17
+ @contact = Ppl::Entity::Contact.new
18
+ @service = double(Ppl::Service::EmailAddress)
19
+ @storage = double(Ppl::Adapter::Storage)
20
+ @input = Ppl::Application::Input.new
21
+ @output = double(Ppl::Application::Output)
22
+ @list_format = double(Ppl::Format::AddressBook)
23
+ @show_format = double(Ppl::Format::Contact)
24
+ @storage.stub(:require_contact).and_return(@contact)
25
+ @storage.stub(:save_contact)
26
+ @command.storage = @storage
27
+ @command.email_service = @service
28
+ @command.list_format = @list_format
29
+ @command.show_format = @show_format
30
+ end
31
+
32
+ it "should list all email addresses by default" do
33
+ @storage.should_receive(:load_address_book).and_return(@address_book)
34
+ @list_format.should_receive(:process).and_return("imagine this is a list")
35
+ @output.should_receive(:line).with("imagine this is a list")
36
+ @command.execute(@input, @output)
37
+ end
38
+
39
+ it "should show a single contact's addresses if one is specified" do
40
+ @input.arguments << "jdoe"
41
+ @storage.should_receive(:require_contact).and_return(@contact)
42
+ @show_format.should_receive(:process).and_return("imagine this is a list")
43
+ @output.should_receive(:line).with("imagine this is a list")
44
+ @command.execute(@input, @output)
45
+ end
46
+
47
+ it "should delegate to the service layer to add a new email address" do
48
+ @input.arguments = ["jdoe", "jdoe@example.org"]
49
+ @storage.should_receive(:require_contact).and_return(@contact)
50
+ @service.should_receive(:add).with(@contact, "jdoe@example.org", @input.options)
51
+ @command.execute(@input, @output)
52
+ end
53
+
54
+ it "should delegate to the service layer to update an existing address" do
55
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("jdoe@example.org")
56
+ @input.arguments = ["jdoe", "jdoe@example.org"]
57
+ @storage.should_receive(:require_contact).and_return(@contact)
58
+ @service.should_receive(:update).with(@contact, "jdoe@example.org", {})
59
+ @command.execute(@input, @output)
60
+ end
61
+
62
+ it "should delegate to the service layer to remove an email address" do
63
+ @input.arguments = ["jdoe", "jdoe@example.org"]
64
+ @input.options[:delete] = true
65
+ @storage.should_receive(:require_contact).and_return(@contact)
66
+ @service.should_receive(:remove).with(@contact, "jdoe@example.org")
67
+ @command.execute(@input, @output)
68
+ end
69
+
70
+ end
71
+
14
72
  end
15
73
 
@@ -37,7 +37,7 @@ describe Ppl::Command::Mutt do
37
37
  it "should return email address matches" do
38
38
 
39
39
  @contact.name = "Test User"
40
- @contact.email_addresses.push "test@example.org"
40
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("test@example.org")
41
41
  @address_book.contacts.push(@contact)
42
42
 
43
43
  @input.arguments.push "example"
@@ -55,13 +55,13 @@ describe Ppl::Command::Mutt do
55
55
  @input.arguments.push "prova"
56
56
  @contact.name = "Test User"
57
57
 
58
- @contact.email_addresses.push "test@test.org"
59
- @contact.email_addresses.push "prova@prova.org"
58
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("test@test.org")
59
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("prova@prova.org")
60
60
  @address_book.contacts.push(@contact)
61
61
  @storage.stub(:load_address_book).and_return(@address_book)
62
62
  @format.should_receive(:process) do |address_book|
63
63
  address_book.contacts[0].email_addresses.length.should eq 1
64
- address_book.contacts[0].email_addresses[0].should eq "prova@prova.org"
64
+ address_book.contacts[0].email_addresses[0].address.should eq "prova@prova.org"
65
65
  end
66
66
  @output.stub(:line)
67
67
  @command.execute(@input, @output)
@@ -70,7 +70,7 @@ describe Ppl::Command::Mutt do
70
70
  it "should return name matches" do
71
71
 
72
72
  @contact.name = "Test User"
73
- @contact.email_addresses.push "test@example.org"
73
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("test@example.org")
74
74
  @address_book.contacts.push(@contact)
75
75
 
76
76
  @input.arguments.push "User"
@@ -89,8 +89,8 @@ describe Ppl::Command::Mutt do
89
89
  @input.arguments.push "org"
90
90
 
91
91
  @contact.name = "Test User"
92
- @contact.email_addresses.push "test@test.org"
93
- @contact.email_addresses.push "prova@prova.org"
92
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("test@test.org")
93
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("prova@prova.org")
94
94
  @address_book.contacts << @contact
95
95
 
96
96
  @storage.stub(:load_address_book).and_return(@address_book)
@@ -109,8 +109,8 @@ describe Ppl::Command::Mutt do
109
109
  before(:each) do
110
110
  @input.options[:ignore_case] = true
111
111
  @contact.name = "Joe Schmoe"
112
- @contact.email_addresses.push "joe@somewhere.com"
113
- @contact.email_addresses.push "LOUD@SHOUTING.COM"
112
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("joe@somewhere.com")
113
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("LOUD@SHOUTING.COM")
114
114
  @address_book.contacts << @contact
115
115
  @storage.stub(:load_address_book).and_return(@address_book)
116
116
  @output.stub(:line)
@@ -128,7 +128,7 @@ describe Ppl::Command::Mutt do
128
128
  @input.arguments.push "loud"
129
129
  @format.should_receive(:process) do |address_book|
130
130
  address_book.contacts[0].email_addresses.length.should eq 1
131
- address_book.contacts[0].email_addresses[0].should eq "LOUD@SHOUTING.COM"
131
+ address_book.contacts[0].email_addresses[0].address.should eq "LOUD@SHOUTING.COM"
132
132
  end
133
133
  @command.execute(@input, @output)
134
134
  end
@@ -15,51 +15,55 @@ describe Ppl::Command::Phone do
15
15
 
16
16
  before(:each) do
17
17
  @contact = Ppl::Entity::Contact.new
18
+ @service = double(Ppl::Service::PhoneNumber)
18
19
  @storage = double(Ppl::Adapter::Storage)
20
+ @list_format = double(Ppl::Format::AddressBook)
21
+ @show_format = double(Ppl::Format::Contact)
19
22
  @input = Ppl::Application::Input.new
20
- @input.arguments = ["jdoe", "01234567"]
23
+ @output = double(Ppl::Application::Output)
21
24
  @storage.stub(:require_contact).and_return(@contact)
22
25
  @storage.stub(:save_contact)
26
+ @command.phone_service = @service
23
27
  @command.storage = @storage
28
+ @command.list_format = @list_format
29
+ @command.show_format = @show_format
24
30
  end
25
31
 
26
- it "should save phone numbers as instances of Ppl::Entity::PhoneNumber" do
27
- @storage.should_receive(:save_contact) do |c|
28
- c.phone_numbers.first.should be_a(Ppl::Entity::PhoneNumber)
29
- end
32
+ it "should list all phone numbers by default" do
33
+ @storage.should_receive(:load_address_book).and_return(@address_book)
34
+ @list_format.should_receive(:process)
35
+ @output.should_receive(:line)
30
36
  @command.execute(@input, @output)
31
37
  end
32
38
 
33
- it "should save the given number as an attribute of the PhoneNumber" do
34
- @storage.should_receive(:save_contact) do |c|
35
- c.phone_numbers.first.number.should eq "01234567"
36
- end
39
+ it "should show a single contact's numbers if one is specified" do
40
+ @input.arguments << "jdoe"
41
+ @storage.should_receive(:require_contact).and_return(@contact)
42
+ @show_format.should_receive(:process)
43
+ @output.should_receive(:line)
37
44
  @command.execute(@input, @output)
38
45
  end
39
46
 
40
- it "should save the given type alongside the number" do
41
- @input.options[:type] = "cell"
42
- @storage.should_receive(:save_contact) do |c|
43
- c.phone_numbers.first.type.should eq "cell"
44
- end
47
+ it "should delegate to the service layer to remove a phone number" do
48
+ @input.arguments = ["jdoe", "01234567890"]
49
+ @input.options[:delete] = true
50
+ @storage.should_receive(:require_contact).and_return(@contact)
51
+ @service.should_receive(:remove).with(@contact, "01234567890")
45
52
  @command.execute(@input, @output)
46
53
  end
47
54
 
48
- it "shouldn't duplicate the number if the contact already has it" do
49
- @contact.phone_numbers << Ppl::Entity::PhoneNumber.new("01234567")
50
- @storage.should_receive(:save_contact) do |c|
51
- c.phone_numbers.length.should eq 1
52
- end
55
+ it "should delegate to the service layer to add a new phone number" do
56
+ @input.arguments = ["jdoe", "98776332"]
57
+ @storage.should_receive(:require_contact).and_return(@contact)
58
+ @service.should_receive(:add).with(@contact, "98776332", @input.options)
53
59
  @command.execute(@input, @output)
54
60
  end
55
61
 
56
- it "should delete the given number from the contact" do
57
- @input.arguments = ["jdoe", "01234567"]
58
- @input.options[:delete] = "true"
59
- @contact.phone_numbers << Ppl::Entity::PhoneNumber.new("01234567")
60
- @storage.should_receive(:save_contact) do |c|
61
- c.phone_numbers.length.should eq 0
62
- end
62
+ it "should delegate to the service layer to update an existing number" do
63
+ @contact.phone_numbers << Ppl::Entity::PhoneNumber.new("012345678")
64
+ @input.arguments = ["jdoe", "012345678"]
65
+ @storage.should_receive(:require_contact).and_return(@contact)
66
+ @service.should_receive(:update).with(@contact, "012345678", {})
63
67
  @command.execute(@input, @output)
64
68
  end
65
69
 
@@ -0,0 +1,28 @@
1
+
2
+ describe Ppl::Entity::EmailAddress do
3
+
4
+ before(:each) do
5
+ @email_address = Ppl::Entity::EmailAddress.new
6
+ end
7
+
8
+ describe "#address" do
9
+ it "should return a value" do
10
+ @email_address.address.should eq nil
11
+ end
12
+ end
13
+
14
+ describe "#preferred" do
15
+ it "should be false by default" do
16
+ @email_address.preferred.should eq false
17
+ end
18
+ end
19
+
20
+ describe "#initialize" do
21
+ it "should accept an address" do
22
+ email = Ppl::Entity::EmailAddress.new("bob@example.org")
23
+ email.address.should eq "bob@example.org"
24
+ end
25
+ end
26
+
27
+ end
28
+
@@ -11,6 +11,12 @@ describe Ppl::Entity::PhoneNumber do
11
11
  end
12
12
  end
13
13
 
14
+ describe "#preferred" do
15
+ it "should be false by default" do
16
+ @phone_number.preferred.should eq false
17
+ end
18
+ end
19
+
14
20
  describe "#type" do
15
21
  it "should return a value" do
16
22
  @phone_number.type.should eq nil
@@ -34,7 +34,7 @@ describe Ppl::Format::AddressBook::EmailAddresses do
34
34
  end
35
35
 
36
36
  it "should show an email address if it's available" do
37
- @contact.email_addresses.push "jdoe@example.org"
37
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("jdoe@example.org")
38
38
  @table.should_receive(:add_row).with({
39
39
  :id => "test:",
40
40
  :email_addresses => "jdoe@example.org",
@@ -7,7 +7,7 @@ describe Ppl::Format::AddressBook::MuttQuery do
7
7
  @contact = Ppl::Entity::Contact.new
8
8
  @table = double(Ppl::Format::Table)
9
9
 
10
- @contact.email_addresses.push "test@example.org"
10
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("test@example.org")
11
11
  @contact.name = "Test Contact"
12
12
 
13
13
  @format.table = @table
@@ -25,7 +25,7 @@ describe Ppl::Format::AddressBook::MuttQuery do
25
25
  end
26
26
 
27
27
  it "should list all of each contact's email addresses" do
28
- @contact.email_addresses.push "test2@example.com"
28
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("test2@example.com")
29
29
  @table.should_receive(:add_row).with({
30
30
  :email => "test@example.org",
31
31
  :name => "Test Contact",
@@ -36,7 +36,7 @@ describe Ppl::Format::AddressBook::OneLine do
36
36
 
37
37
  it "should show all the info if it's available" do
38
38
  @contact.name = "John Doe"
39
- @contact.email_addresses.push "jdoe@example.org"
39
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("jdoe@example.org")
40
40
  @table.should_receive(:add_row).with({
41
41
  :id => "test:",
42
42
  :name => "John Doe",
@@ -45,6 +45,16 @@ describe Ppl::Format::AddressBook::OneLine do
45
45
  @format.process(@address_book)
46
46
  end
47
47
 
48
+ it "should show all the info if it's available" do
49
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("jdoe@example.org")
50
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("fred@testtest.es")
51
+ @contact.email_addresses[1].preferred = true
52
+ @table.should_receive(:add_row) do |row|
53
+ row[:email].should eq "<fred@testtest.es>"
54
+ end
55
+ @format.process(@address_book)
56
+ end
57
+
48
58
  end
49
59
 
50
60
  end
@@ -1,28 +1,42 @@
1
1
 
2
+ describe Ppl::Format::Contact::EmailAddresses do
3
+ describe "#initialize" do
4
+ it "should pass the colors through to the table" do
5
+ colors = {"id" => "blue"}
6
+ Ppl::Format::Table.should_receive(:new).with([:star, :email_addresses], colors)
7
+ format = Ppl::Format::Contact::EmailAddresses.new(colors)
8
+ end
9
+ end
10
+ end
11
+
2
12
  describe Ppl::Format::Contact::EmailAddresses do
3
13
 
4
14
  before(:each) do
5
15
  @format = Ppl::Format::Contact::EmailAddresses.new
6
16
  @contact = Ppl::Entity::Contact.new
7
- @color = double(Ppl::Adapter::Color)
8
- @format.color_adapter = @color
17
+ @email = Ppl::Entity::EmailAddress.new("test@example.org")
18
+ @table = double(Ppl::Format::Table)
19
+ @format.table = @table
20
+ @contact.email_addresses << @email
9
21
  end
10
22
 
11
23
  describe "#process" do
12
24
 
13
- it "should return an empty string if the contact lacks an email address" do
14
- @format.process(Ppl::Entity::Contact.new).should eq ""
15
- end
16
-
17
- it "should return the contact's email address if it is set" do
18
- @contact.email_addresses.push "jdoe@example.org"
19
- @format.process(@contact).should eq "jdoe@example.org"
25
+ it "should pass each email address to the table" do
26
+ @table.should_receive(:add_row).with({
27
+ :star => " ",
28
+ :email_addresses => "test@example.org",
29
+ })
30
+ @format.process(@contact)
20
31
  end
21
32
 
22
- it "should colorize the string if configured to do so" do
23
- @format.colors = { "email_addresses" => "blue" }
24
- @color.should_receive(:colorize).and_return("email addresses in blue")
25
- @format.process(@contact).should eq "email addresses in blue"
33
+ it "should mark the preferred email with a star" do
34
+ @email.preferred = true
35
+ @table.should_receive(:add_row).with({
36
+ :star => "*",
37
+ :email_addresses => "test@example.org",
38
+ })
39
+ @format.process(@contact)
26
40
  end
27
41
 
28
42
  end
@@ -6,8 +6,14 @@ describe Ppl::Format::Contact::Full do
6
6
  @contact = Ppl::Entity::Contact.new
7
7
  @address = Ppl::Entity::PostalAddress.new
8
8
 
9
+ @email_address_format = double(Ppl::Format::Contact)
10
+ @phone_number_format = double(Ppl::Format::Contact)
9
11
  @postal_address_format = double(Ppl::Format::Contact)
12
+ @format.email_address_format = @email_address_format
13
+ @format.phone_number_format = @phone_number_format
10
14
  @format.postal_address_format = @postal_address_format
15
+
16
+ @email_address_format.stub(:process)
11
17
  end
12
18
 
13
19
  describe "#process" do
@@ -23,27 +29,33 @@ describe Ppl::Format::Contact::Full do
23
29
 
24
30
  it "should include their email address in brackets" do
25
31
  @contact.name = "John Doe"
26
- @contact.email_addresses.push "john@example.org"
32
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("john@example.org")
27
33
  @format.process(@contact).should include "John Doe <john@example.org>"
28
34
  end
29
35
 
30
- it "should show all their email addresses" do
31
- @contact.email_addresses.push "john@example.org"
32
- @contact.email_addresses.push "john@example.com"
33
- @contact.email_addresses.push "john@example.net"
34
- @format.process(@contact).should include "john@example.org"
35
- @format.process(@contact).should include "john@example.com"
36
- @format.process(@contact).should include "john@example.net"
36
+ it "should include their preferred email address in brackets" do
37
+ @contact.name = "John Doe"
38
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("john@example.org")
39
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("fred@testtest.es")
40
+ @contact.email_addresses[1].preferred = true
41
+ @format.process(@contact).should include "John Doe <fred@testtest.es>"
37
42
  end
38
43
 
39
- it "should show their birthday if available" do
40
- @contact.birthday = Date.parse("1980-01-01")
41
- @format.process(@contact).should include "1980-01-01"
44
+ it "should invoke the email address formatter if there are any addresses" do
45
+ @contact.email_addresses << Ppl::Entity::EmailAddress.new("john@example.net")
46
+ @email_address_format.should_receive(:process).with(@contact)
47
+ @format.process(@contact)
42
48
  end
43
49
 
44
- it "should show their phone number if available" do
50
+ it "should invoke the phone number formatter if there are any numbers" do
45
51
  @contact.phone_numbers << Ppl::Entity::PhoneNumber.new("01234567890")
46
- @format.process(@contact).should include "01234567890"
52
+ @phone_number_format.should_receive(:process).with(@contact)
53
+ @format.process(@contact)
54
+ end
55
+
56
+ it "should show their birthday if available" do
57
+ @contact.birthday = Date.parse("1980-01-01")
58
+ @format.process(@contact).should include "1980-01-01"
47
59
  end
48
60
 
49
61
  it "should show all their organizations" do