|
4 | 4 |
|
5 | 5 | namespace MongoDB\Laravel\Tests\Casts;
|
6 | 6 |
|
| 7 | +use Illuminate\Support\Exceptions\MathException; |
| 8 | +use MongoDB\BSON\Binary; |
7 | 9 | use MongoDB\BSON\Decimal128;
|
| 10 | +use MongoDB\BSON\Int64; |
| 11 | +use MongoDB\BSON\Javascript; |
| 12 | +use MongoDB\BSON\UTCDateTime; |
| 13 | +use MongoDB\Laravel\Collection; |
8 | 14 | use MongoDB\Laravel\Tests\Models\Casting;
|
9 | 15 | use MongoDB\Laravel\Tests\TestCase;
|
10 | 16 |
|
| 17 | +use function now; |
| 18 | + |
11 | 19 | class DecimalTest extends TestCase
|
12 | 20 | {
|
13 | 21 | protected function setUp(): void
|
@@ -73,4 +81,51 @@ public function testDecimalAsDecimal128(): void
|
73 | 81 | self::assertInstanceOf(Decimal128::class, $model->getRawOriginal('decimalNumber'));
|
74 | 82 | self::assertEquals('9999.90', $model->decimalNumber);
|
75 | 83 | }
|
| 84 | + |
| 85 | + public function testOtherBSONTypes(): void |
| 86 | + { |
| 87 | + $modelId = $this->setBSONType(new Int64(100)); |
| 88 | + $model = Casting::query()->find($modelId); |
| 89 | + |
| 90 | + self::assertIsString($model->decimalNumber); |
| 91 | + self::assertIsInt($model->getRawOriginal('decimalNumber')); |
| 92 | + self::assertEquals('100.00', $model->decimalNumber); |
| 93 | + |
| 94 | + // Update decimalNumber to a Binary type |
| 95 | + $this->setBSONType(new Binary('100.1234', Binary::TYPE_GENERIC), $modelId); |
| 96 | + $model->refresh(); |
| 97 | + |
| 98 | + self::assertIsString($model->decimalNumber); |
| 99 | + self::assertInstanceOf(Binary::class, $model->getRawOriginal('decimalNumber')); |
| 100 | + self::assertEquals('100.12', $model->decimalNumber); |
| 101 | + |
| 102 | + $this->setBSONType(new Javascript('function() { return 100; }'), $modelId); |
| 103 | + $model->refresh(); |
| 104 | + self::expectException(MathException::class); |
| 105 | + self::expectExceptionMessage('Unable to cast value to a decimal.'); |
| 106 | + $model->decimalNumber; |
| 107 | + self::assertInstanceOf(Javascript::class, $model->getRawOriginal('decimalNumber')); |
| 108 | + |
| 109 | + $this->setBSONType(new UTCDateTime(now()), $modelId); |
| 110 | + $model->refresh(); |
| 111 | + self::expectException(MathException::class); |
| 112 | + self::expectExceptionMessage('Unable to cast value to a decimal.'); |
| 113 | + $model->decimalNumber; |
| 114 | + self::assertInstanceOf(UTCDateTime::class, $model->getRawOriginal('decimalNumber')); |
| 115 | + } |
| 116 | + |
| 117 | + private function setBSONType($value, $id = null) |
| 118 | + { |
| 119 | + // Do a raw insert/update, so we can enforce the type we want |
| 120 | + return Casting::raw(function (Collection $collection) use ($id, $value) { |
| 121 | + if (! empty($id)) { |
| 122 | + return $collection->updateOne( |
| 123 | + ['_id' => $id], |
| 124 | + ['$set' => ['decimalNumber' => $value]], |
| 125 | + ); |
| 126 | + } |
| 127 | + |
| 128 | + return $collection->insertOne(['decimalNumber' => $value])->getInsertedId(); |
| 129 | + }); |
| 130 | + } |
76 | 131 | }
|
0 commit comments