diff --git a/src/Audit.php b/src/Audit.php index 00de95d0..899c4765 100644 --- a/src/Audit.php +++ b/src/Audit.php @@ -145,6 +145,8 @@ protected function getFormattedValue(Model $model, string $key, $value) $value = $this->castDatetimeUTC($model, $value); } + unset($model->classCastCache[$key]); + return $model->castAttribute($key, $value); } diff --git a/tests/Casts/Money.php b/tests/Casts/Money.php new file mode 100644 index 00000000..48df70fd --- /dev/null +++ b/tests/Casts/Money.php @@ -0,0 +1,26 @@ + 'bool', 'config' => 'json', 'published_at' => 'datetime', + 'price' => Money::class, ]; /** diff --git a/tests/Models/Money.php b/tests/Models/Money.php new file mode 100644 index 00000000..82287df4 --- /dev/null +++ b/tests/Models/Money.php @@ -0,0 +1,26 @@ +formatted = $formatter->formatCurrency($this->amount, $this->currency); + } +} + diff --git a/tests/Unit/AuditTest.php b/tests/Unit/AuditTest.php index 0bd2b44c..d8181de1 100644 --- a/tests/Unit/AuditTest.php +++ b/tests/Unit/AuditTest.php @@ -8,6 +8,7 @@ use OwenIt\Auditing\Models\Audit; use OwenIt\Auditing\Redactors\LeftRedactor; use OwenIt\Auditing\Tests\Models\Article; +use OwenIt\Auditing\Tests\Models\Money; use OwenIt\Auditing\Tests\Models\User; class AuditTest extends AuditingTestCase @@ -148,6 +149,39 @@ public function itReturnsTheAppropriateAuditableDataValues() $this->assertNull($audit->getDataValue('invalid_key')); } + /** + * @group Audit::resolveData + * @group Audit::getDataValue + * @test + */ + public function itReturnsTheAppropriateAuditableDataValuesWithCustomCastValueObject() + { + $user = factory(User::class)->create([ + 'is_admin' => 1, + 'first_name' => 'rick', + 'last_name' => 'Sanchez', + 'email' => 'rick@wubba-lubba-dub.dub', + ]); + + $this->actingAs($user); + + $article = factory(Article::class)->create([ + 'title' => 'How To Audit Eloquent Models', + 'content' => 'First step: install the laravel-auditing package.', + 'reviewed' => 1, + 'published_at' => Carbon::now(), + 'price' => '12.45', + ]); + + $article->price = '24.68'; + $article->save(); + + $lastAudit = $article->audits()->skip(1)->first(); + + $this->assertEquals(new Money('24.68', 'USD'), $lastAudit->getModified()['price']['new']); + $this->assertEquals(new Money('12.45', 'USD'), $lastAudit->getModified()['price']['old']); + } + /** * @group Audit::getMetadata * @test diff --git a/tests/database/migrations/0000_00_00_000003_create_articles_test_table.php b/tests/database/migrations/0000_00_00_000003_create_articles_test_table.php index 6a47eade..4e0107af 100644 --- a/tests/database/migrations/0000_00_00_000003_create_articles_test_table.php +++ b/tests/database/migrations/0000_00_00_000003_create_articles_test_table.php @@ -20,6 +20,7 @@ public function up() $table->boolean('reviewed'); $table->timestamp('published_at')->nullable(); $table->json('config')->nullable(); + $table->string('price')->nullable(); $table->timestamps(); $table->softDeletes(); });