public function testFileDelete()
 {
     /** @var AssetControlExtensionTest_VersionedObject $object1 */
     $object1 = AssetControlExtensionTest_VersionedObject::get()->filter('Title', 'My object')->first();
     /** @var AssetControlExtensionTest_Object $object2 */
     $object2 = AssetControlExtensionTest_Object::get()->filter('Title', 'Unversioned')->first();
     /** @var AssetControlExtensionTest_ArchivedObject $object3 */
     $object3 = AssetControlExtensionTest_ArchivedObject::get()->filter('Title', 'Archived')->first();
     $this->assertTrue($object1->Download->exists());
     $this->assertTrue($object1->Header->exists());
     $this->assertTrue($object2->Image->exists());
     $this->assertTrue($object3->Header->exists());
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $object1->Download->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $object1->Header->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $object2->Image->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $object3->Header->getVisibility());
     // Check live stage for versioned objects
     $object1Live = Versioned::get_one_by_stage('AssetControlExtensionTest_VersionedObject', 'Live', array('"ID"' => $object1->ID));
     $object3Live = Versioned::get_one_by_stage('AssetControlExtensionTest_ArchivedObject', 'Live', array('"ID"' => $object3->ID));
     $this->assertTrue($object1Live->Download->exists());
     $this->assertTrue($object1Live->Header->exists());
     $this->assertTrue($object3Live->Header->exists());
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $object1Live->Download->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $object1Live->Header->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $object3Live->Header->getVisibility());
     // Delete live records; Should cause versioned records to be protected
     $object1Live->deleteFromStage('Live');
     $object3Live->deleteFromStage('Live');
     $this->assertTrue($object1->Download->exists());
     $this->assertTrue($object1->Header->exists());
     $this->assertTrue($object3->Header->exists());
     $this->assertTrue($object1Live->Download->exists());
     $this->assertTrue($object1Live->Header->exists());
     $this->assertTrue($object3Live->Header->exists());
     $this->assertEquals(AssetStore::VISIBILITY_PROTECTED, $object1->Download->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PROTECTED, $object1->Header->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PROTECTED, $object3->Header->getVisibility());
     // Delete draft record; Should remove all records
     // Archived assets only should remain
     $object1->delete();
     $object2->delete();
     $object3->delete();
     $this->assertFalse($object1->Download->exists());
     $this->assertFalse($object1->Header->exists());
     $this->assertFalse($object2->Image->exists());
     $this->assertTrue($object3->Header->exists());
     $this->assertFalse($object1Live->Download->exists());
     $this->assertFalse($object1Live->Header->exists());
     $this->assertTrue($object3Live->Header->exists());
     $this->assertNull($object1->Download->getVisibility());
     $this->assertNull($object1->Header->getVisibility());
     $this->assertNull($object2->Image->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PROTECTED, $object3->Header->getVisibility());
 }
 /**
  * Test files being replaced
  */
 public function testReplaceFile()
 {
     \Versioned::reading_stage('Stage');
     /** @var AssetControlExtensionTest_VersionedObject $object1 */
     $object1 = AssetControlExtensionTest_VersionedObject::get()->filter('Title', 'My object')->first();
     /** @var AssetControlExtensionTest_Object $object2 */
     $object2 = AssetControlExtensionTest_Object::get()->filter('Title', 'Unversioned')->first();
     /** @var AssetControlExtensionTest_ArchivedObject $object3 */
     $object3 = AssetControlExtensionTest_ArchivedObject::get()->filter('Title', 'Archived')->first();
     $object1TupleOld = $object1->Header->getValue();
     $object2TupleOld = $object2->Image->getValue();
     $object3TupleOld = $object3->Header->getValue();
     // Replace image and write each to filesystem
     $fish1 = realpath(__DIR__ . '/../model/testimages/test-image-high-quality.jpg');
     $object1->Header->setFromLocalFile($fish1, 'Header/Replaced_MyObjectHeader.jpg');
     $object1->write();
     $object2->Image->setFromLocalFile($fish1, 'Images/Replaced_BeautifulFish.jpg');
     $object2->write();
     $object3->Header->setFromLocalFile($fish1, 'Archived/Replaced_MyObjectHeader.jpg');
     $object3->write();
     // Check that old published records are left public, but removed for unversioned object2
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $this->getAssetStore()->getVisibility($object1TupleOld['Filename'], $object1TupleOld['Hash']));
     $this->assertEquals(null, $this->getAssetStore()->getVisibility($object2TupleOld['Filename'], $object2TupleOld['Hash']));
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $this->getAssetStore()->getVisibility($object3TupleOld['Filename'], $object3TupleOld['Hash']));
     // Check that visibility of new file is correct
     // Note that $object2 has no canView() is true, so assets end up public
     $this->assertEquals(AssetStore::VISIBILITY_PROTECTED, $object1->Header->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $object2->Image->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PROTECTED, $object3->Header->getVisibility());
     // Publish changes to versioned records
     $object1->doPublish();
     $object3->doPublish();
     // After publishing, old object1 is deleted, but since object3 has archiving enabled,
     // the orphaned file is intentionally left in the protected store
     $this->assertEquals(null, $this->getAssetStore()->getVisibility($object1TupleOld['Filename'], $object1TupleOld['Hash']));
     $this->assertEquals(AssetStore::VISIBILITY_PROTECTED, $this->getAssetStore()->getVisibility($object3TupleOld['Filename'], $object3TupleOld['Hash']));
     // And after publish, all files are public
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $object1->Header->getVisibility());
     $this->assertEquals(AssetStore::VISIBILITY_PUBLIC, $object3->Header->getVisibility());
 }