ppl 1.23.0 → 1.24.0

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