|
9 | 9 | namespace Tests\Unit;
|
10 | 10 |
|
11 | 11 | use Carsdotcom\JsonSchemaValidation\Exceptions\JsonSchemaValidationException;
|
| 12 | +use Carsdotcom\LaravelJsonModel\Casts\CastFloatOrUnset; |
| 13 | +use Carsdotcom\LaravelJsonModel\Casts\CastNonEmptyStringOrUnset; |
| 14 | +use Carsdotcom\LaravelJsonModel\Casts\CastStringOrUnset; |
12 | 15 | use Carsdotcom\LaravelJsonModel\CollectionOfJsonModels;
|
13 | 16 | use Carsdotcom\JsonSchemaValidation\SchemaValidator as SchemaValidator;
|
14 | 17 | use Carsdotcom\LaravelJsonModel\JsonModel;
|
@@ -903,6 +906,79 @@ public function testSafeUpdateRecursiveIncludesAttributeMutators(): void
|
903 | 906 | "Sorry, Starbuck is not a valid choice for Best Star Trek Captain."
|
904 | 907 | ], array_map(fn ($e) => ($e instanceof JsonSchemaValidationException) ? $e->errorsAsMultilineString() : $e->getMessage(), $caughtExceptions));
|
905 | 908 | }
|
| 909 | + |
| 910 | + public function testCastFloatOrUnset(): void |
| 911 | + { |
| 912 | + $jsonModel = new class extends JsonModel{ |
| 913 | + protected $casts = [ |
| 914 | + 'fou' => CastFloatOrUnset::class |
| 915 | + ]; |
| 916 | + }; |
| 917 | + |
| 918 | + self::assertFalse(isset($jsonModel->fou), "Initializes unset"); |
| 919 | + $jsonModel->fou = null; |
| 920 | + self::assertFalse(isset($jsonModel->fou), "Stays unset on initialize to null"); |
| 921 | + $jsonModel->fou = 6.9; |
| 922 | + self::assertSame(6.9, $jsonModel->fou, "Float is unchanged"); |
| 923 | + $jsonModel->fou = '6'; |
| 924 | + self::assertSame(6.0, $jsonModel->fou, "String is cast"); |
| 925 | + $jsonModel->fou = 9; |
| 926 | + self::assertSame(9.0, $jsonModel->fou, "int is cast"); |
| 927 | + self::assertStringContainsString('"fou":9', $jsonModel->toJson()); |
| 928 | + $jsonModel->fou = null; |
| 929 | + self::assertFalse(isset($jsonModel->fou), "Set to null unsets attribute"); |
| 930 | + self::assertStringNotContainsString('fou', $jsonModel->toJson()); |
| 931 | + } |
| 932 | + |
| 933 | + public function testCastStringOrUnset(): void |
| 934 | + { |
| 935 | + $jsonModel = new class extends JsonModel{ |
| 936 | + protected $casts = [ |
| 937 | + 'sou' => CastStringOrUnset::class |
| 938 | + ]; |
| 939 | + }; |
| 940 | + |
| 941 | + self::assertFalse(isset($jsonModel->sou), "Initializes unset"); |
| 942 | + $jsonModel->sou = null; |
| 943 | + self::assertFalse(isset($jsonModel->sou), "Stays unset on initialize to null"); |
| 944 | + $jsonModel->sou = 'happy happy'; |
| 945 | + self::assertSame('happy happy', $jsonModel->sou, "String is unchanged"); |
| 946 | + $jsonModel->sou = 6; |
| 947 | + self::assertSame('6', $jsonModel->sou, "int is cast"); |
| 948 | + $jsonModel->sou = false; |
| 949 | + self::assertSame('', $jsonModel->sou, "bool is cast"); |
| 950 | + self::assertStringContainsString('"sou":""', $jsonModel->toJson()); |
| 951 | + $jsonModel->sou = null; |
| 952 | + self::assertFalse(isset($jsonModel->sou), "Set to null unsets attribute"); |
| 953 | + self::assertStringNotContainsString('sou', $jsonModel->toJson()); |
| 954 | + } |
| 955 | + |
| 956 | + public function testCastNonEmptyStringOrUnset(): void |
| 957 | + { |
| 958 | + $jsonModel = new class extends JsonModel{ |
| 959 | + protected $casts = [ |
| 960 | + 'sou' => CastNonEmptyStringOrUnset::class |
| 961 | + ]; |
| 962 | + }; |
| 963 | + |
| 964 | + self::assertFalse(isset($jsonModel->sou), "Initializes unset"); |
| 965 | + $jsonModel->sou = null; |
| 966 | + self::assertFalse(isset($jsonModel->sou), "Stays unset on initialize to null"); |
| 967 | + $jsonModel->sou = 'happy happy'; |
| 968 | + self::assertSame('happy happy', $jsonModel->sou, "String is unchanged"); |
| 969 | + |
| 970 | + $jsonModel->sou = ''; |
| 971 | + self::assertFalse(isset($jsonModel->sou), "Set to empty string unsets attribute"); |
| 972 | + self::assertStringNotContainsString('sou', $jsonModel->toJson()); |
| 973 | + |
| 974 | + $jsonModel->sou = 6; |
| 975 | + self::assertSame('6', $jsonModel->sou, "int is cast"); |
| 976 | + self::assertStringContainsString('"sou":"6"', $jsonModel->toJson()); |
| 977 | + |
| 978 | + $jsonModel->sou = null; |
| 979 | + self::assertFalse(isset($jsonModel->sou), "Set to null unsets attribute"); |
| 980 | + self::assertStringNotContainsString('sou', $jsonModel->toJson()); |
| 981 | + } |
906 | 982 | }
|
907 | 983 |
|
908 | 984 | /**
|
|
0 commit comments