/** * @param array $addressData * @param Mage_Customer_Model_Address|null $newAddress * @param Mage_Customer_Model_Address|null $existingAddress * @param array $addressCollection * @param bool $dataChanged * @param bool $expectedDataChange * @dataProvider addressesDataProvider */ public function testPrepareCustomerAddressForSave(array $addressData, $newAddress, $existingAddress, array $addressCollection, $dataChanged, $expectedDataChange) { $this->_customer->setDataChanges($dataChanged); $this->_customer->expects($this->any())->method('getId')->will($this->returnValue(1)); $this->_customer->expects($this->once())->method('getAddressesCollection')->will($this->returnValue($addressCollection)); if ($newAddress) { // Check that customer_id is set for new addresses $newAddress->expects($this->once())->method('setCustomerId')->with(1); // Check that new address is added to customer address collection $this->_customer->expects($this->once())->method('addAddress'); // Check that new address is not deleted $newAddress->expects($this->never())->method('setData')->with('_deleted', true); } // Check that address loaded from customer address collection if ($existingAddress && $addressData) { $this->_customer->expects($this->once())->method('getAddressItemById')->with($existingAddress->getId())->will($this->returnValue($existingAddress)); } // Check that new data is added $hasExistingAddress = false; foreach ($addressData as $data) { if (array_key_exists('entity_id', $addressData)) { unset($data['entity_id']); $existingAddress->expects($this->once())->method('addData')->with($data); $hasExistingAddress = true; } elseif ($newAddress) { $newAddress->expects($this->once())->method('addData')->with($data); } } // Check that addresses is deleted if (in_array($existingAddress, $addressCollection) && !$hasExistingAddress) { $existingAddress->expects($this->atLeastOnce())->method('setData')->with('_deleted', true); } $this->assertInstanceOf('Mage_Customer_Model_Customer', $this->_service->update(1, array(), $addressData), 'Incorrect instance returned'); $this->assertEquals($expectedDataChange, $this->_customer->hasDataChanges(), 'Customer change data status is incorrect'); }
/** * Save customer addresses. * * @param Mage_Customer_Model_Customer $customer * @param array $addressesData * @throws Mage_Core_Exception */ protected function _prepareCustomerAddressesForSave($customer, array $addressesData) { $hasChanges = $customer->hasDataChanges(); $actualAddressesIds = array(); foreach ($addressesData as $addressData) { $addressId = null; if (array_key_exists('entity_id', $addressData)) { $addressId = $addressData['entity_id']; unset($addressData['entity_id']); } if (null !== $addressId) { $address = $customer->getAddressItemById($addressId); if (!$address || !$address->getId()) { throw new Mage_Core_Exception($this->_translateHelper->__('The address with the specified ID not found.')); } } else { $address = $this->_addressFactory->create(); $address->setCustomerId($customer->getId()); // Add customer address into addresses collection $customer->addAddress($address); } $address->addData($addressData); $hasChanges = $hasChanges || $address->hasDataChanges(); // Set post_index for detect default billing and shipping addresses $address->setPostIndex($addressId); $actualAddressesIds[] = $address->getId(); } /** @var Mage_Customer_Model_Address $address */ foreach ($customer->getAddressesCollection() as $address) { if (!in_array($address->getId(), $actualAddressesIds)) { $address->setData('_deleted', true); $hasChanges = true; } } $customer->setDataChanges($hasChanges); }