/
ValueTest.php
152 lines (127 loc) · 3.89 KB
/
ValueTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?php
namespace Tests\Fields;
use Statamic\Facades\Blueprint;
use Statamic\Fields\Fieldtype;
use Statamic\Fields\Value;
use Tests\TestCase;
class ValueTest extends TestCase
{
/** @test */
public function it_augments_through_the_fieldtype()
{
$fieldtype = new class extends Fieldtype
{
public function augment($data)
{
return strtoupper($data).'!';
}
public function shallowAugment($data)
{
return $data.' shallow';
}
};
$value = new Value('test', null, $fieldtype);
$this->assertEquals('TEST!', $value->value());
}
/** @test */
public function it_shallow_augments_through_the_fieldtype()
{
$fieldtype = new class extends Fieldtype
{
public function augment($data)
{
return strtoupper($data).'!';
}
public function shallowAugment($data)
{
return $data.' shallow';
}
};
$value = new Value('test', null, $fieldtype);
$this->assertNotSame($value, $value->shallow());
$this->assertInstanceOf(Value::class, $value->shallow());
$this->assertEquals('test shallow', $value->shallow()->value());
}
/** @test */
public function it_converts_to_string_using_the_augmented_value()
{
$fieldtype = new class extends Fieldtype
{
public function augment($data)
{
return strtoupper($data).'!';
}
};
$value = new Value('test', null, $fieldtype);
$this->assertEquals('TEST!', (string) $value);
}
/** @test */
public function it_converts_to_json_using_the_augmented_value()
{
$fieldtype = new class extends Fieldtype
{
public function augment($data)
{
return array_map(function ($item) {
return strtoupper($item).'!';
}, $data);
}
};
$value = new Value(['foo' => 'bar', 'baz' => 'qux'], null, $fieldtype);
$this->assertEquals('{"foo":"BAR!","baz":"QUX!"}', json_encode($value));
}
/** @test */
public function it_converts_to_json_and_augments_child_values()
{
$fieldtype = new class extends Fieldtype
{
public function augment($data)
{
return array_map(function ($item) {
return is_string($item) ? strtoupper($item).'!' : $item;
}, $data);
}
};
$fieldtypeTwo = new class extends Fieldtype
{
public function augment($data)
{
return new DummyAugmentable($data);
}
};
$fieldtypeThree = new class extends Fieldtype
{
public function augment($data)
{
return collect($data)->map(function ($id) {
return new DummyAugmentable($id);
});
}
};
$value = new Value([
'foo' => 'bar',
'baz' => new Value('123', null, $fieldtypeTwo),
'qux' => new Value(['456', '789'], null, $fieldtypeThree),
], null, $fieldtype);
$this->assertEquals('{"foo":"BAR!","baz":{"id":"123","title":"Title for 123"},"qux":[{"id":"456","title":"Title for 456"},{"id":"789","title":"Title for 789"}]}', json_encode($value));
}
}
class DummyAugmentable implements \Statamic\Contracts\Data\Augmentable
{
use \Statamic\Data\HasAugmentedData;
public function __construct($id)
{
$this->id = $id;
}
public function blueprint()
{
return Blueprint::make();
}
public function augmentedArrayData()
{
return [
'id' => $this->id,
'title' => 'Title for '.$this->id,
];
}
}