Passed
Push — master ( d2ae38...0a0160 )
by Koen
02:10
created

TranslationTest::testCanGetTranslationModel()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace KoenHoeijmakers\LaravelTranslatable\Tests\Feature;
4
5
use Illuminate\Database\Eloquent\Model;
6
use Illuminate\Foundation\Testing\RefreshDatabase;
7
use KoenHoeijmakers\LaravelTranslatable\Exceptions\MissingTranslationsException;
8
use KoenHoeijmakers\LaravelTranslatable\HasTranslations;
9
use KoenHoeijmakers\LaravelTranslatable\Tests\TestCase;
10
11
class TranslationTest extends TestCase
12
{
13
    use RefreshDatabase;
0 ignored issues
show
introduced by
The trait Illuminate\Foundation\Testing\RefreshDatabase requires some properties which are not provided by KoenHoeijmakers\LaravelT...Feature\TranslationTest: $connectionsToTransact, $dropViews
Loading history...
14
15
    public function testTranslationsAreBeingSaved()
16
    {
17
        $model = TestModel::query()->create([
18
            'name' => 'Monkey',
19
        ]);
20
21
        $this->assertTrue($model->getAttribute('name') === 'Monkey');
22
        $this->assertDatabaseHas('test_models', ['id' => $model->getKey()]);
23
        $this->assertDatabaseHas('test_model_translations', ['test_model_id' => $model->getKey(), 'name' => 'Monkey']);
24
    }
25
26
    public function testTranslationsCanBeSavedViaStoreTranslation()
27
    {
28
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
29
        $model = TestModel::query()->create([
30
            'name' => 'Monkey',
31
        ]);
32
33
        $model->storeTranslation('nl', ['name' => 'Aap']);
34
35
        $this->assertDatabaseHas('test_models', ['id' => $model->getKey()]);
36
        $this->assertDatabaseHas('test_model_translations', ['test_model_id' => $model->getKey(), 'name' => 'Aap']);
37
    }
38
39
    public function testTranslationsCanBeSavedViaStoreTranslationMethod()
40
    {
41
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
42
        $model = TestModel::query()->create([
43
            'name' => 'Monkey',
44
        ]);
45
46
        $model->storeTranslation('nl', ['name' => 'Aap']);
47
48
        $this->assertDatabaseHas('test_models', ['id' => $model->getKey()]);
49
        $this->assertTrue($model->translationExists('nl'));
50
    }
51
52
    public function testTranslationsCanBeSavedViaStoreTranslationsMethod()
53
    {
54
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
55
        $model = TestModel::query()->create([
56
            'name' => 'Monkey',
57
        ]);
58
59
        $model->storeTranslations([
60
            'nl' => ['name' => 'Aap'],
61
            'de' => ['name' => 'Affe'],
62
        ]);
63
64
        $this->assertDatabaseHas('test_models', ['id' => $model->getKey()]);
65
        $this->assertTrue($model->translationExists('nl'));
66
        $this->assertTrue($model->translationExists('de'));
67
    }
68
69
    public function testCanRetrieveADifferentTranslation()
70
    {
71
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
72
        $model = TestModel::query()->create([
73
            'name' => 'Monkey',
74
        ]);
75
76
        $model->storeTranslation('nl', ['name' => 'Aap']);
77
78
        $this->assertTrue($model->translationExists('nl'));
79
80
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
81
        $model = TestModel::query()->find(1);
82
83
        $model->translate('nl');
84
85
        $this->assertEquals($model->getLocale(), 'nl');
86
        $this->assertEquals($model->getAttribute('name'), 'Aap');
87
    }
88
89
    public function testCanRetrieveADifferentTranslationAndItsUpdatedInThatLocale()
90
    {
91
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
92
        $model = TestModel::query()->create([
93
            'name' => 'Monkey',
94
        ]);
95
96
        $model->storeTranslation('nl', ['name' => 'Aap']);
97
98
        $this->assertTrue($model->translationExists('nl'));
99
100
        $model->translate('nl');
101
102
        $this->assertEquals($model->getLocale(), 'nl');
103
        $this->assertEquals($model->getAttribute('name'), 'Aap');
104
105
        $model->update(['name' => 'Gorilla']);
106
107
        $this->assertEquals($model->getAttribute('name'), 'Gorilla');
108
        $this->assertEquals(TestModel::query()->find(1)->getAttribute('name'), 'Monkey');
109
    }
110
111
    public function testCanPurgeTranslations()
112
    {
113
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
114
        $model = TestModel::query()->create([
115
            'name' => 'Monkey',
116
        ]);
117
118
        $this->assertTrue($model->translationExists('en'));
119
120
        $model->purgeTranslations();
121
122
        $this->assertFalse($model->translationExists('en'));
123
    }
124
125
    public function testModelGetsDeletedAndTranslationsArePurged()
126
    {
127
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
128
        $model = TestModel::query()->create([
129
            'name' => 'Monkey',
130
        ]);
131
132
        $this->assertTrue($model->translationExists('en'));
133
134
        $model->delete();
135
136
        $this->assertFalse($model->translationExists('en'));
137
        $this->assertDatabaseMissing('test_models', [$model->getKeyName() => $model->getKey()]);
138
    }
139
140
    public function testCanGetTranslationModel()
141
    {
142
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
143
        $model = TestModel::query()->create([
144
            'name' => 'Monkey',
145
        ]);
146
147
        $this->assertInstanceOf(TestModelTranslation::class, $model->getTranslation('en'));
148
    }
149
150
    public function testCanGetTranslationValue()
151
    {
152
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
153
        $model = TestModel::query()->create([
154
            'name' => 'Monkey',
155
        ]);
156
157
        $this->assertEquals('Monkey', $model->getTranslationValue('en', 'name'));
158
    }
159
160
    public function testRefreshingTranslationsOnANonExistingModelReturnsNull()
161
    {
162
        $model = new TestModel();
163
164
        $this->assertNull($model->refreshTranslation());
165
    }
166
167
    public function testTranslatingANonExistingModelReturnsNull()
168
    {
169
        $model = new TestModel();
170
171
        $this->assertNull($model->translate('nl'));
172
    }
173
174
    public function testResolvingRouteBindingsReturnsCorrectModel()
175
    {
176
        /** @var \KoenHoeijmakers\LaravelTranslatable\Tests\Feature\TestModel $model */
177
        $model = TestModel::query()->create([
178
            'name' => 'Monkey',
179
        ]);
180
181
        $this->assertTrue($model->is($model->resolveRouteBinding($model->getKey())));
182
    }
183
184
    public function testTranslationModelCanBeOverridden()
185
    {
186
        $model = new TestModelWithTranslationModelOverride();
187
188
        $this->assertSame($model->getTranslationTable(), 'test_model_translation_differents');
189
    }
190
191
    public function testModelIsMissingTranslations()
192
    {
193
        $model = new TestModelWithoutTranslations();
194
195
        $this->expectException(MissingTranslationsException::class);
196
197
        $model->getTranslatable();
198
    }
199
200
    public function testCanOverrideLocaleKey()
201
    {
202
        $model = new TestModelLocaleKey();
203
204
        $this->assertEquals('lang', $model->getLocaleKeyName());
205
    }
206
}
207
208
class TestModel extends Model
209
{
210
    use HasTranslations;
0 ignored issues
show
introduced by
The trait KoenHoeijmakers\LaravelT...latable\HasTranslations requires some properties which are not provided by KoenHoeijmakers\LaravelT...Tests\Feature\TestModel: $localeKeyName, $translationModel, $translationForeignKey
Loading history...
211
212
    protected $fillable = ['name'];
213
214
    protected $translatable = ['name'];
215
}
216
217
class TestModelTranslation extends Model
218
{
219
    protected $fillable = ['name'];
220
}
221
222
class TestModelWithTranslationModelOverride extends Model
223
{
224
    use HasTranslations;
0 ignored issues
show
introduced by
The trait KoenHoeijmakers\LaravelT...latable\HasTranslations requires some properties which are not provided by KoenHoeijmakers\LaravelT...ranslationModelOverride: $localeKeyName, $translationForeignKey
Loading history...
225
226
    protected $table = 'test_models';
227
228
    protected $fillable = ['name'];
229
230
    protected $translatable = ['name'];
231
232
    protected $translationModel = TestModelTranslationDifferent::class;
233
}
234
235
class TestModelTranslationDifferent extends Model
236
{
237
    protected $fillable = ['name'];
238
}
239
240
class TestModelWithoutTranslations extends Model
241
{
242
    use HasTranslations;
0 ignored issues
show
introduced by
The trait KoenHoeijmakers\LaravelT...latable\HasTranslations requires some properties which are not provided by KoenHoeijmakers\LaravelT...odelWithoutTranslations: $localeKeyName, $translationModel, $translationForeignKey, $translatable
Loading history...
243
244
    protected $fillable = ['name'];
245
246
    protected $table = 'test_models';
247
}
248
249
class TestModelLocaleKey extends Model
250
{
251
    use HasTranslations;
0 ignored issues
show
introduced by
The trait KoenHoeijmakers\LaravelT...latable\HasTranslations requires some properties which are not provided by KoenHoeijmakers\LaravelT...ture\TestModelLocaleKey: $translationModel, $translationForeignKey, $translatable
Loading history...
252
253
    protected $localeKeyName = 'lang';
254
255
    protected $fillable = ['name'];
256
257
    protected $table = 'test_models';
258
}
259