123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374 |
- <?php
- namespace Spatie\EloquentSortable\Test;
- use Illuminate\Support\Collection;
- class SortableTest extends TestCase
- {
- /** @test */
- public function it_sets_the_order_column_on_creation()
- {
- foreach (Dummy::all() as $dummy) {
- $this->assertEquals($dummy->name, $dummy->order_column);
- }
- }
- /** @test */
- public function it_can_get_the_highest_order_number()
- {
- $this->assertEquals(Dummy::all()->count(), (new Dummy())->getHighestOrderNumber());
- }
- /** @test */
- public function it_can_get_the_highest_order_number_with_trashed_models()
- {
- $this->setUpSoftDeletes();
- DummyWithSoftDeletes::first()->delete();
- $this->assertEquals(DummyWithSoftDeletes::withTrashed()->count(), (new DummyWithSoftDeletes())->getHighestOrderNumber());
- }
- /** @test */
- public function it_can_set_a_new_order()
- {
- $newOrder = Collection::make(Dummy::all()->pluck('id'))->shuffle()->toArray();
- Dummy::setNewOrder($newOrder);
- foreach (Dummy::orderBy('order_column')->get() as $i => $dummy) {
- $this->assertEquals($newOrder[$i], $dummy->id);
- }
- }
- /** @test */
- public function it_can_set_a_new_order_by_custom_column()
- {
- $newOrder = Collection::make(Dummy::all()->pluck('custom_column_sort'))->shuffle()->toArray();
- Dummy::setNewOrderByCustomColumn('custom_column_sort', $newOrder);
- foreach (Dummy::orderBy('order_column')->get() as $i => $dummy) {
- $this->assertEquals($newOrder[$i], $dummy->custom_column_sort);
- }
- }
- /** @test */
- public function it_can_set_a_new_order_from_collection()
- {
- $newOrder = Collection::make(Dummy::all()->pluck('id'))->shuffle();
- Dummy::setNewOrder($newOrder);
- foreach (Dummy::orderBy('order_column')->get() as $i => $dummy) {
- $this->assertEquals($newOrder[$i], $dummy->id);
- }
- }
- /** @test */
- public function it_can_set_a_new_order_by_custom_column_from_collection()
- {
- $newOrder = Collection::make(Dummy::all()->pluck('custom_column_sort'))->shuffle();
- Dummy::setNewOrderByCustomColumn('custom_column_sort', $newOrder);
- foreach (Dummy::orderBy('order_column')->get() as $i => $dummy) {
- $this->assertEquals($newOrder[$i], $dummy->custom_column_sort);
- }
- }
- /** @test */
- public function it_can_set_a_new_order_with_trashed_models()
- {
- $this->setUpSoftDeletes();
- $dummies = DummyWithSoftDeletes::all();
- $dummies->random()->delete();
- $newOrder = Collection::make($dummies->pluck('id'))->shuffle();
- DummyWithSoftDeletes::setNewOrder($newOrder);
- foreach (DummyWithSoftDeletes::withTrashed()->orderBy('order_column')->get() as $i => $dummy) {
- $this->assertEquals($newOrder[$i], $dummy->id);
- }
- }
- /** @test */
- public function it_can_set_a_new_order_by_custom_column_with_trashed_models()
- {
- $this->setUpSoftDeletes();
- $dummies = DummyWithSoftDeletes::all();
- $dummies->random()->delete();
- $newOrder = Collection::make($dummies->pluck('custom_column_sort'))->shuffle();
- DummyWithSoftDeletes::setNewOrderByCustomColumn('custom_column_sort', $newOrder);
- foreach (DummyWithSoftDeletes::withTrashed()->orderBy('order_column')->get() as $i => $dummy) {
- $this->assertEquals($newOrder[$i], $dummy->custom_column_sort);
- }
- }
- /** @test */
- public function it_can_set_a_new_order_without_trashed_models()
- {
- $this->setUpSoftDeletes();
- DummyWithSoftDeletes::first()->delete();
- $newOrder = Collection::make(DummyWithSoftDeletes::pluck('id'))->shuffle();
- DummyWithSoftDeletes::setNewOrder($newOrder);
- foreach (DummyWithSoftDeletes::orderBy('order_column')->get() as $i => $dummy) {
- $this->assertEquals($newOrder[$i], $dummy->id);
- }
- }
- /** @test */
- public function it_can_set_a_new_order_by_custom_column_without_trashed_models()
- {
- $this->setUpSoftDeletes();
- DummyWithSoftDeletes::first()->delete();
- $newOrder = Collection::make(DummyWithSoftDeletes::pluck('custom_column_sort'))->shuffle();
- DummyWithSoftDeletes::setNewOrderByCustomColumn('custom_column_sort', $newOrder);
- foreach (DummyWithSoftDeletes::orderBy('order_column')->get() as $i => $dummy) {
- $this->assertEquals($newOrder[$i], $dummy->custom_column_sort);
- }
- }
- /** @test */
- public function it_will_determine_to_sort_when_creating_if_sortable_attribute_does_not_exist()
- {
- $model = new Dummy();
- $this->assertTrue($model->shouldSortWhenCreating());
- }
- /** @test */
- public function it_will_determine_to_sort_when_creating_if_sort_when_creating_setting_does_not_exist()
- {
- $model = new class () extends Dummy {
- public $sortable = [];
- };
- $this->assertTrue($model->shouldSortWhenCreating());
- }
- /** @test */
- public function it_will_respect_the_sort_when_creating_setting()
- {
- $model = new class () extends Dummy {
- public $sortable = ['sort_when_creating' => true];
- };
- $this->assertTrue($model->shouldSortWhenCreating());
- $model = new class () extends Dummy {
- public $sortable = ['sort_when_creating' => false];
- };
- $this->assertFalse($model->shouldSortWhenCreating());
- }
- /** @test */
- public function it_provides_an_ordered_trait()
- {
- $i = 1;
- foreach (Dummy::ordered()->get()->pluck('order_column') as $order) {
- $this->assertEquals($i++, $order);
- }
- }
- /** @test */
- public function it_can_move_the_order_down()
- {
- $firstModel = Dummy::find(3);
- $secondModel = Dummy::find(4);
- $this->assertEquals($firstModel->order_column, 3);
- $this->assertEquals($secondModel->order_column, 4);
- $this->assertNotFalse($firstModel->moveOrderDown());
- $firstModel = Dummy::find(3);
- $secondModel = Dummy::find(4);
- $this->assertEquals($firstModel->order_column, 4);
- $this->assertEquals($secondModel->order_column, 3);
- }
- /** @test */
- public function it_will_not_fail_when_it_cant_move_the_order_down()
- {
- $lastModel = Dummy::all()->last();
- $this->assertEquals($lastModel->order_column, 20);
- $this->assertEquals($lastModel, $lastModel->moveOrderDown());
- }
- /** @test */
- public function it_can_move_the_order_up()
- {
- $firstModel = Dummy::find(3);
- $secondModel = Dummy::find(4);
- $this->assertEquals($firstModel->order_column, 3);
- $this->assertEquals($secondModel->order_column, 4);
- $this->assertNotFalse($secondModel->moveOrderUp());
- $firstModel = Dummy::find(3);
- $secondModel = Dummy::find(4);
- $this->assertEquals($firstModel->order_column, 4);
- $this->assertEquals($secondModel->order_column, 3);
- }
- /** @test */
- public function it_will_not_break_when_it_cant_move_the_order_up()
- {
- $lastModel = Dummy::first();
- $this->assertEquals($lastModel->order_column, 1);
- $this->assertEquals($lastModel, $lastModel->moveOrderUp());
- }
- /** @test */
- public function it_can_swap_the_position_of_two_given_models()
- {
- $firstModel = Dummy::find(3);
- $secondModel = Dummy::find(4);
- $this->assertEquals($firstModel->order_column, 3);
- $this->assertEquals($secondModel->order_column, 4);
- Dummy::swapOrder($firstModel, $secondModel);
- $this->assertEquals($firstModel->order_column, 4);
- $this->assertEquals($secondModel->order_column, 3);
- }
- /** @test */
- public function it_can_swap_itself_with_another_model()
- {
- $firstModel = Dummy::find(3);
- $secondModel = Dummy::find(4);
- $this->assertEquals($firstModel->order_column, 3);
- $this->assertEquals($secondModel->order_column, 4);
- $firstModel->swapOrderWithModel($secondModel);
- $this->assertEquals($firstModel->order_column, 4);
- $this->assertEquals($secondModel->order_column, 3);
- }
- /** @test */
- public function it_can_move_a_model_to_the_first_place()
- {
- $position = 3;
- $oldModels = Dummy::whereNot('id', $position)->get();
- $model = Dummy::find($position);
- $this->assertEquals(3, $model->order_column);
- $model = $model->moveToStart();
- $this->assertEquals(1, $model->order_column);
- $oldModels = $oldModels->pluck('order_column', 'id');
- $newModels = Dummy::whereNot('id', $position)->get()->pluck('order_column', 'id');
- foreach ($oldModels as $key => $oldModel) {
- $this->assertEquals($oldModel + 1, $newModels[$key]);
- }
- }
- /**
- * @test
- */
- public function it_can_move_a_model_to_the_last_place()
- {
- $position = 3;
- $oldModels = Dummy::whereNot('id', $position)->get();
- $model = Dummy::find($position);
- $this->assertNotEquals(20, $model->order_column);
- $model = $model->moveToEnd();
- $this->assertEquals(20, $model->order_column);
- $oldModels = $oldModels->pluck('order_column', 'id');
- $newModels = Dummy::whereNot('id', $position)->get()->pluck('order_column', 'id');
- foreach ($oldModels as $key => $order) {
- if ($order > $position) {
- $this->assertEquals($order - 1, $newModels[$key]);
- } else {
- $this->assertEquals($order, $newModels[$key]);
- }
- }
- }
- /** @test */
- public function it_can_use_config_properties()
- {
- config([
- 'eloquent-sortable.order_column_name' => 'order_column',
- 'eloquent-sortable.sort_when_creating' => true,
- ]);
- $model = new class () extends Dummy {
- public $sortable = [];
- };
- $this->assertEquals(config('eloquent-sortable.order_column_name'), $model->determineOrderColumnName());
- $this->assertEquals(config('eloquent-sortable.sort_when_creating'), $model->shouldSortWhenCreating());
- }
- /** @test */
- public function it_can_override_config_properties()
- {
- $model = new class () extends Dummy {
- public $sortable = [
- 'order_column_name' => 'my_custom_order_column',
- 'sort_when_creating' => false,
- ];
- };
- $this->assertEquals($model->determineOrderColumnName(), 'my_custom_order_column');
- $this->assertFalse($model->shouldSortWhenCreating());
- }
- /** @test */
- public function it_can_tell_if_element_is_first_in_order()
- {
- $model = (new Dummy())->buildSortQuery()->get();
- $this->assertTrue($model[0]->isFirstInOrder());
- $this->assertFalse($model[1]->isFirstInOrder());
- }
- /** @test */
- public function it_can_tell_if_element_is_last_in_order()
- {
- $model = (new Dummy())->buildSortQuery()->get();
- $this->assertTrue($model[$model->count() - 1]->isLastInOrder());
- $this->assertFalse($model[$model->count() - 2]->isLastInOrder());
- }
- }
|