Skip to content

Commit 44b397b

Browse files
authored
Merge pull request #291 from RonasIT/strict-change-detection-in-TableTestState
fix: strict change detection in TableTestState
2 parents 1c078f5 + a35a8cb commit 44b397b

5 files changed

Lines changed: 104 additions & 1 deletion

File tree

src/Testing/TableTestState.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,12 @@ protected function getChanges(): array
6464
$deletedRecords[] = $originItem;
6565
} else {
6666
$updatedItem = $updatedData->get($updatedItemIndex);
67-
$changes = array_diff_assoc($updatedItem, $originItem);
67+
68+
$changes = array_filter(
69+
array: $updatedItem,
70+
callback: fn ($value, $key) => !array_key_exists($key, $originItem) || $value !== $originItem[$key],
71+
mode: ARRAY_FILTER_USE_BOTH,
72+
);
6873

6974
if (!empty($changes)) {
7075
$updatedRecords[] = array_merge([$this->uniqueKey => $originItem[$this->uniqueKey]], $changes);

tests/TableTestStateTest.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,20 @@ public function testAssertChangesWithCustomPrimaryKey()
102102

103103
$modelTestState->assertChangesEqualsFixture('assertion_fixture_primary_key_set');
104104
}
105+
106+
public function testAssertChangesDetectsFalsyToNullTransitions()
107+
{
108+
$initialDatasetMock = collect($this->getJsonFixture('falsy_to_null_transitions/initial_dataset'));
109+
$changedDatasetMock = collect($this->getJsonFixture('falsy_to_null_transitions/changed_dataset'));
110+
111+
$this->mockGettingDatasetForChanges($changedDatasetMock, $initialDatasetMock, 'test_models', 'name');
112+
113+
$modelTestState = new TableTestState(
114+
tableName: 'test_models',
115+
jsonFields: ['json_field', 'castable_field'],
116+
uniqueKey: 'name',
117+
);
118+
119+
$modelTestState->assertChangesEqualsFixture('assertion_fixture_falsy_to_null_transitions');
120+
}
105121
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
{
2+
"updated": [
3+
{
4+
"name": "name1",
5+
"some_flag": false,
6+
"some_numeric_value": 0,
7+
"some_string_value": ""
8+
},
9+
{
10+
"name": "name2",
11+
"some_flag": true,
12+
"some_numeric_value": 0,
13+
"some_string_value": "value"
14+
}
15+
],
16+
"created": [],
17+
"deleted": []
18+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
[
2+
{
3+
"name": "name1",
4+
"some_flag": false,
5+
"some_numeric_value": 0.0,
6+
"some_string_value": "",
7+
"json_field": "{\"field1\": \"updated_value\", \"field2\": [2, 3], \"field3\": {\"one\": 1, \"two\": 2}}",
8+
"castable_field": "{\"field1\": \"value\", \"field2\": [2, 3], \"field3\": {\"one\": 1, \"two\": 2}}",
9+
"created_at": "2018-10-10 10:10:10",
10+
"updated_at": "2018-10-10 10:10:10"
11+
},
12+
{
13+
"name": "name2",
14+
"some_flag": true,
15+
"some_numeric_value": 0,
16+
"some_string_value": "value",
17+
"json_field": "{\"field1\": \"added_value\"}",
18+
"castable_field": "{\"one\": \"first value\", \"two\": \"second value\"}",
19+
"created_at": "2018-10-10 10:10:10",
20+
"updated_at": "2018-10-10 10:10:10"
21+
},
22+
{
23+
"name": "name3",
24+
"some_flag": null,
25+
"some_numeric_value": null,
26+
"some_string_value": null,
27+
"castable_field": "{}",
28+
"json_field": "{}",
29+
"created_at": "2018-10-10 10:10:10",
30+
"updated_at": "2018-10-10 10:10:10"
31+
}
32+
]
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
[
2+
{
3+
"name": "name1",
4+
"some_flag": null,
5+
"some_numeric_value": null,
6+
"some_string_value": null,
7+
"json_field": "{\"field1\": \"updated_value\", \"field2\": [2, 3], \"field3\": {\"one\": 1, \"two\": 2}}",
8+
"castable_field": "{\"field1\": \"value\", \"field2\": [2, 3], \"field3\": {\"one\": 1, \"two\": 2}}",
9+
"created_at": "2018-10-10 10:10:10",
10+
"updated_at": "2018-10-10 10:10:10"
11+
},
12+
{
13+
"name": "name2",
14+
"some_flag": null,
15+
"some_numeric_value": null,
16+
"some_string_value": null,
17+
"json_field": "{\"field1\": \"added_value\"}",
18+
"castable_field": "{\"one\": \"first value\", \"two\": \"second value\"}",
19+
"created_at": "2018-10-10 10:10:10",
20+
"updated_at": "2018-10-10 10:10:10"
21+
},
22+
{
23+
"name": "name3",
24+
"some_flag": null,
25+
"some_numeric_value": null,
26+
"some_string_value": null,
27+
"castable_field": "{}",
28+
"json_field": "{}",
29+
"created_at": "2018-10-10 10:10:10",
30+
"updated_at": "2018-10-10 10:10:10"
31+
}
32+
]

0 commit comments

Comments
 (0)