Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
| 1 | <?php |
||
| 3 | namespace Dynamic\FoxyStripe\Test; |
||
| 4 | |||
| 5 | use Dynamic\FoxyStripe\Model\OptionGroup; |
||
| 6 | use Dynamic\FoxyStripe\Model\OptionItem; |
||
| 7 | use SilverStripe\Dev\SapphireTest; |
||
| 8 | use SilverStripe\Forms\RequiredFields; |
||
| 9 | use SilverStripe\ORM\ValidationException; |
||
| 10 | use SilverStripe\Security\Member; |
||
| 11 | |||
| 12 | class OptionGroupTest extends SapphireTest |
||
| 13 | { |
||
| 14 | /** |
||
| 15 | * @var string |
||
| 16 | */ |
||
| 17 | protected static $fixture_file = 'fixtures.yml'; |
||
| 18 | |||
| 19 | /** |
||
| 20 | * |
||
| 21 | */ |
||
| 22 | public function testGetCMSValidator() |
||
| 23 | { |
||
| 24 | $object = $this->objFromFixture(OptionGroup::class, 'size'); |
||
| 25 | $this->assertInstanceOf(RequiredFields::class, $object->getCMSValidator()); |
||
| 26 | } |
||
| 27 | |||
| 28 | /** |
||
| 29 | * @throws ValidationException |
||
| 30 | */ |
||
| 31 | public function testValidateTitle() |
||
| 32 | { |
||
| 33 | $object = $this->objFromFixture(OptionGroup::class, 'size'); |
||
| 34 | $orig = $object->Title; |
||
| 35 | $object->Title = '2'.$orig; |
||
| 36 | $this->expectException(ValidationException::class); |
||
| 37 | $object->write(); |
||
| 38 | |||
| 39 | $object->Title = $orig.'&'; |
||
| 40 | $this->expectException(ValidationException::class); |
||
| 41 | $object->write(); |
||
| 42 | } |
||
| 43 | |||
| 44 | /** |
||
| 45 | * |
||
| 46 | */ |
||
| 47 | public function testOnBeforeDelete() |
||
| 48 | { |
||
| 49 | $group = $this->objFromFixture(OptionGroup::class, 'size'); |
||
| 50 | $item = $this->objFromFixture(OptionItem::class, 'large'); |
||
| 51 | $this->assertEquals($item->ProductOptionGroupID, $group->ID); |
||
| 52 | |||
| 53 | $groupID = $group->ID; |
||
| 54 | $group->delete(); |
||
| 55 | $this->assertNull(OptionGroup::get()->byID($groupID)); |
||
| 56 | |||
| 57 | // assert that the new child has been reassigned |
||
| 58 | $group2 = $this->objFromFixture(OptionGroup::class, 'default'); |
||
| 59 | $item2 = OptionItem::get()->byID($item->ID); |
||
| 60 | $this->assertEquals($item2->ProductOptionGroupID, $group2->ID); |
||
| 61 | } |
||
| 62 | |||
| 63 | /** |
||
| 64 | * |
||
| 65 | */ |
||
| 66 | public function testCanView() |
||
| 67 | { |
||
| 68 | $object = $this->objFromFixture(OptionGroup::class, 'size'); |
||
| 69 | $admin = $this->objFromFixture(Member::class, 'admin'); |
||
| 70 | $this->assertTrue($object->canView($admin)); |
||
| 71 | $member = $this->objFromFixture(Member::class, 'customer'); |
||
| 72 | $this->assertTrue($object->canView($member)); |
||
| 73 | } |
||
| 74 | |||
| 75 | /** |
||
| 76 | * |
||
| 77 | */ |
||
| 78 | public function testCanEdit() |
||
| 88 | } |
||
| 89 | |||
| 90 | /** |
||
| 91 | * |
||
| 92 | */ |
||
| 93 | public function testCanDelete() |
||
| 103 | } |
||
| 104 | |||
| 105 | /** |
||
| 106 | * |
||
| 107 | */ |
||
| 117 |