mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-10 23:07:47 +00:00
Improve data migration logic and add test coverage
This commit is contained in:
committed by
Maikel Linke
parent
fd815a6af6
commit
4c50ca69ea
@@ -11,14 +11,47 @@ class MigrateCustomersData < ActiveRecord::Migration[6.1]
|
||||
end
|
||||
|
||||
def migrate_customer_name_data!
|
||||
Customer.where(first_name: "", last_name: "").where.not(name: [nil, ""]).find_each do |customer|
|
||||
name_words = customer.name.split(' ')
|
||||
next if name_words.empty?
|
||||
customers_with_bill_addresses.find_each do |customer|
|
||||
if bill_address_name_matches?(customer)
|
||||
apply_name_from_bill_address!(customer)
|
||||
next
|
||||
end
|
||||
|
||||
customer.update(
|
||||
first_name: name_words.first,
|
||||
last_name: name_words[1..].join(' ')
|
||||
)
|
||||
split_customer_name!(customer)
|
||||
end
|
||||
|
||||
customers_without_bill_addresses.find_each do |customer|
|
||||
split_customer_name!(customer)
|
||||
end
|
||||
end
|
||||
|
||||
def customers_with_bill_addresses
|
||||
Customer.joins(:bill_address).where(first_name: "", last_name: "").where.not(name: [nil, ""])
|
||||
end
|
||||
|
||||
def customers_without_bill_addresses
|
||||
Customer.where(bill_address_id: nil, first_name: "", last_name: "").where.not(name: [nil, ""])
|
||||
end
|
||||
|
||||
def bill_address_name_matches?(customer)
|
||||
customer.name.delete(" ") == (customer.bill_address.firstname + customer.bill_address.lastname).delete(" ")
|
||||
end
|
||||
|
||||
def split_customer_name!(customer)
|
||||
return if (name_parts = customer.name.split(' ')).empty?
|
||||
|
||||
customer.update_columns(
|
||||
first_name: name_parts.first,
|
||||
last_name: name_parts[1..].join(' '),
|
||||
updated_at: Time.zone.now
|
||||
)
|
||||
end
|
||||
|
||||
def apply_name_from_bill_address!(customer)
|
||||
customer.update_columns(
|
||||
first_name: customer.bill_address.firstname,
|
||||
last_name: customer.bill_address.lastname,
|
||||
updated_at: Time.zone.now
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
43
spec/migrations/split_customer_names_spec.rb
Normal file
43
spec/migrations/split_customer_names_spec.rb
Normal file
@@ -0,0 +1,43 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'spec_helper'
|
||||
require_relative '../../db/migrate/20220105085730_migrate_customers_data'
|
||||
|
||||
describe MigrateCustomersData do
|
||||
let!(:customer1) {
|
||||
create(:customer, name: "Timmy Test", first_name: "", last_name: "", bill_address: nil)
|
||||
}
|
||||
let!(:customer2) {
|
||||
create(:customer, name: "Frank Lee Ridiculous", first_name: "", last_name: "",
|
||||
bill_address: create(:address, first_name: "Frank Lee", last_name: "Ridiculous"))
|
||||
}
|
||||
let!(:customer3) {
|
||||
create(:customer, name: "Shia Le Boeuf", first_name: "", last_name: "",
|
||||
bill_address: create(:address, first_name: "Shia", last_name: "Le Boeuf"))
|
||||
}
|
||||
let!(:customer4) {
|
||||
create(:customer, name: "No Eyed Deer", first_name: "", last_name: "", bill_address: nil)
|
||||
}
|
||||
let!(:customer5) {
|
||||
create(:customer, name: " Space Invader ", first_name: "", last_name: "", bill_address: nil)
|
||||
}
|
||||
let!(:customer6) {
|
||||
create(:customer, name: "How Many Names Do You Need?", first_name: "", last_name: "", bill_address: nil)
|
||||
}
|
||||
let!(:customer7) {
|
||||
create(:customer, name: "Customer Name", first_name: "", last_name: "",
|
||||
bill_address: create(:address, first_name: "Different", last_name: "AddressName"))
|
||||
}
|
||||
|
||||
it "migrates customer names" do
|
||||
subject.up
|
||||
|
||||
expect([customer1.reload.first_name, customer1.last_name]).to eq ["Timmy", "Test"]
|
||||
expect([customer2.reload.first_name, customer2.last_name]).to eq ["Frank Lee", "Ridiculous"]
|
||||
expect([customer3.reload.first_name, customer3.last_name]).to eq ["Shia", "Le Boeuf"]
|
||||
expect([customer4.reload.first_name, customer4.last_name]).to eq ["No", "Eyed Deer"]
|
||||
expect([customer5.reload.first_name, customer5.last_name]).to eq ["Space", "Invader"]
|
||||
expect([customer6.reload.first_name, customer6.last_name]).to eq ["How", "Many Names Do You Need?"]
|
||||
expect([customer7.reload.first_name, customer7.last_name]).to eq ["Customer", "Name"]
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user