Passed
Branch merging-leagues-tournaments (a75688)
by Benedikt
07:29
created

StartAndFinishableTest::testTimeUpdates()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 72
Code Lines 42

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 42
c 1
b 0
f 1
dl 0
loc 72
rs 9.248
cc 1
nc 1
nop 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
declare(strict_types=1);
3
/**
4
 * Created by PhpStorm.
5
 * User: benedikt
6
 * Date: 10/1/17
7
 * Time: 12:52 PM
8
 */
9
10
namespace Tfboe\FmLib\Tests\Unit\Entity\Helpers;
11
12
use DateTime;
13
use Exception;
14
use PHPUnit\Framework\Error\Error;
15
use PHPUnit\Framework\MockObject\MockObject;
16
use Tfboe\FmLib\Entity\Helpers\StartAndFinishable;
17
use Tfboe\FmLib\Entity\Helpers\StartAndFinishableInterface;
18
use Tfboe\FmLib\Entity\Helpers\StartFinishStatus;
19
use Tfboe\FmLib\Tests\Helpers\UnitTestCase;
20
21
/**
22
 * Class BaseEntityTest
23
 * @package Tfboe\FmLib\Tests\Unit\Entity\Helpers
24
 */
25
class StartAndFinishableTest extends UnitTestCase
26
{
27
//<editor-fold desc="Public Methods">
28
  /**
29
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::cloneFrom
30
   * @throws Exception
31
   * @uses   \Tfboe\FmLib\Entity\Traits\LastRecalculation::getEndTime
32
   * @uses   \Tfboe\FmLib\Entity\Traits\LastRecalculation::getStartTime
33
   * @uses   \Tfboe\FmLib\Entity\Traits\LastRecalculation::setEndTime
34
   * @uses   \Tfboe\FmLib\Entity\Traits\LastRecalculation::setStartTime
35
   * @uses   \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::getStatus
36
   */
37
  public function testCloneFrom()
38
  {
39
    $entity = $this->mock();
40
    self::assertEquals(StartFinishStatus::NOT_STARTED, $entity->getStatus());
41
    self::assertNull($entity->getStartTime());
42
    self::assertNull($entity->getEndTime());
43
44
    $start = new DateTime("2019-01-01");
45
    $end = new DateTime("2019-02-01");
46
    $status = StartFinishStatus::FINISHED;
47
    $clone = $this->getStub(StartAndFinishableInterface::class,
48
      ['getStatus' => $status, 'getStartTime' => $start, 'getEndTime' => $end]);
49
50
    $entity->cloneFrom($clone);
51
    self::assertEquals($status, $entity->getStatus());
52
    self::assertEquals($start, $entity->getStartTime());
53
    self::assertEquals($end, $entity->getEndTime());
54
  }
55
56
57
  /**
58
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::setStatus
59
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::changeIsValid
60
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::ensureValidValue
61
   * @throws Exception
62
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::ensureValidValue
63
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::getConstants
64
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::getValues
65
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::isValidValue
66
   * @uses   \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::statusIsFinished
67
   * @uses   \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::statusIsStarted
68
   * @uses   \Tfboe\FmLib\Exceptions\Internal::error
69
   */
70
  public function testStatusFromFinishedToNotStarted()
71
  {
72
    $entity = $this->mock();
73
74
    $entity->setStatus(StartFinishStatus::STARTED, new DateTime(), false, false);
75
76
    $entity->setStatus(StartFinishStatus::FINISHED, new DateTime(), false, false);
77
    $this->expectException(Error::class);
78
    $this->expectExceptionMessage('Invalid status change!');
79
80
    $entity->setStatus(StartFinishStatus::NOT_STARTED, new DateTime(), false, false);
81
  }
82
83
84
  /**
85
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::setStatus
86
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::changeIsValid
87
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::ensureValidValue
88
   * @throws Exception
89
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::ensureValidValue
90
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::getConstants
91
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::getValues
92
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::isValidValue
93
   * @uses   \Tfboe\FmLib\Exceptions\Internal::error
94
   */
95
  public function testStatusFromNotRunningToFinished()
96
  {
97
    $entity = $this->mock();
98
    $this->expectException(Error::class);
99
    $this->expectExceptionMessage('Invalid status change!');
100
101
    $entity->setStatus(StartFinishStatus::FINISHED, new DateTime(), false, false);
102
  }
103
104
105
  /**
106
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::getStatus
107
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::setStatus
108
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::ensureValidValue
109
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::changeIsValid
110
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::isFinished
111
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::isStarted
112
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::statusIsFinished
113
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::statusIsStarted
114
   * @throws Exception
115
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::getConstants
116
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::getValues
117
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::isValidValue
118
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::ensureValidValue
119
   */
120
  public function testStatusWOTimes()
121
  {
122
    $entity = $this->mock();
123
    self::assertEquals(StartFinishStatus::NOT_STARTED, $entity->getStatus());
124
    self::assertFalse($entity->isStarted());
125
    self::assertFalse($entity->isFinished());
126
127
    $entity->setStatus(StartFinishStatus::STARTED, new DateTime(), false, false);
128
    self::assertEquals(StartFinishStatus::STARTED, $entity->getStatus());
129
    self::assertTrue($entity->isStarted());
130
    self::assertFalse($entity->isFinished());
131
132
    $entity->setStatus(StartFinishStatus::FINISHED, new DateTime(), false, false);
133
    self::assertEquals(StartFinishStatus::FINISHED, $entity->getStatus());
134
    self::assertTrue($entity->isStarted());
135
    self::assertTrue($entity->isFinished());
136
137
    $entity->setStatus(StartFinishStatus::FINISHED, new DateTime(), false, false);
138
    self::assertEquals(StartFinishStatus::FINISHED, $entity->getStatus());
139
    self::assertTrue($entity->isStarted());
140
    self::assertTrue($entity->isFinished());
141
142
    $entity->setStatus(StartFinishStatus::STARTED, new DateTime(), false, false);
143
    self::assertEquals(StartFinishStatus::STARTED, $entity->getStatus());
144
    self::assertTrue($entity->isStarted());
145
    self::assertFalse($entity->isFinished());
146
147
    $entity->setStatus(StartFinishStatus::NOT_STARTED, new DateTime(), false, false);
148
    self::assertEquals(StartFinishStatus::NOT_STARTED, $entity->getStatus());
149
    self::assertFalse($entity->isStarted());
150
    self::assertFalse($entity->isFinished());
151
  }
152
153
154
  /**
155
   * @covers \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::setStatus
156
   * @throws Exception
157
   * @uses   \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::changeIsValid
158
   * @uses   \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::ensureValidValue
159
   * @uses   \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::getStatus
160
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::ensureValidValue
161
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::getConstants
162
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::getValues
163
   * @uses   \Tfboe\FmLib\Helpers\BasicEnum::isValidValue
164
   * @uses   \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::statusIsFinished
165
   * @uses   \Tfboe\FmLib\Entity\Helpers\StartAndFinishable::statusIsStarted
166
   * @uses   \Tfboe\FmLib\Entity\Helpers\TimeEntity::getEndTime
167
   * @uses   \Tfboe\FmLib\Entity\Helpers\TimeEntity::getStartTime
168
   * @uses   \Tfboe\FmLib\Entity\Helpers\TimeEntity::setEndTime
169
   * @uses   \Tfboe\FmLib\Entity\Helpers\TimeEntity::setStartTime
170
   * @uses   \Tfboe\FmLib\Helpers\DateTime::eq
171
   */
172
  public function testTimeUpdates()
173
  {
174
    /** @var MockObject|StartAndFinishable $entity */
175
    $entity = $this->getMockForTrait(StartAndFinishable::class, [], '', true, true, true, ['changeIsValid']);
176
    //allow all changes
177
    $entity->method('changeIsValid')->willReturn(true);
178
    self::assertEquals(StartFinishStatus::NOT_STARTED, $entity->getStatus());
179
    self::assertNull($entity->getStartTime());
180
    self::assertNull($entity->getEndTime());
181
182
    $date1 = new DateTime("2019-01-01");
183
184
    $entity->setStatus(StartFinishStatus::STARTED, $date1);
185
    self::assertEquals($date1, $entity->getStartTime());
186
187
    $date2 = new DateTime("2019-02-01");
188
189
    $entity->setStatus(StartFinishStatus::NOT_STARTED, $date2);
190
    self::assertNull($entity->getStartTime());
191
192
193
    $entity->setStatus(StartFinishStatus::STARTED, $date1, false);
194
    self::assertNull($entity->getStartTime());
195
196
197
    $entity->setStatus(StartFinishStatus::NOT_STARTED, $date2);
198
    self::assertNull($entity->getStartTime());
199
200
201
    $entity->setStatus(StartFinishStatus::STARTED, $date1);
202
    self::assertEquals($date1, $entity->getStartTime());
203
204
    $entity->setStatus(StartFinishStatus::NOT_STARTED, $date2, false);
205
    self::assertEquals($date1, $entity->getStartTime());
206
207
208
    $entity->setStatus(StartFinishStatus::STARTED, $date2);
209
    self::assertEquals($date2, $entity->getStartTime());
210
211
    $date3 = new DateTime("2019-03-01");
212
    self::assertNull($entity->getEndTime());
213
214
    $entity->setStatus(StartFinishStatus::FINISHED, $date3);
215
    self::assertEquals($date2, $entity->getStartTime());
216
    self::assertEquals($date3, $entity->getEndTime());
217
218
219
    $entity->setStatus(StartFinishStatus::STARTED, $date1);
220
    self::assertEquals($date2, $entity->getStartTime());
221
    self::assertNull($entity->getEndTime());
222
223
224
    $entity->setStatus(StartFinishStatus::FINISHED, $date3, true, false);
225
    self::assertEquals($date2, $entity->getStartTime());
226
    self::assertNull($entity->getEndTime());
227
228
229
    $entity->setStatus(StartFinishStatus::STARTED, $date1);
230
231
    $entity->setStatus(StartFinishStatus::FINISHED, $date3);
232
    self::assertEquals($date2, $entity->getStartTime());
233
    self::assertEquals($date3, $entity->getEndTime());
234
235
    //test skipping
236
237
    $entity->setStatus(StartFinishStatus::NOT_STARTED, $date1);
238
    self::assertNull($entity->getStartTime());
239
    self::assertNull($entity->getEndTime());
240
241
    $entity->setStatus(StartFinishStatus::FINISHED, $date3);
242
    self::assertEquals($date3, $entity->getStartTime());
243
    self::assertEquals($date3, $entity->getEndTime());
244
  }
245
//</editor-fold desc="Public Methods">
246
247
//<editor-fold desc="Private Methods">
248
  /**
249
   * @return MockObject|StartAndFinishable
250
   */
251
  private function mock(): MockObject
252
  {
253
    return $this->getMockForTrait(StartAndFinishable::class);
254
  }
255
//</editor-fold desc="Private Methods">
256
}