Passed
Push — developer ( b46760...244921 )
by Radosław
14:14
created

Z_ResetingRecordNumber::testParse()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 10
c 1
b 0
f 0
dl 0
loc 12
rs 9.9332
cc 2
nc 2
nop 0
1
<?php
2
/**
3
 * Reseting record number test class.
4
 *
5
 * @package   Tests
6
 *
7
 * @copyright YetiForce S.A.
8
 * @license   YetiForce Public License 6.5 (licenses/LicenseEN.txt or yetiforce.com)
9
 * @author    Rafal Pospiech <[email protected]>
10
 */
11
12
namespace Tests\Base;
13
14
/**
15
 * Class RecordNumber.
16
 *
17
 * @codeCoverageIgnore
18
 */
19
class RecordNumber extends \App\Fields\RecordNumber
20
{
21
	/**
22
	 * @var array of dates
23
	 */
24
	public static $dates = [
25
		'2015-01-01'
26
	];
27
28
	/**
29
	 * @var int
30
	 */
31
	public static $currentDateIndex = 0;
32
33
	/**
34
	 * Date method mock for testing purposes.
35
	 *
36
	 * @param string   $format
37
	 * @param int|null $time
38
	 *
39
	 * @return false|string
40
	 */
41
	public static function date($format, $time = null)
42
	{
43
		if (!isset(self::$dates[self::$currentDateIndex])) {
44
			self::$currentDateIndex = 0;
45
		}
46
		return date($format, strtotime(self::$dates[self::$currentDateIndex]));
47
	}
48
}
49
50
class Z_ResetingRecordNumber extends \Tests\Base
51
{
52
	/**
53
	 * Database transaction pointer.
54
	 *
55
	 * @var \yii\db\Transaction
56
	 */
57
	private static $transaction;
58
59
	/**
60
	 * @codeCoverageIgnore
61
	 * Setting of tests.
62
	 */
63
	public static function setUpBeforeClass(): void
64
	{
65
		self::$transaction = \App\Db::getInstance()->beginTransaction();
66
		RecordNumber::$dates[0] = date('Y-m-d');
67
	}
68
69
	/**
70
	 * Test method "DateMock".
71
	 */
72
	public function testDateMock()
73
	{
74
		$this->assertCount(20, RecordNumber::$dates);
75
		foreach (RecordNumber::$dates as $index => $date) {
76
			RecordNumber::$currentDateIndex = $index;
77
			$this->assertSame($date, RecordNumber::date('Y-m-d'));
78
		}
79
	}
80
81
	/**
82
	 * Test method "StandardNumber".
83
	 */
84
	public function testSequenceNumber()
85
	{
86
		foreach (RecordNumber::$dates as $index => $date) {
87
			RecordNumber::$currentDateIndex = $index;
88
			$parts = explode('-', $date);
89
			$this->assertSame($parts[0], RecordNumber::getSequenceNumber('Y'));
90
			$this->assertSame($parts[0] . $parts[1], RecordNumber::getSequenceNumber('M'));
91
			$this->assertSame($parts[0] . $parts[1] . $parts[2], RecordNumber::getSequenceNumber('D'));
92
		}
93
	}
94
95
	/**
96
	 * Test method "IncrementNumberStandard".
97
	 */
98
	public function testIncrementNumberStandard()
99
	{
100
		$instance = RecordNumber::getInstance('FInvoice')->set('prefix', 'F-I')->set('cur_id', 1);
101
		$instance->save();
102
		$originalRow = (new \App\Db\Query())->from('vtiger_modentity_num')->where(['tabid' => \App\Module::getModuleId('FInvoice')])->one();
103
		$this->assertSame('F-I', $originalRow['prefix']);
104
		$this->assertSame('', $originalRow['postfix']);
105
		$this->assertSame(null, $originalRow['reset_sequence']);
106
		$this->assertSame('', $originalRow['cur_sequence']);
107
		$actualNumber = $originalRow['cur_id'];
108
		foreach (RecordNumber::$dates as $index => $date) {
109
			$this->assertSame("F-I$actualNumber", $instance->getIncrementNumber());
110
			$number = RecordNumber::getInstance('FInvoice');
111
			++$actualNumber;
112
			$this->assertSame($actualNumber, $number->get('cur_id'));
113
			$this->assertSame(null, $number->get('reset_sequence'));
114
			$this->assertSame('', $number->get('cur_sequence'));
115
			$this->assertSame('F-I', $number->get('prefix'));
116
			$this->assertSame('', $number->get('postfix'));
117
		}
118
	}
119
120
	/**
121
	 * Test method "Parse".
122
	 * Test parsing method for record numbers on different dates.
123
	 */
124
	public function testParse()
125
	{
126
		$instance = RecordNumber::getInstance('FInvoice');
127
		foreach (RecordNumber::$dates as $index => $date) {
128
			RecordNumber::$currentDateIndex = $index;
129
			$parts = explode('-', $date);
130
			$instance->set('prefix', '{{DD}}/');
131
			$this->assertSame($parts[2] . '/1', $instance->parseNumber(1));
132
			$instance->set('prefix', '{{MM}}/');
133
			$this->assertSame($parts[1] . '/1', $instance->parseNumber(1));
134
			$instance->set('prefix', '{{YYYY}}/');
135
			$this->assertSame($parts[0] . '/1', $instance->parseNumber(1));
136
		}
137
	}
138
139
	/**
140
	 * Test method "IncrementNumberDay".
141
	 * Test record number resetting with new day.
142
	 */
143
	public function testIncrementNumberDay()
144
	{
145
		$parts = explode('-', RecordNumber::$dates[0]);
146
		$actualNumber = 1;
147
		$prefix = '{{YYYY}}-{{MM}}-{{DD}}/';
148
		$postfix = '';
149
		$resetSequence = 'D';
150
		$curSequence = ($parts[0] . $parts[1] . $parts[2]);
151
		$instance = RecordNumber::getInstance('FInvoice');
152
		$instance->set('prefix', $prefix);
153
		$instance->set('cur_id', $actualNumber);
154
		$instance->set('postfix', $postfix);
155
		$instance->set('leading_zeros', 0);
156
		$instance->set('reset_sequence', $resetSequence);
157
		$instance->set('cur_sequence', $curSequence);
158
		$result = $instance->save();
159
		$this->assertSame(1, $result);
160
		$originalRow = (new \App\Db\Query())->from('vtiger_modentity_num')->where(['tabid' => 95])->one();
161
		$this->assertSame($prefix, $originalRow['prefix']);
162
		$this->assertSame(0, $originalRow['leading_zeros']);
163
		$this->assertSame($postfix, $originalRow['postfix']);
164
		$this->assertSame($resetSequence, $originalRow['reset_sequence']);
165
		$this->assertSame($curSequence, $originalRow['cur_sequence']);
166
		$this->assertSame($actualNumber, $originalRow['cur_id']);
167
		$currentNumber = 1;
168
		$currentDate = '';
169
		foreach (RecordNumber::$dates as $index => $date) {
170
			RecordNumber::$currentDateIndex = $index;
171
			$sequence = str_replace('-', '', $date);
172
			if ($sequence === $currentDate) {
173
				++$currentNumber;
174
			} else {
175
				$currentNumber = 1;
176
				$currentDate = $sequence;
177
			}
178
			$this->assertSame("$date/$currentNumber", $instance->getIncrementNumber());
179
			$number = RecordNumber::getInstance('FInvoice');
180
			$this->assertSame($currentNumber + 1, $number->get('cur_id'));
181
			$this->assertSame(0, $number->get('leading_zeros'));
182
			$this->assertSame($resetSequence, $number->get('reset_sequence'));
183
			$this->assertSame($sequence, $number->get('cur_sequence'));
184
			$this->assertSame($prefix, $number->get('prefix'));
185
			$this->assertSame($postfix, $number->get('postfix'));
186
		}
187
	}
188
189
	/**
190
	 * Test method "IncrementNumberMonth".
191
	 * Test record number resetting with new month.
192
	 */
193
	public function testIncrementNumberMonth(): void
194
	{
195
		$actualNumber = 1;
196
		$prefix = '{{YYYY}}-{{MM}}-{{DD}}/';
197
		$postfix = '';
198
		$resetSequence = 'M';
199
		$curSequence = '';
200
		$instance = RecordNumber::getInstance('FInvoice');
201
		$instance->set('prefix', $prefix);
202
		$instance->set('cur_id', $actualNumber);
203
		$instance->set('postfix', $postfix);
204
		$instance->set('leading_zeros', 0);
205
		$instance->set('reset_sequence', $resetSequence);
206
		$instance->set('cur_sequence', $curSequence);
207
		$result = $instance->save();
208
		$this->assertSame(1, $result);
209
		$originalRow = (new \App\Db\Query())->from('vtiger_modentity_num')->where(['tabid' => 95])->one();
210
		$this->assertSame($prefix, $originalRow['prefix']);
211
		$this->assertSame(0, $originalRow['leading_zeros']);
212
		$this->assertSame($postfix, $originalRow['postfix']);
213
		$this->assertSame($resetSequence, $originalRow['reset_sequence']);
214
		$this->assertSame($curSequence, $originalRow['cur_sequence']);
215
		$this->assertSame($actualNumber, $originalRow['cur_id']);
216
		$currentNumber = 1;
217
		$currentDate = '';
218
		foreach (RecordNumber::$dates as $index => $date) {
219
			RecordNumber::$currentDateIndex = $index;
220
			$parts = explode('-', $date);
221
			$sequence = $parts[0] . $parts[1];
222
			if ($sequence === $currentDate) {
223
				++$currentNumber;
224
			} else {
225
				$currentNumber = 1;
226
				$currentDate = $sequence;
227
			}
228
			$this->assertSame("$date/$currentNumber", $instance->getIncrementNumber());
229
			$number = RecordNumber::getInstance('FInvoice');
230
			$this->assertSame($currentNumber + 1, $number->get('cur_id'));
231
			$this->assertSame(0, $number->get('leading_zeros'));
232
			$this->assertSame($resetSequence, $number->get('reset_sequence'));
233
			$this->assertSame($sequence, $number->get('cur_sequence'));
234
			$this->assertSame($prefix, $number->get('prefix'));
235
			$this->assertSame($postfix, $number->get('postfix'));
236
		}
237
	}
238
239
	/**
240
	 * Test method "IncrementNumberYear".
241
	 * Test record number resetting with new year.
242
	 */
243
	public function testIncrementNumberYear(): void
244
	{
245
		$actualNumber = 1;
246
		$prefix = '{{YYYY}}-{{MM}}-{{DD}}/';
247
		$postfix = '';
248
		$resetSequence = 'Y';
249
		$curSequence = '';
250
		$instance = RecordNumber::getInstance('FInvoice');
251
		$instance->set('prefix', $prefix);
252
		$instance->set('cur_id', $actualNumber);
253
		$instance->set('postfix', $postfix);
254
		$instance->set('leading_zeros', 0);
255
		$instance->set('reset_sequence', $resetSequence);
256
		$instance->set('cur_sequence', $curSequence);
257
		$result = $instance->save();
258
		$this->assertSame(1, $result);
259
		$originalRow = (new \App\Db\Query())->from('vtiger_modentity_num')->where(['tabid' => 95])->one();
260
		$this->assertSame($prefix, $originalRow['prefix']);
261
		$this->assertSame(0, $originalRow['leading_zeros']);
262
		$this->assertSame($postfix, $originalRow['postfix']);
263
		$this->assertSame($resetSequence, $originalRow['reset_sequence']);
264
		$this->assertSame($curSequence, $originalRow['cur_sequence']);
265
		$this->assertSame($actualNumber, $originalRow['cur_id']);
266
		$currentNumber = 1;
267
		$currentDate = '';
268
		foreach (RecordNumber::$dates as $index => $date) {
269
			RecordNumber::$currentDateIndex = $index;
270
			$parts = explode('-', $date);
271
			$sequence = $parts[0];
272
			if ($sequence === $currentDate) {
273
				++$currentNumber;
274
			} else {
275
				$currentNumber = 1;
276
				$currentDate = $sequence;
277
			}
278
			$this->assertSame("$date/$currentNumber", $instance->getIncrementNumber());
279
			$number = RecordNumber::getInstance('FInvoice');
280
			$this->assertSame($currentNumber + 1, $number->get('cur_id'));
281
			$this->assertSame(0, $number->get('leading_zeros'));
282
			$this->assertSame($resetSequence, $number->get('reset_sequence'));
283
			$this->assertSame($sequence, $number->get('cur_sequence'));
284
			$this->assertSame($prefix, $number->get('prefix'));
285
			$this->assertSame($postfix, $number->get('postfix'));
286
		}
287
	}
288
289
	/**
290
	 * Test method "LeadingZeros"
291
	 * Test leading zeros in numbers generation.
292
	 */
293
	public function testLeadingZeros(): void
294
	{
295
		for ($leadingZeros = 0; $leadingZeros < 7; ++$leadingZeros) {
296
			$actualNumber = 1;
297
			$prefix = '{{YYYY}}-{{MM}}-{{DD}}/';
298
			$postfix = '';
299
			$resetSequence = 'Y';
300
			$curSequence = '';
301
			$instance = RecordNumber::getInstance('FInvoice');
302
			$instance->set('prefix', $prefix);
303
			$instance->set('cur_id', $actualNumber);
304
			$instance->set('postfix', $postfix);
305
			$instance->set('leading_zeros', $leadingZeros);
306
			$instance->set('reset_sequence', $resetSequence);
307
			$instance->set('cur_sequence', $curSequence);
308
			$result = $instance->save();
309
			$this->assertSame(1, $result);
310
			$originalRow = (new \App\Db\Query())->from('vtiger_modentity_num')->where(['tabid' => 95])->one();
311
			$this->assertSame($prefix, $originalRow['prefix']);
312
			$this->assertSame($leadingZeros, $originalRow['leading_zeros']);
313
			$this->assertSame($postfix, $originalRow['postfix']);
314
			$this->assertSame($resetSequence, $originalRow['reset_sequence']);
315
			$this->assertSame($curSequence, $originalRow['cur_sequence']);
316
			$this->assertSame($actualNumber, $originalRow['cur_id']);
317
			$currentNumber = 1;
318
			$currentDate = '';
319
			foreach (RecordNumber::$dates as $index => $date) {
320
				RecordNumber::$currentDateIndex = $index;
321
				$parts = explode('-', $date);
322
				$sequence = $parts[0];
323
				if ($sequence === $currentDate) {
324
					++$currentNumber;
325
				} else {
326
					$currentNumber = 1;
327
					$currentDate = $sequence;
328
				}
329
				$currentNumber = \str_pad($currentNumber, $leadingZeros, '0', STR_PAD_LEFT);
330
				$this->assertSame("$date/$currentNumber", $instance->getIncrementNumber());
331
				$number = RecordNumber::getInstance('FInvoice');
332
				$this->assertSame($currentNumber + 1, $number->get('cur_id'));
333
				$this->assertSame($leadingZeros, $number->get('leading_zeros'));
334
				$this->assertSame($resetSequence, $number->get('reset_sequence'));
335
				$this->assertSame($sequence, $number->get('cur_sequence'));
336
				$this->assertSame($prefix, $number->get('prefix'));
337
				$this->assertSame($postfix, $number->get('postfix'));
338
			}
339
		}
340
	}
341
342
	/**
343
	 * Cleaning after tests.
344
	 */
345
	public static function tearDownAfterClass(): void
346
	{
347
		self::$transaction->rollBack();
348
		\App\Cache::clear();
349
	}
350
}
351