astrotrain 0.3.1

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 (57) hide show
  1. data/.gitignore +26 -0
  2. data/LICENSE +20 -0
  3. data/README +47 -0
  4. data/Rakefile +122 -0
  5. data/VERSION +1 -0
  6. data/astrotrain.gemspec +129 -0
  7. data/config/sample.rb +12 -0
  8. data/lib/astrotrain.rb +53 -0
  9. data/lib/astrotrain/api.rb +52 -0
  10. data/lib/astrotrain/logged_mail.rb +46 -0
  11. data/lib/astrotrain/mapping.rb +157 -0
  12. data/lib/astrotrain/mapping/http_post.rb +18 -0
  13. data/lib/astrotrain/mapping/jabber.rb +28 -0
  14. data/lib/astrotrain/mapping/transport.rb +55 -0
  15. data/lib/astrotrain/message.rb +330 -0
  16. data/lib/astrotrain/tmail.rb +58 -0
  17. data/lib/astrotrain/worker.rb +65 -0
  18. data/lib/vendor/rest-client/README.rdoc +104 -0
  19. data/lib/vendor/rest-client/Rakefile +84 -0
  20. data/lib/vendor/rest-client/bin/restclient +65 -0
  21. data/lib/vendor/rest-client/foo.diff +66 -0
  22. data/lib/vendor/rest-client/lib/rest_client.rb +188 -0
  23. data/lib/vendor/rest-client/lib/rest_client/net_http_ext.rb +23 -0
  24. data/lib/vendor/rest-client/lib/rest_client/payload.rb +185 -0
  25. data/lib/vendor/rest-client/lib/rest_client/request_errors.rb +75 -0
  26. data/lib/vendor/rest-client/lib/rest_client/resource.rb +103 -0
  27. data/lib/vendor/rest-client/rest-client.gemspec +18 -0
  28. data/lib/vendor/rest-client/spec/base.rb +5 -0
  29. data/lib/vendor/rest-client/spec/master_shake.jpg +0 -0
  30. data/lib/vendor/rest-client/spec/payload_spec.rb +71 -0
  31. data/lib/vendor/rest-client/spec/request_errors_spec.rb +44 -0
  32. data/lib/vendor/rest-client/spec/resource_spec.rb +52 -0
  33. data/lib/vendor/rest-client/spec/rest_client_spec.rb +219 -0
  34. data/test/api_test.rb +28 -0
  35. data/test/fixtures/apple_multipart.txt +100 -0
  36. data/test/fixtures/bad_content_type.txt +27 -0
  37. data/test/fixtures/basic.txt +14 -0
  38. data/test/fixtures/custom.txt +15 -0
  39. data/test/fixtures/fwd.txt +0 -0
  40. data/test/fixtures/gb2312_encoding.txt +16 -0
  41. data/test/fixtures/gb2312_encoding_invalid.txt +15 -0
  42. data/test/fixtures/html.txt +16 -0
  43. data/test/fixtures/iso-8859-1.txt +13 -0
  44. data/test/fixtures/mapped.txt +13 -0
  45. data/test/fixtures/multipart.txt +213 -0
  46. data/test/fixtures/multipart2.txt +213 -0
  47. data/test/fixtures/multiple.txt +13 -0
  48. data/test/fixtures/multiple_delivered_to.txt +14 -0
  49. data/test/fixtures/multiple_with_body_recipients.txt +15 -0
  50. data/test/fixtures/reply.txt +16 -0
  51. data/test/fixtures/utf-8.txt +13 -0
  52. data/test/logged_mail_test.rb +67 -0
  53. data/test/mapping_test.rb +129 -0
  54. data/test/message_test.rb +440 -0
  55. data/test/test_helper.rb +57 -0
  56. data/test/transport_test.rb +111 -0
  57. metadata +225 -0
