getLineCount($file); fgetcsv($file); // pop header row $compareRow = fgetcsv($file); $results = $loader->load($filepath); // Test that right amount of columns was imported $this->assertEquals($results, $compareCount-1, 'Test correct count of imported data'); // Test that columns were correctly imported $obj = Dataobject::get_one("CsvBulkLoaderTest_Player", "FirstName = 'John'"); $this->assertNotNull($obj); $this->assertEquals("He's a good guy", $obj->Biography); $this->assertEquals("1988-01-31", $obj->Birthday); fclose($file); } /** * Test import with manual column mapping */ function testLoadWithColumnMap() { $loader = new CsvBulkLoader('CsvBulkLoaderTest_Player'); $filepath = Director::baseFolder() . '/sapphire/tests/CsvBulkLoaderTest_Players.csv'; $file = fopen($filepath, 'r'); $compareCount = $this->getLineCount($file); $compareRow = fgetcsv($file); $loader->columnMap = array( 'FirstName', 'Biography', null, // ignored column 'Birthday' ); $results = $loader->load($filepath); // Test that right amount of columns was imported $this->assertEquals($results, $compareCount, 'Test correct count of imported data'); // Test that columns were correctly imported $obj = Dataobject::get_one("CsvBulkLoaderTest_Player", "FirstName = 'John'"); $this->assertNotNull($obj); $this->assertEquals("He's a good guy", $obj->Biography); $this->assertEquals("1988-01-31", $obj->Birthday); fclose($file); } /** * Test import with manual column mapping and custom column names */ function testLoadWithCustomHeaderAndRelation() { $loader = new CsvBulkLoader('CsvBulkLoaderTest_Player'); $filepath = Director::baseFolder() . '/sapphire/tests/CsvBulkLoaderTest_PlayersWithCustomHeaderAndRelation.csv'; $file = fopen($filepath, 'r'); $compareCount = $this->getLineCount($file); fgetcsv($file); // pop header row $compareRow = fgetcsv($file); $loader->columnMap = array( 'first name' => 'FirstName', 'bio' => 'Biography', 'bday' => 'Birthday', 'teamtitle' => 'Team.Title', // test existing relation 'teamsize' => 'Team.TeamSize', // test existing relation 'salary' => 'Contract.Amount' // test relation creation ); $loader->hasHeaderRow = true; $loader->relationCallbacks = array( 'Team.Title' => array( 'relationname' => 'Team', 'callback' => 'getTeamByTitle' ), // contract should be automatically discovered ); $results = $loader->load($filepath); // Test that right amount of columns was imported $this->assertEquals($results, $compareCount-1, 'Test correct count of imported data'); // Test of augumenting existing relation (created by fixture) $testTeam = DataObject::get_one('CsvBulkLoaderTest_Team', null, null, 'Created DESC'); $this->assertEquals('20', $testTeam->TeamSize, 'Augumenting existing has_one relation works'); // Test of creating relation $testContract = DataObject::get_one('CsvBulkLoaderTest_PlayerContract'); $testPlayer = Dataobject::get_one("CsvBulkLoaderTest_Player", "FirstName = 'John'"); $this->assertEquals($testPlayer->ContractID, $testContract->ID, 'Creating new has_one relation works'); // Test nested setting of relation properties $contractAmount = DBField::create('Currency', $compareRow[5])->RAW(); $this->assertEquals($testPlayer->Contract()->Amount, $contractAmount, 'Setting nested values in a relation works'); fclose($file); } /** * Test import with custom identifiers by importing the data. * * @todo Test duplicateCheck callbacks */ function testLoadWithIdentifiers() { // first load $loader = new CsvBulkLoader('CsvBulkLoaderTest_Player'); $filepath = Director::baseFolder() . '/sapphire/tests/CsvBulkLoaderTest_PlayersWithId.csv'; $loader->duplicateChecks = array( 'ExternalIdentifier' => 'ExternalIdentifier' ); $results = $loader->load($filepath); $player = DataObject::get_by_id('CsvBulkLoaderTest_Player', 1); $this->assertEquals($player->FirstName, 'John'); $this->assertEquals($player->Biography, 'He\'s a good guy', 'test updating of duplicate imports within the same import works'); // load with updated data $filepath = Director::baseFolder() . '/sapphire/tests/CsvBulkLoaderTest_PlayersWithIdUpdated.csv'; $results = $loader->load($filepath); $player = DataObject::get_by_id('CsvBulkLoaderTest_Player', 1); $this->assertEquals($player->FirstName, 'JohnUpdated', 'Test updating of existing records works'); $this->assertEquals($player->Biography, 'He\'s a good guy', 'Test retaining of previous information on duplicate when overwriting with blank field'); } protected function getLineCount(&$file) { $i = 0; while(fgets($file) !== false) $i++; rewind($file); return $i; } } class CsvBulkLoaderTest_Team extends DataObject implements TestOnly { static $db = array( 'Title' => 'Varchar(255)', 'TeamSize' => 'Int', ); static $has_many = array( 'Players' => 'CsvBulkLoaderTest_Player', ); } class CsvBulkLoaderTest_Player extends DataObject implements TestOnly { static $db = array( 'FirstName' => 'Varchar(255)', 'Biography' => 'HTMLText', 'Birthday' => 'Date', 'ExternalIdentifier' => 'Varchar(255)', // used for uniqueness checks on passed property ); static $has_one = array( 'Team' => 'CsvBulkLoaderTest_Team', 'Contract' => 'CsvBulkLoaderTest_PlayerContract' ); public function getTeamByTitle($title) { $SQL_title = Convert::raw2sql($title); return DataObject::get_one('CsvBulkLoaderTest_Team', "Title = '{$SQL_title}'"); } /** * Custom setter for "Birthday" property when passed/imported * in different format. * * @param string $val * @param array $record */ public function setUSBirthday($val, $record) { $this->Birthday = preg_replace('/^([0-9]{1,2})\/([0-9]{1,2})\/([0-90-9]{2,4})/', '\\3-\\1-\\2', $val); } } class CsvBulkLoaderTest_PlayerContract extends DataObject implements TestOnly { static $db = array( 'Amount' => 'Currency', ); } ?>