Passed
Push — developer ( 918c9d...b46760 )
by Radosław
15:04
created

Z_ResetingRecordNumber::testLeadingZeros()   A

Complexity

Conditions 4
Paths 4

Size

Total Lines 45
Code Lines 42

Duplication

Lines 0
Ratio 0 %

Importance

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