|
139 | 139 | expect(object.address_zip_code).to eq("10003") |
140 | 140 | end |
141 | 141 | end |
| 142 | + |
| 143 | + describe "tax_id attribute" do |
| 144 | + it "allows setting a tax_id as a TaxId object" do |
| 145 | + tax_id = Flex::TaxId.new("123456789") |
| 146 | + object.tax_id = tax_id |
| 147 | + |
| 148 | + expect(object.tax_id).to be_a(Flex::TaxId) |
| 149 | + expect(object.tax_id.formatted).to eq("123-45-6789") |
| 150 | + end |
| 151 | + |
| 152 | + it "allows setting a tax_id as a string" do |
| 153 | + object.tax_id = "123456789" |
| 154 | + |
| 155 | + expect(object.tax_id).to be_a(Flex::TaxId) |
| 156 | + expect(object.tax_id.formatted).to eq("123-45-6789") |
| 157 | + end |
| 158 | + |
| 159 | + [ |
| 160 | + [ "123456789", "123-45-6789" ], |
| 161 | + [ "123-45-6789", "123-45-6789" ], |
| 162 | + [ "123 45 6789", "123-45-6789" ] |
| 163 | + ].each do |input_string, expected| |
| 164 | + it "formats tax_id correctly [#{input_string}]" do |
| 165 | + object.tax_id = input_string |
| 166 | + expect(object.tax_id.formatted).to eq(expected) |
| 167 | + end |
| 168 | + end |
| 169 | + |
| 170 | + it "preserves invalid values for validation" do |
| 171 | + object.tax_id = "12345" |
| 172 | + |
| 173 | + expect(object.tax_id).to be_a(Flex::TaxId) |
| 174 | + expect(object.tax_id.formatted).to eq("12345") # Raw value since not 9 digits |
| 175 | + expect(object).not_to be_valid |
| 176 | + expect(object.errors.full_messages_for("tax_id")).to eq([ "Tax ID is not a valid Taxpayer Identification Number (TIN). Use the format (XXX-XX-XXXX)" ]) |
| 177 | + end |
| 178 | + |
| 179 | + describe "TaxId.<=>" do |
| 180 | + it "allows sorting tax ids" do |
| 181 | + tax_ids = [ |
| 182 | + Flex::TaxId.new("987654321"), |
| 183 | + Flex::TaxId.new("123456789"), |
| 184 | + Flex::TaxId.new("456789123") |
| 185 | + ] |
| 186 | + |
| 187 | + sorted_tax_ids = tax_ids.sort |
| 188 | + expect(sorted_tax_ids.map(&:formatted)).to eq([ |
| 189 | + "123-45-6789", |
| 190 | + "456-78-9123", |
| 191 | + "987-65-4321" |
| 192 | + ]) |
| 193 | + end |
| 194 | + |
| 195 | + it "compares tax ids numerically" do |
| 196 | + lower = Flex::TaxId.new("123456789") |
| 197 | + higher = Flex::TaxId.new("987654321") |
| 198 | + |
| 199 | + expect(lower <=> higher).to eq(-1) |
| 200 | + expect(higher <=> lower).to eq(1) |
| 201 | + expect(lower <=> lower).to eq(0) |
| 202 | + end |
| 203 | + |
| 204 | + it "handles comparison with different formats" do |
| 205 | + tax_id1 = Flex::TaxId.new("123-45-6789") |
| 206 | + tax_id2 = Flex::TaxId.new("123456789") |
| 207 | + |
| 208 | + expect(tax_id1 <=> tax_id2).to eq(0) |
| 209 | + end |
| 210 | + |
| 211 | + it "handles comparison with string values" do |
| 212 | + tax_id = Flex::TaxId.new("123-45-6789") |
| 213 | + string_value = "123456789" |
| 214 | + |
| 215 | + expect(tax_id <=> string_value).to eq(0) |
| 216 | + expect(tax_id <=> "987654321").to eq(-1) |
| 217 | + expect(tax_id <=> "000456789").to eq(1) |
| 218 | + end |
| 219 | + end |
| 220 | + end |
| 221 | + |
| 222 | + describe "persisting and loading from database" do |
| 223 | + let(:record) { TestRecord.new } |
| 224 | + |
| 225 | + it "persists and loads name object correctly" do |
| 226 | + name = Flex::Name.new("John", "Middle", "Doe") |
| 227 | + record.name = name |
| 228 | + record.save! |
| 229 | + |
| 230 | + loaded_record = TestRecord.find(record.id) |
| 231 | + expect(loaded_record.name).to be_a(Flex::Name) |
| 232 | + expect(loaded_record.name).to eq(name) |
| 233 | + expect(loaded_record.name_first).to eq("John") |
| 234 | + expect(loaded_record.name_middle).to eq("Middle") |
| 235 | + expect(loaded_record.name_last).to eq("Doe") |
| 236 | + end |
| 237 | + |
| 238 | + it "persists and loads address object correctly" do |
| 239 | + address = Flex::Address.new("123 Main St", "Apt 4B", "Boston", "MA", "02108") |
| 240 | + record.address = address |
| 241 | + record.save! |
| 242 | + |
| 243 | + loaded_record = TestRecord.find(record.id) |
| 244 | + expect(loaded_record.address).to be_a(Flex::Address) |
| 245 | + expect(loaded_record.address).to eq(address) |
| 246 | + expect(loaded_record.address_street_line_1).to eq("123 Main St") |
| 247 | + expect(loaded_record.address_street_line_2).to eq("Apt 4B") |
| 248 | + expect(loaded_record.address_city).to eq("Boston") |
| 249 | + expect(loaded_record.address_state).to eq("MA") |
| 250 | + expect(loaded_record.address_zip_code).to eq("02108") |
| 251 | + end |
| 252 | + |
| 253 | + it "persists and loads tax_id object correctly" do |
| 254 | + tax_id = Flex::TaxId.new("123-45-6789") |
| 255 | + record.tax_id = tax_id |
| 256 | + record.save! |
| 257 | + |
| 258 | + loaded_record = TestRecord.find(record.id) |
| 259 | + expect(loaded_record.tax_id).to be_a(Flex::TaxId) |
| 260 | + expect(loaded_record.tax_id).to eq(tax_id) |
| 261 | + expect(loaded_record.tax_id.formatted).to eq("123-45-6789") |
| 262 | + end |
| 263 | + |
| 264 | + it "persists and loads memorable date correctly" do |
| 265 | + date = Date.new(2020, 1, 2) |
| 266 | + record.date_of_birth = date |
| 267 | + record.save! |
| 268 | + |
| 269 | + loaded_record = TestRecord.find(record.id) |
| 270 | + expect(loaded_record.date_of_birth).to eq(date) |
| 271 | + expect(loaded_record.date_of_birth.year).to eq(2020) |
| 272 | + expect(loaded_record.date_of_birth.month).to eq(1) |
| 273 | + expect(loaded_record.date_of_birth.day).to eq(2) |
| 274 | + end |
| 275 | + |
| 276 | + it "preserves all attributes when saving and loading multiple value objects" do |
| 277 | + record.name = Flex::Name.new("Jane", "Marie", "Smith") |
| 278 | + record.address = Flex::Address.new("456 Oak St", "Unit 7", "Chicago", "IL", "60601") |
| 279 | + record.tax_id = Flex::TaxId.new("987-65-4321") |
| 280 | + record.date_of_birth = Date.new(1990, 3, 15) |
| 281 | + record.save! |
| 282 | + |
| 283 | + loaded_record = TestRecord.find(record.id) |
| 284 | + |
| 285 | + # Verify name |
| 286 | + expect(loaded_record.name).to eq(Flex::Name.new("Jane", "Marie", "Smith")) |
| 287 | + expect(loaded_record.name_first).to eq("Jane") |
| 288 | + expect(loaded_record.name_middle).to eq("Marie") |
| 289 | + expect(loaded_record.name_last).to eq("Smith") |
| 290 | + |
| 291 | + # Verify address |
| 292 | + expect(loaded_record.address).to eq(Flex::Address.new("456 Oak St", "Unit 7", "Chicago", "IL", "60601")) |
| 293 | + expect(loaded_record.address_street_line_1).to eq("456 Oak St") |
| 294 | + expect(loaded_record.address_street_line_2).to eq("Unit 7") |
| 295 | + expect(loaded_record.address_city).to eq("Chicago") |
| 296 | + expect(loaded_record.address_state).to eq("IL") |
| 297 | + expect(loaded_record.address_zip_code).to eq("60601") |
| 298 | + |
| 299 | + # Verify tax_id |
| 300 | + expect(loaded_record.tax_id).to eq(Flex::TaxId.new("987-65-4321")) |
| 301 | + expect(loaded_record.tax_id.formatted).to eq("987-65-4321") |
| 302 | + |
| 303 | + # Verify date_of_birth |
| 304 | + expect(loaded_record.date_of_birth).to eq(Date.new(1990, 3, 15)) |
| 305 | + end |
| 306 | + end |
142 | 307 | end |
0 commit comments