Completed
Pull Request — master (#20)
by Vojta
11:17 queued 02:33
created

testStoreReservationDaysOff()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 10
rs 9.4285
cc 1
eloc 6
nc 1
nop 0
1
<?php namespace VojtaSvoboda\Reservations\Tests\Facades;
2
3
use App;
4
use Carbon\Carbon;
5
use Config;
6
use Illuminate\Support\Facades\Validator;
7
use PluginTestCase;
8
use VojtaSvoboda\Reservations\Facades\ReservationsFacade;
9
use VojtaSvoboda\Reservations\Models\Settings;
10
use VojtaSvoboda\Reservations\Validators\ReservationsValidators;
11
12
class ReservationsFacadeTest extends PluginTestCase
13
{
14 View Code Duplication
    public function setUp()
15
    {
16
        parent::setUp();
17
18
        $this->app->bind('vojtasvoboda.reservations.facade', ReservationsFacade::class);
19
20
        // registrate reservations validators
21
        Validator::resolver(function($translator, $data, $rules, $messages, $customAttributes) {
22
            return new ReservationsValidators($translator, $data, $rules, $messages, $customAttributes);
23
        });
24
    }
25
26
    /**
27
     * Returns tested class.
28
     *
29
     * @return ReservationsFacade
30
     */
31
    public function getModel()
32
    {
33
        return App::make(ReservationsFacade::class);
34
    }
35
36
    public function testStoreEmptyReservation()
37
    {
38
        $model = $this->getModel();
39
40
        $this->setExpectedException('October\Rain\Exception\ApplicationException');
41
        $model->storeReservation([]);
42
    }
43
44
    public function testStoreReservationWithoutTime()
45
    {
46
        $model = $this->getModel();
47
48
        $this->setExpectedException('October\Rain\Exception\ApplicationException');
49
        $nextMonday = Carbon::parse('next monday')->format('d/m/Y');
50
        $model->storeReservation([
51
            'date' => $nextMonday,
52
        ]);
53
    }
54
55
    public function testStoreReservationDaysOff()
56
    {
57
        $model = $this->getModel();
58
59
        $this->setExpectedException('October\Rain\Exception\ApplicationException');
60
        $data = $this->getTestingReservationData();
61
        $data['date'] = Carbon::parse('next sunday')->format('d/m/Y');
62
63
        $model->storeReservation($data);
64
    }
65
66 View Code Duplication
    public function testStoreReservationOutOfHours()
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
67
    {
68
        $model = $this->getModel();
69
70
        $data = $this->getTestingReservationData();
71
        $data['time'] = '19:00';
72
73
        $this->setExpectedException('October\Rain\Exception\ApplicationException');
74
        $model->storeReservation($data);
75
    }
76
77 View Code Duplication
    public function testStoreReservationInThePast()
1 ignored issue
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
78
    {
79
        $model = $this->getModel();
80
81
        $data = $this->getTestingReservationData();
82
        $data['date'] = Carbon::now(-5)->format('d/m/Y');
83
84
        $this->setExpectedException('October\Rain\Exception\ApplicationException');
85
        $model->storeReservation($data);
86
    }
87
88
    public function testStoreReservation()
89
    {
90
        $model = $this->getModel();
91
        $reservation = $model->storeReservation($this->getTestingReservationData());
92
93
        // check status
94
        $defaultStatusIdent = Config::get('vojtasvoboda.reservations::config.statuses.received', 'received');
95
        $this->assertEquals($defaultStatusIdent, $reservation->status->ident);
96
97
        // check locale
98
        $locale = App::getLocale();
99
        $this->assertEquals($locale, $reservation->locale);
100
101
        // check date and time
102
        $testingData = $this->getTestingReservationData();
103
        $inputDate = $testingData['date'] . ' ' . $testingData['time'];
104
        $dateTime = Carbon::createFromFormat('d/m/Y H:i', $inputDate);
105
        $this->assertEquals($dateTime, $reservation->date);
106
    }
107
108
    public function testDoubleStoreReservationUnder30Seconds()
109
    {
110
        $model = $this->getModel();
111
        $testingData = $this->getTestingReservationData();
112
        $model->storeReservation($testingData);
113
114
        $this->setExpectedException('October\Rain\Exception\ApplicationException');
115
        $model->storeReservation($testingData);
116
    }
117
118
    public function testTransformDateTime()
119
    {
120
        $model = $this->getModel();
121
122
        $nextMonday = Carbon::parse('next monday');
123
        $data = [
124
            'date' => $nextMonday->format('d/m/Y'),
125
            'time' => '15:45',
126
        ];
127
        $date = $model->transformDateTime($data);
128
129
        $this->assertInstanceOf('Carbon\Carbon', $date);
130
        $this->assertEquals($nextMonday->format('Y-m-d').' 15:45:00', $date->format('Y-m-d H:i:s'));
131
    }
132
133
    public function testGetReservationsCountByMail()
134
    {
135
        $model = $this->getModel();
136
137
        // create one reservation with [email protected] email
138
        $model->storeReservation($this->getTestingReservationData());
139
140
        $count = $model->getReservationsCountByMail('[email protected]');
141
        $this->assertEquals(0, $count);
142
143
        $count = $model->getReservationsCountByMail('[email protected]');
144
        $this->assertEquals(1, $count);
145
    }
146
147
    public function testIsUserReturning()
148
    {
149
        $model = $this->getModel();
150
151
        // enable Returning Customers function
152
        Settings::set('returning_mark', 1);
153
154
        // is returning without any reservation?
155
        $isReturning = $model->isUserReturning('[email protected]');
156
        $this->assertEquals(false, $isReturning, 'There is no reservation, so customer cant be returning.');
157
158
        // create one reservation with [email protected] email
159
        $model->storeReservation($this->getTestingReservationData());
160
161
        // is returning without any reservation?
162
        $isReturning = $model->isUserReturning('[email protected]');
163
        $this->assertEquals(false, $isReturning, 'Email [email protected] does not has any reservation, so it should not be marked as returning customer.');
164
165
        // is returning with one reservation?
166
        $isReturning = $model->isUserReturning('[email protected]');
167
        $this->assertEquals(true, $isReturning, 'Email [email protected] has one reservation, so it should be marked as returning customer.');
168
    }
169
170
    public function testIsCreatedWhileAgo()
171
    {
172
        $model = $this->getModel();
173
        $exists = $model->isCreatedWhileAgo();
174
175
        $this->assertFalse($exists);
176
177
        // create fake reservation
178
        $model->storeReservation($this->getTestingReservationData());
179
        $exists = $model->isCreatedWhileAgo();
180
181
        $this->assertTrue($exists);
182
    }
183
184 View Code Duplication
    private function getTestingReservationData()
185
    {
186
        $nextMonday = Carbon::parse('next monday')->format('d/m/Y');
187
188
        return [
189
            'date' => $nextMonday,
190
            'time' => '11:00',
191
            'email' => '[email protected]',
192
            'phone' => '777111222',
193
            'street' => 'ABCDE',
194
            'name' => 'Vojta Svoboda',
195
            'message' => 'Hello.',
196
        ];
197
    }
198
}
199