Completed
Push — locale-in-url ( 151bbf...6507a9 )
by Kamil
20:45
created

SequentialOrderNumberGeneratorSpec   A

Complexity

Total Complexity 5

Size/Duplication

Total Lines 60
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 5

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 5
c 1
b 0
f 0
lcom 0
cbo 5
dl 0
loc 60
rs 10

5 Methods

Rating   Name   Duplication   Size   Complexity  
A let() 0 7 1
A it_is_initializable() 0 4 1
A it_implements_an_order_number_generator_interface() 0 4 1
A it_generates_an_order_number() 0 17 1
A it_generates_an_order_number_when_sequence_is_null() 0 21 1
1
<?php
2
3
/*
4
 * This file is a part of the Sylius package.
5
 *
6
 * (c) Paweł Jędrzejewski
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11
12
namespace spec\Sylius\Bundle\CoreBundle\Order\NumberGenerator;
13
14
use Doctrine\DBAL\LockMode;
15
use Doctrine\ORM\EntityManagerInterface;
16
use PhpSpec\ObjectBehavior;
17
use Sylius\Bundle\CoreBundle\Order\NumberGenerator\SequentialOrderNumberGenerator;
18
use Sylius\Bundle\OrderBundle\NumberGenerator\OrderNumberGeneratorInterface;
19
use Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository;
20
use Sylius\Component\Core\Model\OrderInterface;
21
use Sylius\Component\Core\Model\OrderSequenceInterface;
22
use Sylius\Component\Resource\Factory\FactoryInterface;
23
24
/**
25
 * @author Grzegorz Sadowski <[email protected]>
26
 */
27
final class SequentialOrderNumberGeneratorSpec extends ObjectBehavior
28
{
29
    function let(
30
        EntityRepository $sequenceRepository,
31
        FactoryInterface $sequenceFactory,
32
        EntityManagerInterface $sequenceManager
33
    ) {
34
        $this->beConstructedWith($sequenceRepository, $sequenceFactory, $sequenceManager);
35
    }
36
37
    function it_is_initializable()
38
    {
39
        $this->shouldHaveType(SequentialOrderNumberGenerator::class);
40
    }
41
42
    function it_implements_an_order_number_generator_interface()
43
    {
44
        $this->shouldImplement(OrderNumberGeneratorInterface::class);
45
    }
46
47
    function it_generates_an_order_number(
48
        EntityRepository $sequenceRepository,
49
        EntityManagerInterface $sequenceManager,
50
        OrderSequenceInterface $sequence,
51
        OrderInterface $order
52
    ) {
53
        $sequence->getIndex()->willReturn(6);
54
        $sequence->getVersion()->willReturn(7);
55
56
        $sequenceRepository->findOneBy([])->willReturn($sequence);
57
58
        $sequenceManager->lock($sequence, LockMode::OPTIMISTIC, 7)->shouldBeCalled();
59
60
        $sequence->incrementIndex()->shouldBeCalled();
61
62
        $this->generate($order)->shouldReturn('000000007');
63
    }
64
65
    function it_generates_an_order_number_when_sequence_is_null(
66
        EntityRepository $sequenceRepository,
67
        FactoryInterface $sequenceFactory,
68
        EntityManagerInterface $sequenceManager,
69
        OrderSequenceInterface $sequence,
70
        OrderInterface $order
71
    ) {
72
        $sequence->getIndex()->willReturn(0);
73
        $sequence->getVersion()->willReturn(1);
74
75
        $sequenceRepository->findOneBy([])->willReturn(null);
76
77
        $sequenceFactory->createNew()->willReturn($sequence);
78
        $sequenceManager->persist($sequence)->shouldBeCalled();
79
80
        $sequenceManager->lock($sequence, LockMode::OPTIMISTIC, 1)->shouldBeCalled();
81
82
        $sequence->incrementIndex()->shouldBeCalled();
83
84
        $this->generate($order)->shouldReturn('000000001');
85
    }
86
}
87