@@ -0,0 +1,213 @@
1
+ Delivered-To: foo@example.com
2
+ Received: by ewy14 with SMTP id 14so339326ewy.0
3
+ for <foo@example.com>; Tue, 09 Dec 2008 15:03:18 -0800 (PST)
4
+ Message-ID: <ddf0a08f0812091503x4696425eid0fa5910ad39bce1@mail.examle.com>
5
+ Date: Tue, 9 Dec 2008 15:03:18 -0800
6
+ From: "Rick Olson" <rick@example.com>
7
+ To: foo@example.com
8
+ Subject: testing
9
+ MIME-Version: 1.0
10
+ Content-Type: multipart/mixed;
11
+ boundary="----=_Part_98510_7267541.1228863798546"
12
+
13
+ ------=_Part_98510_7267541.1228863798546
14
+ Content-Type: multipart/alternative;
15
+ boundary="----=_Part_98511_30821043.1228863798546"
16
+
17
+ ------=_Part_98511_30821043.1228863798546
18
+ Content-Type: text/plain; charset=ISO-8859-1
19
+ Content-Transfer-Encoding: 7bit
20
+ Content-Disposition: inline
21
+
22
+ Testing out rich emails with attachments!
23
+ This one has NO name property on Content-Type.
24
+ [state:hold responsible:rick]
25
+
26
+ ------=_Part_98511_30821043.1228863798546
27
+ Content-Type: text/html; charset=ISO-8859-1
28
+ Content-Transfer-Encoding: 7bit
29
+ Content-Disposition: inline
30
+
31
+ Testing out <span class="Apple-style-span" style="font-weight: bold;">rich</span> emails with attachments!<div><br></div><div>[state:hold responsible:rick]</div>
32
+
33
+ ------=_Part_98511_30821043.1228863798546--
34
+
35
+ ------=_Part_98510_7267541.1228863798546
36
+ Content-Type: image/jpeg
37
+ Content-Transfer-Encoding: base64
38
+ X-Attachment-Id: f_foj5r58f0
39
+ Content-Disposition: attachment; filename=bandit.jpg
40
+
41
+ /9j/4AAQSkZJRgABAQAAAQABAAD/4hEsSUNDX1BST0ZJTEUAAQEAABEcYXBwbAIAAABtbnRyUkdC
42
+ IFhZWiAH2AAKAB4ADgAsABlhY3NwQVBQTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9tYAAQAA
43
+ AADTLWFwcGzyFHiLXl6eOdbNyU72rSSJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5y
44
+ WFlaAAABLAAAABRnWFlaAAABQAAAABRiWFlaAAABVAAAABR3dHB0AAABaAAAABRjaGFkAAABfAAA
45
+ ACxyVFJDAAABqAAAAA5nVFJDAAABuAAAAA5iVFJDAAAByAAAAA52Y2d0AAAB2AAABhJuZGluAAAH
46
+ 7AAABj5kZXNjAAAOLAAAAGRkc2NtAAAOkAAAAj5tbW9kAAAQ0AAAAChjcHJ0AAAQ+AAAACRYWVog
47
+ AAAAAAAAX3kAADZCAAAG6VhZWiAAAAAAAABvXQAAswsAABt5WFlaIAAAAAAAACgAAAAWzQAAsMNY
48
+ WVogAAAAAAAA81IAAQAAAAEWz3NmMzIAAAAAAAEMQgAABd7///MmAAAHkgAA/ZH///ui///9owAA
49
+ A9wAAMBsY3VydgAAAAAAAAABAc0AAGN1cnYAAAAAAAAAAQHNAABjdXJ2AAAAAAAAAAEBzQAAdmNn
50
+ dAAAAAAAAAAAAAMBAAACAAAAEQA6AHkAygEfAWsBwwInApgDFgOpBEkE+AW7BokHZwhTCUoKVAtu
51
+ DJANtQ7ZEAQRNBJnE6EU3RYfF2wYuRoLG2EcwB4dH38g5iJFI7wlOSayKC8ppysgLJQuBy92MOMy
52
+ TTOwNQ42aTe+ORI6YjutPPU+OT+JQNxCLEN1RL1F/0dASHpJtUroTBVNQU5oT4pQqlHHUuJT/VUV
53
+ Vi1XQ1haWXFagluXXKlduV7JX9dg5GHzYv5kCGUTZiBnKmg2aT5qRWsybBRs823VbrpvoHCGcXBy
54
+ XnNPdD91MnYndx54FXkOegl7BHv+fPR94X7Nf7qApYGPgneDYIRLhTOGG4cDh+uI1Im8iqWLjox2
55
+ jV+OVY92kOKSTZOwlRCWbJe7mP2aOpttnJidtZ7Jn9ig3aHgotyj06TKpcOm1KfsqQaqH6s3rE2t
56
+ Ya5wr3+wjrGXsp+zpbSrtay2r7exuKy5rLqlu4u8a71Mvi6/D7/twMzBr8KRw3PEWMU/xifHEsgA
57
+ yPDJ4crVy8nMss2KzmDPNNAG0NjRpdJw0zvUB9TU1Z/WbNc62ArY3tmy2ojbYdwi3MTdSt3L3lHe
58
+ 2d9p3/rgkuEt4cribeMT47zkZuUT5cDmbOcY58Xoa+kM6aLqNurI61vr7uyK7Svt1e6P71jwNfEv
59
+ 8k7zmfUY9vb5if0Q//8AAAALACYAUACGAMgBFAFlAcACKQKkAy8DzQR7BTkGBAbiB88IxQnICtcL
60
+ 6gz9DhUPMRBQEXISnRPLFPsWNxd0GLIZ+RtHHJId4x82IIkh6SNVJLwmJieMKPIqVSu1LRYuby/I
61
+ MRwyazO1NPo2Pzd+OLo58TspPGs9sD7wQC5BZ0KcQ85E/0YtR1JIdEmTSq9LxUzZTetO+1ALURhS
62
+ JFMuVDdVQVZIV1JYWFldWmVbaVxsXXRedl93YHxhgmKDY4hkiGWIZnNnU2gwaQ9p8mrWa7tso22O
63
+ bnxvaXBZcUtyP3MzdCp1InYadxF4BXj0eeJ60Xu+fKp9lH5+f2yAVoE+giaDD4P5hOGFyYayh5qI
64
+ golxioiL4I00joCPzJESkk+ThJS1lduW+5gTmSSaMJs3nDqdOZ41nzCgNaFOonSjn6TEpeynEKgx
65
+ qU2qaauFrJutsK7Br9Kw4bHwsv20B7UStiG3NrhMuWO6e7uRvKO9tb7Kv9rA5sH0wv3EBcUKxg/H
66
+ EsgTyRHKDcsBy+rMz82xzpHPbtBH0R/R9dLJ06DUdNVJ1iDW99fV2LDZj9pw20/cJtz53cremd9p
67
+ 4DrhC+Hc4q3jfuRP5SLl9ubL56Hod+lO6ibq/+vV7J7tXu4Z7srvefAn8NPxg/I38vHzt/SM9XP2
68
+ cveQ+Nb6YPwz/mP//wAAAAoAJABLAH0AuwEDATkBdQG4AgECWwK8AyYDnwQgBLAFSAXoBpYHTQgJ
69
+ CMQJgwpFCwkLzwyaDWkOOw8TD+0QyBGoEo0TcxRbFUUWLRclGCUZIBohGxwcGR0RHgwfBR/5IPAh
70
+ 4SLQI70kpyWQJnYnWyg+KR4qDisBK/Es4C3MLrcvnzCGMWwyUDMvNA006DXCNpo3cjhHOR458TrD
71
+ O5Q8ZT02PgU+1j+mQHVBRUIUQuNDskSARUxGGUbnR7NIf0lJShJK0EuJTEBM+U21TnJPL0/vULJR
72
+ d1I6Uv9TxlSNVVRWHVblV61YdVk9Wgda01uhXG5dOl4FXtFfnmBrYTViAGLMY5hkYmUtZfhmwmeM
73
+ aFhpH2njaqZrZ2wqbOxtrG5obyNv3HCScUJx73KZcz5z4HSAdRt1tnZUdw531XijeXJ6Rnsbe/B8
74
+ x32ifoB/XYA7gRuB+4Lbg7yEnYV4hliHQohHiVSKYYtzjIKNjo6ej7GQw5HVkuqT/5UVliyXRJhe
75
+ mXeakJupnLmdvJ69n76gvaG9orujt6S4pbmmwKfHqNKp5Kr3rBGtLq5Or3SwmbHAsum0FLU/tm63
76
+ n7jVugy7RryCvb6/AMBEwYrCz8QYxV3GpsfvyULKpcwCzVTOpc/00VDSttQq1a/XVtkj2xXdRN+/
77
+ 4pnl6Ooa75j33P//AABuZGluAAAAAAAABjYAAJh/AABX2wAAVCwAAJANAAAoXwAAFWAAAFANAABU
78
+ OQAB+uEAAePXAAEeuAADAQAAAgAAAC8AdwC8APsBOAFyAawB5AIdAlQCigLAAvcDMANrA6YD4gQf
79
+ BF0EmwTbBRsFWgWbBd0GHwZiBqQG6ActB3IHuAf+CEgIjgjUCRoJYgmrCfQKPwqLCtgLJwt3C8gM
80
+ GwxvDMUNHA12DdEOLw6ODvAPUw+4EB8QiBD0EWER0RI+EqsTGROKE/4UchTqFWUV4BZgFt8XYxfr
81
+ GHYZAhmSGiYavBtVG/Ecjh0uHdEedR8cH8QgbSEcIckieiMuI+QkmyVXJhIm0CeSKFYpGinfKqgr
82
+ cSw/LQ8t/C71L/Ew6THiMt0z1jTNNcI2ujexOKg5nzqYO488hz2CPn8/iECbQatCwEPYRPZGE0cw
83
+ SFRJekqhS8lM9U4hT09QgFGyUtJTwlSGVU1WF1bnV7hYi1liWkFbKFwUXQVd/17/YAthImI+Y2dk
84
+ lGXKZwpoTGmRarlr22z6bhxvQHBmcZByvnP0dSh2X3efeOF6J3tvfL5+DH9dgLmCEYNzhPiGhogT
85
+ iaGLOYzQjmOP+pGRkySUt5ZIl9SZXprnnG+d95+UoVajHqTspsCooaqIrHGuWrBIsjO0HrX/t+O5
86
+ wbucvh3BSMRQxzDJ78yXzynRrNQo1qHZIduj3knhM+Q25znqE+y27xXxN/MV9Lv2L/d9+K35p/qa
87
+ +1P8Dfyo/Sf9pv4l/sH/YP//AAAARwCVANoBGQFVAZAByQIBAjoCcgKqAuQDIANdA5sD2gQbBFwE
88
+ nQTgBSQFZwWrBfEGNwZ9BsMHCwdUB50H5wgzCH4IyAkRCV0JqQn2CkUKlQrmCzkLjgvjDDoMlAzu
89
+ DUsNqg4LDm4O1A88D6UQERB/EPARYxHXEkkSuhMuE6UUHRSYFRYVlhYZFp0XJBewGD8Y0RllGf4a
90
+ mhs5G9scfx0kHc4eeh8oH9kgiyFBIfYisCNsJCgk6CWrJmwnMyf9KMYpjypeKysr/yzRLbsusy+x
91
+ MK0xpzKkM6A0mjWSNo03hziBOXs6djtwPGs9aT5pP3BAgEGOQqBDtUTQRexHBkgnSUxKckuZTMNN
92
+ 8E8eUE9Rg1KuU61Uf1VUVixXC1foWMpZsVqfW5Ncil2LXpFfn2C2YdNi+GQkZVNmjGfIaQVqMWtH
93
+ bFltaG5/b5NwrXHJcut0EnU5dmJ3k3jGef57N3x2fbV+9oA+gYeC0IQQhU6GkIfQiRCKVouijO2O
94
+ N4+IkOCSNZOUlPSWWpfCmS2anpwTnY2fEaCuolWkA6W5p3epQasPrOSut7CSsmi0QrYPt+G5rrt1
95
+ vVC/P8E0wzDFKcclySPLI80nzyjRKNMn1SfXJtkn2yTdK99c4a7kKOax6Ujrze438H7ykPRv9iD3
96
+ o/j++i77PPw3/Qf9zf7K//8AAABMAMEBKAGGAd4CNQKIAtwDNAOOA+sESgSqBQwFbgXSBjgGngcF
97
+ B28H2QhICLIJGgmHCfMKZArWC00LxAw/DL4NPg3EDk0O2g9rEAAQmBE1EdYSbhMHE6QURRTpFZIW
98
+ PhbtF6EYWxkYGdsaohttHD0dDh3mHsIfoSCDIWoiUSM+JCwlHiYTJwsoCSkIKgorECwcLS0uVi+I
99
+ MLgx5zMZNEc1czakN9Q5BTo5O2w8pD3fPx1AWkGUQtJEFEVbRqBH6Uk5SopL200zTotP6FFJUqhU
100
+ FFWIVwVYf1oAW45dIl7CYHViN2QQZfpn+2n3a5ZtIm6tcDBxs3M4dLh2M3eyeS96rXwtfa1/L4C9
101
+ gkaDuYUBhk2HmYjhii6LgIzPjhqPaZC6kgeTV5SnlfeXSJiXmeebOZyMneGfP6Czoiyjp6UlpqSo
102
+ KKmwqzKst64zr7GxLLKdtBG1e7bjuEq5rbsKvGy9zb8swIrB6sNIxKLF/cdUyKvKAMtUzKnN/c9N
103
+ 0JzR69M51IrV1tcn2HrZydsa3Gjdp97d4B7haeK35AblWeah5+PpH+pT637sou207rnvsfCe8Yjy
104
+ XvMv8+/0pfVY9fn2mvc09734RvjP+T75rPoa+on64fs2+4v74Pw1/H38tPzr/SL9Wf2R/cj9//43
105
+ /nD+qf7i/xv/VP+N/8b//wAAZGVzYwAAAAAAAAAKQ29sb3IgTENEAAAAAAAAAAAAAAAAAAAAAAAA
106
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
107
+ AAAAAG1sdWMAAAAAAAAAEgAAAAxuYk5PAAAAEgAAAOhwdFBUAAAAFgAAAPpzdlNFAAAAEAAAARBm
108
+ aUZJAAAAEAAAASBkYURLAAAAHAAAATB6aENOAAAADAAAAUxmckZSAAAAEgAAAVhqYUpQAAAADgAA
109
+ AWplblVTAAAAEgAAAXhwbFBMAAAAEgAAAYpwdEJSAAAAGAAAAZxlc0VTAAAAEgAAAbR6aFRXAAAA
110
+ DgAAAcZydVJVAAAAJAAAAdRrb0tSAAAADAAAAfhkZURFAAAAEAAAAgRubE5MAAAAFgAAAhRpdElU
111
+ AAAAFAAAAioARgBhAHIAZwBlAC0ATABDAEQATABDAEQAIABhACAAQwBvAHIAZQBzAEYA5AByAGcA
112
+ LQBMAEMARABWAOQAcgBpAC0ATABDAEQATABDAEQALQBmAGEAcgB2AGUAcwBrAOYAcgBtX2mCcgAg
113
+ AEwAQwBEAMkAYwByAGEAbgAgAEwAQwBEMKsw6TD8ACAATABDAEQAQwBvAGwAbwByACAATABDAEQA
114
+ SwBvAGwAbwByACAATABDAEQATABDAEQAIABDAG8AbABvAHIAaQBkAG8ATABDAEQAIABjAG8AbABv
115
+ AHJfaYJybbJmdphveTpWaAQmBDIENQRCBD0EPgQ5ACAEFgQaAC0ENAQ4BEEEPwQ7BDUEOc7st+wA
116
+ IABMAEMARABGAGEAcgBiAC0ATABDAEQASwBsAGUAdQByAGUAbgAtAEwAQwBEAEwAQwBEACAAYwBv
117
+ AGwAbwByAGkAAG1tb2QAAAAAAAAGEAAAnIUAAAAAxHyvAAAAAAAAAAAAAAAAAAAAAAB0ZXh0AAAA
118
+ AENvcHlyaWdodCBBcHBsZSwgSW5jLiwgMjAwOAD/4QBARXhpZgAATU0AKgAAAAgAAYdpAAQAAAAB
119
+ AAAAGgAAAAAAAqACAAQAAAABAAAAS6ADAAQAAAABAAAASwAAAAD/2wBDAAIBAQEBAQIBAQECAgIC
120
+ AgQDAgICAgUDBAMEBgUGBgYFBQUGBwkIBgcIBwUFCAsICAkJCgoKBgcLDAsKDAkKCgr/2wBDAQIC
121
+ AgICAgUDAwUKBgUGCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoK
122
+ CgoKCgr/wAARCABLAEsDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL
123
+ /8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2Jy
124
+ ggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWG
125
+ h4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo
126
+ 6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQD
127
+ BAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRom
128
+ JygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaX
129
+ mJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6
130
+ /9oADAMBAAIRAxEAPwBf2p/+Dhn4o/tYfs5+NP2btc/Yr0vw3ZeN/D1xo9/q0Pjv+1mtIZRh3SIw
131
+ xhzjgDcuOua+Q/2RIZbb4ja6zH5l8KWMWVXhsXEq5/SvXdS/Zk/Z/XP2bwTMNvRRrV1gf+RKZ4X+
132
+ FfgT4c3F1f8Agzw1JbTXkaJPO9xNcM0aklVy7HaASThfWvxXOuK45xg3Skne2miXVPXV9j++uAfC
133
+ SjwTmscTh5e42nK8m3opJW91L7Xc253Ynd0/2agaVXORgt60y4kmjHzQuPm7oVrT8CfD34rfFnVb
134
+ /RPhP8M9U8QS6VCkmrT2zwWtrZbsmNJrmd0jSRgCQmWfHJABBr4qjhataVoK7P37G53l2VYX2+Lq
135
+ xhT2u3bV9PXy3MxpMZPeqev+I9G8K6VJrPiHUorO1QqrTTPgFmOFVfUkkAAckmuz1D9kH9uK51aS
136
+ aL4eeFvBul6Vbx3d5rPxB8SWpsLkbj5sTtayPJHtjXeJAvU87QOanxk/4Jw+PPH/AIW8OfEr4ZeI
137
+ PBfj3UrXTvtJfw34mnsTdXssgKy2lxM72/2aBVHlphSSm9zISFHq0clkmp15JQfZq/pvZfM/PMx8
138
+ W8ojipYXARdSa+201Bd3om5W7JavS63MrT7/AEPVvBUNxJpGoWOrvduXiuWXZ9n/AICyj7jHrjPH
139
+ fmoobdp7qCwjwbi6mEVvETgyueiAdz7V5x4H8Mftdal4buPAnj/4ZeNtN8RaPG5mvIPCl1cSatEJ
140
+ tvnW6xwA/J9wgAbvlcMU69B8L/CXhC18KWHjfwb4mm8RrGZNniTULo3F8j+Yd6yFwGgYMpQqAgGz
141
+ BBqsyyWWWUFWqzjaTslF36XV+1+ier100Ozh7xFyvPsX9SwTbmlzN1LLVtJpJXvZ+i7N3udbfafe
142
+ 6VfyabqkDwXELFZYnPMbjsaaGQjPH5VXmvLi7na6u7iSWWQ5eR33E+7N3NLub/npXgON9j9JpSk6
143
+ a5mubrba5S+JXjHXtI8JXt/4b0bUdRv1Cpa2Oj2IurqUlwCIYCQJZNrMQnT5ea+RvgZ8ZPjh+2/4
144
+ vk+D3wS/Yy8P6hqhuXmvPFSeINWtbyG2z8smoX73nlq3y43KiK5+VI+i19e+C/Ht/wCAfjH4E8ZW
145
+ zwiCx8WwreGdiAiywTQRuNvQrLLDj3KntXqPwg8cfDL4dXGur8L9D0mxefW7m51+DSII4XF40rmT
146
+ 7QIxlWzvVQfujpX2mV5lQynLJtUVUqTe/a3R2187Jo/mPxGyTNOJeKKMKeMdChRj8P8AM23qk9Nl
147
+ a7TtbQ9a/Z5/YW/Z+h+DWgS/FX4CtofiyTSgPEWn6X4+1S9hSf50O2V7p8hhtfhuGOMnbmu8+Gf7
148
+ If7MnwYhey+FHwpi0qGbUm1CaJtXvLtZrogDzZVmmcSH5V++D0HpXnnhv9pFmiRb2WD57lHPnSFk
149
+ B3jGP7pxtx716t4V+Kml+I4nKM0TI+P3mMP8ucj27fVTXkPNqlWUteRvf+up4+M4bxlGjCNVupCO
150
+ 19bei6X62PPP2/P2ffjL+0v8KbX4WfDO80A2eoa1bTeKbfxFqU9ql1YQOJjbI0MbktNIiK+du1M9
151
+ ckV5V+zx8IfHv7EOqanrfxPudEi0u90aGz8O+EfCCfaLrWdWRzvuorGCGOGF3TEbiMYchZH2bS1f
152
+ TvjXxH4pm8J6g3gG+tI9YFpK+m/bLfzonkCEojLkdTtGd3GarfDP4kw/EP4f6V41msbvT7m6ttt/
153
+ p1/EIrizuoyY7i3lUEhWSZJUOCw46sK6KeMawbg1enfVX69H+G9jx54Wt9a0bVS2jsttml1trqr9
154
+ TyD/AIKVftD/ABI/Zs/Z/wBL+Lnw08d6h4f1CHxXptm/+iQXts8dxJ86XdvLwwxHs3q6smWIzXNf
155
+ 8FBvhjrng2y8P/Hr9nn4ZWF35d5cad4y8NaPZQ2Tana3g8yO7DrhPPhmiwC6nf5+zuK2f+CkHiTw
156
+ Zqn7JHjrQvEVk11GugS3UCR53x3MR3QuGAONsm3PHQt/DmvXfhN4ym8Q+DLTUrx41uPIQXaI+5Q+
157
+ BkL7Z6VH17D/AFSnGUOdc0k+zVo6d9Lu3bdHRTyfMMPjamKp1HCVoOLW6d5a22s+VJ9+p8CeG/Eu
158
+ meKdIi1nTXl8qUnCXFu0EiMrYKPGwDIQ3YgGtDzv9gVu/tOx+FrD9rTx1P4Wadftq6Zfa1DIylP7
159
+ SktmWR4/4gHhht8j+/k9zXJi5U/8tq4cTQpxq2p7aP70mf0rw7nFXNMnp18TaE3e66XTs7eTtfyO
160
+ V8f6Vd+K/B+o6FYPCt1Pbn7C1wSI0uEYSRSMRzgSIh4/u1x2u+MPhTd/FGG18dfArVPBF5PlrDxp
161
+ 4S1d0mE2S88t0YP+WZkWV0effuTLEDaRXctdNt+Z+KxNW8Kax8UvEOl+BPC3hC78SX7aojLo1uVt
162
+ 7b7REhmV769kxHbQwIsk0m8/LGpdgVXB+iyupUjL2MYtxd9m01pv26ddPQ/LeOcHl9XD/Xq1VU5R
163
+ sryScXrdJ3V927crvfo9j0fwbP4zsfD8Gp6F8SdO8X6dI++21PVZRa3MsZONv2iAeVLtZcA7Bnoa
164
+ 7rwf8UPGmjavLp+paLcWaIN8Fz9pSeKUZxjcvIfvgjo3Wvjf9rcXH7FHw/g1Pwl8QtfOq6/D59vY
165
+ WUqHQpI5wBb/AOiXCOzZijluCXwzpNab0UyMF6D9k34qah8e/h9eapf+JNQ8D+JppY7G3tbfVd9v
166
+ dE23mxSwWFzuwuzediYUqCQ3A29mN4clLCPFNJxvva1vW2nzSZ+eZPx3ha+YrLYc3tIq9m7qS12c
167
+ tbvs2n6n3DqX7TV34R0GTxBfvi3tE8y5d85CD+5hWy+/YAP9rrUlh+0B5GixWmi2sdrAU83yISuE
168
+ aQmR9237xYuST3LNXhukeCY/CsF1cWGqahJc36RreSXmpPPEHRAPMSKTeke3bkADHCg+tZ/h3wx4
169
+ zi8WLq/hDxrajR2b/SvD+o6dscENK0ih0GY282WP5uQF4w2Qa+anltKdNqnUtbvfX8/67H2qr+yx
170
+ EZ1aF79rO2u93a62ulqvMv8A7W3xa1/xB8OvHGgaX4hDXMfgW4f+yg4jdzISHlZz1CQ8hFx97nOR
171
+ X1H8AfE0MXgVpTd7sJEdzfLu/dJzXxD8Z/B/izwJ8BfiL458W6mNW17WtJZJxapm3s4sfZ1WHIUo
172
+ ojl3vnuG69/bLH4mweAfA8l9e6j9nt7XTVe8lZ8bIo4wWP5A08fg4U8BRhR1fM1p1do3/wCARhK3
173
+ 1jGYh1/cXLF2fRc07ejtuee69dQeP/2kvi9e2104u7G+0oiF0Zo5kTTwX2t2Zd44+7jB71SF57/p
174
+ XnfwF+NQl+GGr/FmbQ7mW/8AGE1/rPinU1l88aRaJOkSRJbqm/yo7eWzkkk+bYk6ueFfZ2ljqC39
175
+ ol5prpcQSDMU0MgkVx6hhwa0xeBxmGxEozTjFWin35YpP5XV1fX5M+g4G4gwGYZY/ZVFLWUrX1Sl
176
+ JtX+Tt2vc1/gD8HPGH7SHxM0rwboyXej+FrvT21PWfGuEQR6eszW/wDxLw4PmzSzK8cUjDyg0cz5
177
+ fy8HpvHX7Q3h/wAK6heaJ4I8KaXpHwev7WPSPDs2mHdc6boImla7uZpX5nl1mfTbhJ5GDSFDaAv/
178
+ AABnxM/av8cL8FvH/inQ/B2uWev+Ihd3F0+n6bvGg2gj+x6fbNbxgSWdvbWyxIjywpHlnO/mvDvg
179
+ 1N4X/aJ/aT/4Z88S6kkfhvxZ8KrnwpplxG25Le5Qi8srlSPlzHPYK24e6/xV9nhKEaUZWVqaWr6u
180
+ 2rf+XT7z8MznHY/iBRxWImpVItWgtFHmdlG2+yd29ddGfP8A+0/431D4s/F7wl8Zvjwl7d+FtQ8X
181
+ 3N34kaEM9vaeZceXHaoB91UtbKJAg+bZGe9eyfsZ6JD8QfH/AMQPGPir4g6Pq99pWo2Nzoms6EyN
182
+ aafE9vPBEItwAjCRBU8rtsXOa4WHWtU8HeG9S8L+NNDgTVfDp1N9Sspm2L/aQvJbIw/9dEF1M4HV
183
+ QYn6EV7j/wAE2/g0PBXhzU1vNKi0lvEVjBqNl4YF/wDbWFm7ki7m+8q7tywx78OUid8cnHtZxmMK
184
+ HD06FraqzXa+qt2sfNcHZVLE8Z06ifNB3lK99+Vxi2/XVX1TvY91uLNZY3hmhBjcFGT7wweMUzSb
185
+ KXTdYkt7PRVS2ltoXe6EmTJIn7vYyNzkIqfP36HpXat4JuuG2Z/vUreF5SgXyiSvTjmvytYqnY/p
186
+ Z4S7T7Hi37W1xZ2XwU1nV9d0fdZ2NxbJIu9pVltnuIN5ZF65+4A+7B2mvh/48/tSftEftAf2P8B9
187
+ O8LWOnT+Mra1meHTZHMsyyuxEbncRGnCsR12Abjywr9LfEHgm3utSMGoNeXhvtPdINKMO+2leLeT
188
+ uVvk3kSj5HK7/LXHKV+dXi+W51f9ozxb4su/D9rpGsaRo886W9hOWayuYY4rvdCHUGFXmhvCUPzx
189
+ q7xscFa+04WnhazcZwUpQ95N9HotvVfgfi/ifHMMMoOjWdOFb3JRW8krt3duzsl2et0et/sk+LvC
190
+ f7N2m618Lkdr5fCGuReJIpZORqNvB51jrNjKPutG9jOZNvQgjulfWGsfAj4UJqUrWX7Gdv4ztpSJ
191
+ bPxPY61eWC38DgPEzxQSLH5oRkWRwoMkiu55Y18MfDLTfFXxT+K8Wg+Av7OF7e3sOqzz32RY2Ony
192
+ 2ks99dXz87LWO3vt0nzcny0XkitDTPG/h7XrJLvwt8fvEGlaXAWs9NtbvV5xM9vbsYI55FNyux5l
193
+ iWZkACqZCq/KBXpY7C1Kld1E7N2v/V0+j8rtnzuU16GHwVOnThzaO1mlZX6trV6pW3SS7jf2Yr/9
194
+ rf8AZp13TdN/aX+KnhjwjpukK1zo83iX4h2lnr+jNgfvLBYTPdBW2qGt5ImhmQMhT5s1618VV8Kr
195
+ 4mtf2tvhvZaZ/wAJX4bs7XWNei8GeHbvTNM1qzkjYter9tEEcAML3EgaBH3ujRkfNuH50fDbwb4b
196
+ 1/wZqWs6vp3nXNuW8mTznXbx6KQP0r7G/wCCfeq3/wATPht8Lfh94+n/ALV0a68V+J9EubG7QMsu
197
+ nW+lR6jBbOcZaOO7keZQTwWI+6cV7Ga4GNG9aNr7SSVk1rfS/VL77M+K4ZzzE12sPNuyV4NtSktk
198
+ k5NLRej0uranvnxOn+Hf7SPguNLee3fSvilPb6roN2rCAWHjGyiVlcPjETX9qhTLfxxy5Br1T9iv
199
+ /hENJ+G+jeBLu7tG16Oz+zyXr2qWkusfZyYvmRvn+0W3+olgf543TgFHRz8dfsn6jfaz+z18aNC1
200
+ O7kltNGtrnU9JiLY+x3cCJPDNERyjJIoYEEdWHRmB9q1OQ3H7T3gfw1cqsth478Brrvim0lQOl5q
201
+ kEghivVBH7i4EYCmWHYzBV3E4FfJZjgFisPLDczSjdr5JP8AJ/evmv1TKc0eX4iGY04LmnaLXlJt
202
+ fhJO3k/I+1v7Ftol2yLg+h+WsrXvC2kajYXGmXAcR3ULxSmGYxOFYEHa45Q89VORXxR+2v8AGP4u
203
+ fs66fp138IPij4i0xpw/mJca1PqMZw3GI7lpFH4AVyHg79t/9qTWfhte6rqfxVlluY4MpMdKswyn
204
+ n0hr5SXDeLjRjVhONm/NP8n+Z9zT49y/6y8PVpS5kr6crW3m1+R9peN/F/h74WafJc+JtbklS5bZ
205
+ plkkSvcyKkI3onPzgbXd5HwiBmLuAM18jePfgna/E3xl4q+PHj2C8uta+IunHSvhx4P8LXD2tzeq
206
+ bTyvtc0zf6yFI1OJGCRsPMkOY9m7o/Clsnj746/DPw944mn1iz8UeAL/AFrxDFqdw9z/AGhdW0m6
207
+ BZmcktAjBW+zE+QWVWMZIBB4R8UeIdY8AfEv406pq80/ik+Nb7QU1qRsyxabFbxTJaxdoozId7BA
208
+ u8hd+7aMfQZVgJZYnOMrzkld+V7WXq1q97HzecZsuJ3GE6aVOE7RT197l+J97J6La/oZ2r6Z8Jf2
209
+ fPhXefs3eHrbT9Z8ZfEcww/ES80G5ktXubCJY1OlaW+ySURblhgTKsZC7yP22buk/Gz9lj4UaXbf
210
+ DzxloXw08O6rpcCRX+hXdlourTWMpAYxS3TadmV13fMTnDZGTjJ+evhjeXel+GW+NlldSL4qm/Zz
211
+ 1fxIdbdzJMmqrrNxYpdR7siN1tv3ahAqr1ADc18MS3l5qE8l9fXcs000rPLLJIWZ2JJJJPUk96+y
212
+ wuW1K8pc1R6bvq3+SSSSR+SZxxDl+X06UqeHvzLRXslFemrbbbetl5n/2Q==
213
+ ------=_Part_98510_7267541.1228863798546--
@@ -0,0 +1,13 @@
1
+ Delivered-To: processor@astrotrain.com
2
+ Message-ID: <a16be7390810161014n52b603e9k1aa6bb803c6735aa@mail.gmail.com>
3
+ Date: Thu, 16 Oct 2008 10:14:18 -0700
4
+ From: user@example.com, boss@example.com
5
+ To: other@example.com, processor@astrotrain.com
6
+ Subject: Fwd: blah blah
7
+ MIME-Version: 1.0
8
+ Content-Type: text/plain; charset=ISO-8859-1
9
+ Content-Transfer-Encoding: 7bit
10
+ Content-Disposition: inline
11
+
12
+ ---------- Forwarded message ----------
13
+ blah blah
@@ -0,0 +1,14 @@
1
+ Delivered-To: processor-reply-57@custom.com
2
+ Delivered-To: processor-delivered@astrotrain.com
3
+ Message-ID: <a16be7390810161014n52b603e9k1aa6bb803c6735aa@mail.gmail.com>
4
+ Date: Thu, 16 Oct 2008 10:14:18 -0700
5
+ From: user@example.com, boss@example.com
6
+ To: processor@astrotrain.com
7
+ Subject: Fwd: blah blah
8
+ MIME-Version: 1.0
9
+ Content-Type: text/plain; charset=ISO-8859-1
10
+ Content-Transfer-Encoding: 7bit
11
+ Content-Disposition: inline
12
+
13
+ ---------- Forwarded message ----------
14
+ blah blah
@@ -0,0 +1,15 @@
1
+ Delivered-To: processor@astrotrain.com
2
+ Message-ID: <a16be7390810161014n52b603e9k1aa6bb803c6735aa@mail.gmail.com>
3
+ Date: Thu, 16 Oct 2008 10:14:18 -0700
4
+ From: user@example.com, boss@example.com
5
+ To: other@example.com, processor@astrotrain.com
6
+ Subject: blah blah
7
+ MIME-Version: 1.0
8
+ Content-Type: text/plain; charset=ISO-8859-1
9
+ Content-Transfer-Encoding: 7bit
10
+ Content-Disposition: inline
11
+
12
+ blah blah
13
+
14
+ ISSUE #: <processor%2Bfoobar@astrotrain.com>
15
+ ISSUE #: <processor+blah@astrotrain.com>
@@ -0,0 +1,16 @@
1
+ Delivered-To: processor@astrotrain.com
2
+ Message-ID: <a16be7390810161014n52b603e9k1aa6bb803c6735aa@mail.gmail.com>
3
+ Date: Thu, 16 Oct 2008 10:14:18 -0700
4
+ From: user@example.com
5
+ To: processor@astrotrain.com
6
+ Subject: Fwd: blah blah
7
+ MIME-Version: 1.0
8
+ Content-Type: text/plain; charset=ISO-8859-1
9
+ Content-Transfer-Encoding: 7bit
10
+ Content-Disposition: inline
11
+
12
+ blah blah
13
+
14
+ =====
15
+
16
+ blah!
@@ -0,0 +1,13 @@
1
+ Delivered-To: "Processor" <processor@astrotrain.com>
2
+ Message-ID: <a16be7390810161014n52b603e9k1aa6bb803c6735aa@mail.gmail.com>
3
+ Date: Thu, 16 Oct 2008 10:14:18 -0700
4
+ From: =?utf-8?Q?isnard_naik=c3=a9?= <user@example.com>
5
+ To: Processor <processor@astrotrain.com>
6
+ Subject: Fwd: blah blah
7
+ MIME-Version: 1.0
8
+ Content-Type: text/plain; charset=ISO-8859-1
9
+ Content-Transfer-Encoding: 7bit
10
+ Content-Disposition: inline
11
+
12
+ ---------- Forwarded message ----------
13
+ blah blah
@@ -0,0 +1,67 @@
1
+ require File.join(File.dirname(__FILE__), "test_helper")
2
+
3
+ class Astrotrain::LoggedMailTest < Astrotrain::TestCase
4
+ describe "being created from Message" do
5
+ before :all do
6
+ Astrotrain::Mapping.all.destroy!
7
+ @mapping = Astrotrain::Mapping.create!(:email_user => '*')
8
+ @raw = mail(:custom)
9
+ @message = Astrotrain::Message.parse(@raw)
10
+ @logged = Astrotrain::LoggedMail.from(@message, 'foo/bar') do |l|
11
+ l.recipient = @message.recipients(%w(delivered_to)).first
12
+ l.mapping = @mapping
13
+ end
14
+ end
15
+
16
+ it "sets recipient" do
17
+ assert_equal @message.recipients(%w(delivered_to)).first, @logged.recipient
18
+ end
19
+
20
+ it "sets mail_file" do
21
+ assert_equal 'foo/bar', @logged.mail_file
22
+ end
23
+
24
+ it "sets sender" do
25
+ assert_equal 'user@example.com', @logged.sender
26
+ end
27
+
28
+ it "sets subject" do
29
+ assert_equal @message.subject, @logged.subject
30
+ end
31
+
32
+ it "sets mapping" do
33
+ assert_equal @mapping, @logged.mapping
34
+ end
35
+ end
36
+
37
+ describe "attempted creation with badly encoded message" do
38
+ before :all do
39
+ Astrotrain::Mapping.all.destroy!
40
+ @mapping = Astrotrain::Mapping.create!(:email_user => '*')
41
+ @raw = mail(:custom)
42
+ @subject = "=?gb2312?B?usO80rXnubrO78341b68urjEsOajrLfJwPvG1tfu0MKxqLzbo6jUsbmkvNuj?= =?gb2312?B?qQ==?="
43
+ @raw.sub! /Subject\: Fwd\: blah blah/, "Subject: #{@subject}"
44
+ @message = Astrotrain::Message.parse(@raw)
45
+ @logged = Astrotrain::LoggedMail.from(@message) do |l|
46
+ l.recipient = @message.recipients(%w(delivered_to)).first
47
+ l.mapping = @mapping
48
+ end
49
+ end
50
+
51
+ it "sets recipient" do
52
+ assert_equal @message.recipients(%w(delivered_to)).first, @logged.recipient
53
+ end
54
+
55
+ it "sets subject" do
56
+ assert_equal @subject, @logged.subject
57
+ end
58
+
59
+ it "sets sender" do
60
+ assert_equal 'user@example.com', @logged.sender
61
+ end
62
+
63
+ it "sets mapping" do
64
+ assert_equal @mapping, @logged.mapping
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,129 @@
1
+ require File.join(File.dirname(__FILE__), "test_helper")
2
+
3
+ class Astrotrain::MappingTest < Astrotrain::TestCase
4
+ it "defaults #email_domain to Mapping.default_domain" do
5
+ assert_equal Astrotrain::Mapping.default_domain, Astrotrain::Mapping.new.email_domain
6
+ end
7
+
8
+ it "defaults #transport to 'http_post" do
9
+ assert_equal 'http_post', Astrotrain::Mapping.new.transport
10
+ end
11
+
12
+ it "knows http_post transport uses urls" do
13
+ assert Astrotrain::Mapping.new(:transport => 'http_post').destination_uses_url?
14
+ end
15
+
16
+ it "knows jabber transport uses emails" do
17
+ assert Astrotrain::Mapping.new(:transport => 'jabber').destination_uses_email?
18
+ end
19
+
20
+ describe "matching" do
21
+ before :all do
22
+ Astrotrain::Mapping.transaction do
23
+ Astrotrain::Mapping.all.destroy!
24
+ @mapping1 = Astrotrain::Mapping.create!(:email_user => '*')
25
+ @mapping2 = Astrotrain::Mapping.create!(:email_user => 'abc*')
26
+ @mapping3 = Astrotrain::Mapping.create!(:email_user => 'abc')
27
+ end
28
+ end
29
+
30
+ it "matches email user" do
31
+ assert_equal [@mapping3, "abc@#{Astrotrain::Mapping.default_domain}"],
32
+ Astrotrain::Mapping.match(["abc@#{Astrotrain::Mapping.default_domain}"])
33
+ end
34
+
35
+ it "matches email partial wildcard" do
36
+ assert_equal [@mapping2, "abc1@#{Astrotrain::Mapping.default_domain}"],
37
+ Astrotrain::Mapping.match(["abc1@#{Astrotrain::Mapping.default_domain}"])
38
+ end
39
+
40
+ it "matches email full wildcard" do
41
+ assert_equal [@mapping1, "def@#{Astrotrain::Mapping.default_domain}"],
42
+ Astrotrain::Mapping.match(["def@#{Astrotrain::Mapping.default_domain}"])
43
+ end
44
+ end
45
+
46
+ describe "finding reply text" do
47
+ delim = "xyz"
48
+
49
+ before :all do
50
+ @mapping = Astrotrain::Mapping.new :separator => delim
51
+ end
52
+
53
+ {
54
+ "foo bar\n\n#{delim}\nfoo" => "foo bar",
55
+ "foo bar\n\nOn 13-Jan-09, at 9:17 AM, ENTP Support wrote:\n\n\n#{delim}\nfoo" => "foo bar",
56
+ "foo bar\n\nOn Jan 13, 2009 at 2:20 PM, ENTP Support wrote:\n\n\n#{delim}\nfoo" => "foo bar",
57
+ "foo bar\n\nAm Tuesday 02 December 2008 schrieb Ricky Bobby:\n\n\n#{delim}\nfoo" => "foo bar",
58
+ "foo bar\n\nLe 18 sept. 08 à 09:08, theRemix a écrit :\n\n\n#{delim}\nfoo" => "foo bar",
59
+ "foo\n bar\nbaz\n\n\n> #{delim}" => "foo\n bar\nbaz",
60
+ "foo\n\nbar\nbaz\n#{delim}" => "foo",
61
+ "foo\n bar\nbaz2\n\n\n\n" => "foo\n bar\nbaz2",
62
+ ">> #{delim}\n foo bar" => ""
63
+ }.each do |before, after|
64
+ it "parses #{after.inspect} from #{before.inspect}" do
65
+ assert_equal after, @mapping.find_reply_from(before)
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "validation" do
71
+ before :all do
72
+ Astrotrain::Mapping.all.destroy!
73
+ @mapping = Astrotrain::Mapping.create!(:email_user => 'xyz')
74
+ end
75
+
76
+ %w(abc abc_def abc-123 abc+def abc%def foo* *).each do |valid|
77
+ it "allows #email_user == #{valid.inspect}" do
78
+ assert valid_mapping(:email_user => valid).valid?
79
+ end
80
+ end
81
+
82
+ %w(a\ b abc! abc? foo*bar *foo).each do |valid|
83
+ it "rejects #email_user == #{valid.inspect}" do
84
+ assert !valid_mapping(:email_user => valid).valid?
85
+ end
86
+ end
87
+
88
+ %w(abc abc_def abc-123 abc.def).each do |valid|
89
+ it "allows #email_domain == #{valid.inspect}" do
90
+ assert valid_mapping(:email_domain => valid).valid?
91
+ end
92
+ end
93
+
94
+ %w(a\ b abc! abc? abc+def abc%def).each do |valid|
95
+ it "rejects #email_domain == #{valid.inspect}" do
96
+ assert !valid_mapping(:email_domain => valid).valid?
97
+ end
98
+ end
99
+
100
+ %w(http://example.com https://example.com http://example.com/ http://example.com/foo http://rick:monkey@example.com http://example.com:4567/foo http://localhost:3000/foo http://localhost/foo http://example.com/foo/bar.html http://example.com/foo?blah[baz]=1).each do |valid|
101
+ it "allows #destination == #{valid.inspect} for http_post transport" do
102
+ assert valid_mapping(:destination => valid, :transport => 'http_post').valid?
103
+ end
104
+ end
105
+
106
+ %w(foo@bar.com).each do |valid|
107
+ it "allows #destination == #{valid.inspect} for jabber transport" do
108
+ assert valid_mapping(:destination => valid, :transport => 'jabber').valid?
109
+ end
110
+ end
111
+
112
+ it "rejects duplicate email_user/email_domain" do
113
+ assert !valid_mapping(:email_user => @mapping.email_user).valid?
114
+ end
115
+
116
+ it "accepts unique email_user" do
117
+ assert valid_mapping.valid?
118
+ end
119
+
120
+ it "accepts unique email_user + email_domain" do
121
+ assert valid_mapping(:email_user => @mapping.email_user, :email_domain => 'example.com').valid?
122
+ end
123
+
124
+ protected
125
+ def valid_mapping(options = {})
126
+ Astrotrain::Mapping.new({:destination => 'http://foo.com', :email_user => 'sample', :transport => 'http_post'}.update(options))
127
+ end
128
+ end
129
+ end