DatabaseSoftDeletingScopeTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. <?php
  2. namespace Illuminate\Tests\Database;
  3. use Illuminate\Database\ConnectionInterface;
  4. use Illuminate\Database\Eloquent\Builder as EloquentBuilder;
  5. use Illuminate\Database\Eloquent\Model;
  6. use Illuminate\Database\Eloquent\SoftDeletingScope;
  7. use Illuminate\Database\Query\Builder as BaseBuilder;
  8. use Illuminate\Database\Query\Grammars\Grammar;
  9. use Illuminate\Database\Query\Processors\Processor;
  10. use Mockery as m;
  11. use PHPUnit\Framework\TestCase;
  12. use stdClass;
  13. class DatabaseSoftDeletingScopeTest extends TestCase
  14. {
  15. protected function tearDown(): void
  16. {
  17. m::close();
  18. }
  19. public function testApplyingScopeToABuilder()
  20. {
  21. $scope = m::mock(SoftDeletingScope::class.'[extend]');
  22. $builder = m::mock(EloquentBuilder::class);
  23. $model = m::mock(Model::class);
  24. $model->shouldReceive('getQualifiedDeletedAtColumn')->once()->andReturn('table.deleted_at');
  25. $builder->shouldReceive('whereNull')->once()->with('table.deleted_at');
  26. $scope->apply($builder, $model);
  27. }
  28. public function testRestoreExtension()
  29. {
  30. $builder = new EloquentBuilder(new BaseBuilder(
  31. m::mock(ConnectionInterface::class),
  32. m::mock(Grammar::class),
  33. m::mock(Processor::class)
  34. ));
  35. $scope = new SoftDeletingScope;
  36. $scope->extend($builder);
  37. $callback = $builder->getMacro('restore');
  38. $givenBuilder = m::mock(EloquentBuilder::class);
  39. $givenBuilder->shouldReceive('withTrashed')->once();
  40. $givenBuilder->shouldReceive('getModel')->once()->andReturn($model = m::mock(stdClass::class));
  41. $model->shouldReceive('getDeletedAtColumn')->once()->andReturn('deleted_at');
  42. $givenBuilder->shouldReceive('update')->once()->with(['deleted_at' => null]);
  43. $callback($givenBuilder);
  44. }
  45. public function testWithTrashedExtension()
  46. {
  47. $builder = new EloquentBuilder(new BaseBuilder(
  48. m::mock(ConnectionInterface::class),
  49. m::mock(Grammar::class),
  50. m::mock(Processor::class)
  51. ));
  52. $scope = m::mock(SoftDeletingScope::class.'[remove]');
  53. $scope->extend($builder);
  54. $callback = $builder->getMacro('withTrashed');
  55. $givenBuilder = m::mock(EloquentBuilder::class);
  56. $givenBuilder->shouldReceive('getModel')->andReturn($model = m::mock(Model::class));
  57. $givenBuilder->shouldReceive('withoutGlobalScope')->with($scope)->andReturn($givenBuilder);
  58. $result = $callback($givenBuilder);
  59. $this->assertEquals($givenBuilder, $result);
  60. }
  61. public function testOnlyTrashedExtension()
  62. {
  63. $builder = new EloquentBuilder(new BaseBuilder(
  64. m::mock(ConnectionInterface::class),
  65. m::mock(Grammar::class),
  66. m::mock(Processor::class)
  67. ));
  68. $model = m::mock(Model::class);
  69. $model->makePartial();
  70. $scope = m::mock(SoftDeletingScope::class.'[remove]');
  71. $scope->extend($builder);
  72. $callback = $builder->getMacro('onlyTrashed');
  73. $givenBuilder = m::mock(EloquentBuilder::class);
  74. $givenBuilder->shouldReceive('getQuery')->andReturn($query = m::mock(stdClass::class));
  75. $givenBuilder->shouldReceive('getModel')->andReturn($model);
  76. $givenBuilder->shouldReceive('withoutGlobalScope')->with($scope)->andReturn($givenBuilder);
  77. $model->shouldReceive('getQualifiedDeletedAtColumn')->andReturn('table.deleted_at');
  78. $givenBuilder->shouldReceive('whereNotNull')->once()->with('table.deleted_at');
  79. $result = $callback($givenBuilder);
  80. $this->assertEquals($givenBuilder, $result);
  81. }
  82. public function testWithoutTrashedExtension()
  83. {
  84. $builder = new EloquentBuilder(new BaseBuilder(
  85. m::mock(ConnectionInterface::class),
  86. m::mock(Grammar::class),
  87. m::mock(Processor::class)
  88. ));
  89. $model = m::mock(Model::class);
  90. $model->makePartial();
  91. $scope = m::mock(SoftDeletingScope::class.'[remove]');
  92. $scope->extend($builder);
  93. $callback = $builder->getMacro('withoutTrashed');
  94. $givenBuilder = m::mock(EloquentBuilder::class);
  95. $givenBuilder->shouldReceive('getQuery')->andReturn($query = m::mock(stdClass::class));
  96. $givenBuilder->shouldReceive('getModel')->andReturn($model);
  97. $givenBuilder->shouldReceive('withoutGlobalScope')->with($scope)->andReturn($givenBuilder);
  98. $model->shouldReceive('getQualifiedDeletedAtColumn')->andReturn('table.deleted_at');
  99. $givenBuilder->shouldReceive('whereNull')->once()->with('table.deleted_at');
  100. $result = $callback($givenBuilder);
  101. $this->assertEquals($givenBuilder, $result);
  102. }
  103. }