Completed
Push — master ( a18731...e2e070 )
by
unknown
99:54 queued 47:45
created

)   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 30
Code Lines 23

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 30
rs 8.8571
c 0
b 0
f 0
cc 1
eloc 23
nc 1
nop 0
1
<?php
2
3
namespace OroCRM\Bundle\SalesBundle\Tests\Unit\Provider;
4
5
use Symfony\Component\Translation\TranslatorInterface;
6
7
use Oro\Bundle\DashboardBundle\Helper\DateHelper;
8
use Oro\Bundle\DashboardBundle\Model\WidgetOptionBag;
9
use Oro\Bundle\DashboardBundle\Provider\Converters\FilterDateRangeConverter;
10
use Oro\Bundle\FilterBundle\Form\Type\Filter\AbstractDateFilterType;
11
use Oro\Bundle\LocaleBundle\Formatter\NumberFormatter;
12
use Oro\Bundle\LocaleBundle\Formatter\DateTimeFormatter;
13
use Oro\Bundle\UserBundle\Dashboard\OwnerHelper;
14
15
use OroCRM\Bundle\SalesBundle\Provider\Opportunity\ForecastProvider;
16
use OroCRM\Bundle\SalesBundle\Provider\ForecastOfOpportunities;
17
18
class ForecastOfOpportunitiesTest extends \PHPUnit_Framework_TestCase
19
{
20
    /** @var ForecastOfOpportunities */
21
    protected $provider;
22
23
    /** @var TranslatorInterface|\PHPUnit_Framework_MockObject_MockObject */
24
    protected $translator;
25
26
    /** @var NumberFormatter|\PHPUnit_Framework_MockObject_MockObject */
27
    protected $numberFormatter;
28
29
    /** @var DateTimeFormatter|\PHPUnit_Framework_MockObject_MockObject */
30
    protected $dateTimeFormatter;
31
32
    /** @var ForecastProvider|\PHPUnit_Framework_MockObject_MockObject */
33
    protected $forecastProvider;
34
35
    /** @var DateHelper|\PHPUnit_Framework_MockObject_MockObject */
36
    protected $dateHelper;
37
38
    /** @var OwnerHelper|\PHPUnit_Framework_MockObject_MockObject */
39
    protected $ownerHelper;
40
41
    /** @var FilterDateRangeConverter|\PHPUnit_Framework_MockObject_MockObject */
42
    protected $filterDateRangeConverter;
43
44
    protected function setUp()
45
    {
46
        $this->translator = $this->getMockBuilder('Oro\Bundle\TranslationBundle\Translation\Translator')
47
            ->disableOriginalConstructor()
48
            ->getMock();
49
50
        $this->numberFormatter = $this->getMockBuilder('Oro\Bundle\LocaleBundle\Formatter\NumberFormatter')
51
            ->disableOriginalConstructor()
52
            ->getMock();
53
54
        $this->numberFormatter
55
            ->expects($this->any())
56
            ->method($this->anything())
57
            ->withAnyParameters()
58
            ->will($this->returnArgument(0));
59
60
        $this->dateTimeFormatter = $this->getMockBuilder('Oro\Bundle\LocaleBundle\Formatter\DateTimeFormatter')
61
            ->disableOriginalConstructor()
62
            ->getMock();
63
64
        $this->dateTimeFormatter
65
            ->expects($this->any())
66
            ->method($this->anything())
67
            ->withAnyParameters()
68
            ->will($this->returnArgument(0));
69
70
        $this->dateHelper = $this->getMockBuilder('Oro\Bundle\DashboardBundle\Helper\DateHelper')
71
            ->disableOriginalConstructor()
72
            ->getMock();
73
74
        $this->ownerHelper = $this->getMockBuilder('Oro\Bundle\UserBundle\Dashboard\OwnerHelper')
75
            ->disableOriginalConstructor()
76
            ->getMock();
77
78
        $this->forecastProvider = $this
79
            ->getMockBuilder('OroCRM\Bundle\SalesBundle\Provider\Opportunity\ForecastProvider')
80
            ->disableOriginalConstructor()
81
            ->getMock();
82
83
        $this->ownerHelper->expects($this->any())
84
            ->method('getOwnerIds')
85
            ->willReturn([]);
86
87
        $this->filterDateRangeConverter = $this
88
            ->getMockBuilder('Oro\Bundle\DashboardBundle\Provider\Converters\FilterDateRangeConverter')
89
            ->disableOriginalConstructor()
90
            ->getMock();
91
92
        $this->provider = new ForecastOfOpportunities(
93
            $this->numberFormatter,
94
            $this->dateTimeFormatter,
95
            $this->translator,
96
            $this->dateHelper,
97
            $this->ownerHelper,
98
            $this->forecastProvider,
99
            $this->filterDateRangeConverter
100
        );
101
    }
102
103
    public function tearDown()
104
    {
105
        unset(
106
            $this->numberFormatter,
107
            $this->dateTimeFormatter,
108
            $this->translator,
109
            $this->dateHelper,
110
            $this->ownerHelper,
111
            $this->provider
112
        );
113
    }
114
115
    public function testForecastOfOpportunitiesValues()
116
    {
117
        $options       = [
118
            'dateRange' => ['start' => null, 'end' => null]
119
        ];
120
        $widgetOptions = new WidgetOptionBag($options);
121
122
        $this->forecastProvider->expects($this->exactly(3))
0 ignored issues
show
Bug introduced by
The method expects() does not seem to exist on object<OroCRM\Bundle\Sal...unity\ForecastProvider>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
123
            ->method('getForecastData')
124
            ->with([], null, null, null, [])
125
            ->will($this->returnValue(['inProgressCount' => 5, 'budgetAmount' => 1000, 'weightedForecast' => 500]));
126
127
        $result = $this->provider
128
            ->getForecastOfOpportunitiesValues($widgetOptions, 'inProgressCount', 'integer', false);
129
        $this->assertEquals(['value' => 5], $result);
130
131
        $result = $this->provider
132
            ->getForecastOfOpportunitiesValues($widgetOptions, 'budgetAmount', 'currency', false);
133
        $this->assertEquals(['value' => 1000], $result);
134
135
        $result = $this->provider
136
            ->getForecastOfOpportunitiesValues($widgetOptions, 'weightedForecast', 'currency', false);
137
        $this->assertEquals(['value' => 500], $result);
138
    }
139
140
    public function testForecastOfOpportunitiesValuesWithCompareDate()
141
    {
142
        $start = new \DateTime();
143
        $start->setDate(2016, 6, 1)->setTime(0, 0, 0);
144
        $end = clone $start;
145
        $end->setDate(2016, 7, 1);
146
        $diff      = $start->diff($end);
147
        $prevStart = clone $start;
148
        $prevStart->sub($diff);
149
        $prevEnd = clone $end;
150
        $prevEnd->sub($diff);
151
        $prevStart->setTime(0, 0, 0);
152
        $prevEnd->setTime(23, 59, 59);
153
154
        $dateRange     = [
155
            'start' => $start,
156
            'end' => $end,
157
            'prev_start' => $prevStart,
158
            'prev_end' => $prevEnd,
159
            'type' => AbstractDateFilterType::TYPE_BETWEEN,
160
        ];
161
        $widgetOptions = new WidgetOptionBag(
162
            [
163
                'compareToDate' => ['useDate' => true, 'date' => null],
164
                'dateRange'     => $dateRange
165
            ]
166
        );
167
168
        $forecastDataCallback = function ($users, $start, $end, $moment) {
169
            if ($moment === null) {
170
                return ['inProgressCount' => 5, 'budgetAmount' => 1000, 'weightedForecast' => 500];
171
            }
172
173
            return ['inProgressCount' => 2, 'budgetAmount' => 200, 'weightedForecast' => 50];
174
        };
175
        $this->dateHelper
0 ignored issues
show
Bug introduced by
The method expects() does not seem to exist on object<Oro\Bundle\Dashbo...ndle\Helper\DateHelper>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
176
            ->expects($this->once())
177
            ->method('getCurrentDateTime')
178
            ->willReturn(new \DateTime());
179
180
        $reflection = new \ReflectionObject($this->provider);
181
        $method     = $reflection->getMethod('getMoment');
182
        $method->setAccessible(true);
183
        $prevMoment = $method->invokeArgs($this->provider, [$dateRange, $start]);
184
185
        $this->forecastProvider->expects($this->exactly(6))
0 ignored issues
show
Bug introduced by
The method expects() does not seem to exist on object<OroCRM\Bundle\Sal...unity\ForecastProvider>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
186
            ->method('getForecastData')
187
            ->with(
188
                [],
189
                $this->logicalOr($start, $prevStart),
190
                $this->logicalOr($end, $prevEnd),
191
                $this->logicalOr(null, $prevMoment)
192
            )
193
            ->will($this->returnCallback($forecastDataCallback));
194
195
        $this->filterDateRangeConverter->expects($this->any())
0 ignored issues
show
Bug introduced by
The method expects() does not seem to exist on object<Oro\Bundle\Dashbo...lterDateRangeConverter>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
196
            ->method('getViewValue')
197
            ->with(['start' => $prevStart, 'end' => $prevEnd, 'type' => AbstractDateFilterType::TYPE_BETWEEN])
198
            ->will($this->returnValue('prev range'));
199
200
        $result = $this->provider
201
            ->getForecastOfOpportunitiesValues($widgetOptions, 'inProgressCount', 'integer', false);
202
        $this->assertEquals(
203
            ['value' => 5, 'deviation' => '+3 (+1.5)', 'isPositive' => true, 'previousRange' => 'prev range'],
204
            $result
205
        );
206
207
        $result = $this->provider
208
            ->getForecastOfOpportunitiesValues($widgetOptions, 'budgetAmount', 'currency', false);
209
        $this->assertEquals(
210
            ['value' => 1000, 'deviation' => '+800 (+4)', 'isPositive' => 1, 'previousRange' => 'prev range'],
211
            $result
212
        );
213
214
        $result = $this->provider
215
            ->getForecastOfOpportunitiesValues($widgetOptions, 'weightedForecast', 'currency', false);
216
        $this->assertEquals(
217
            ['value' => 500, 'deviation' => '+450 (+9)', 'isPositive' => 1, 'previousRange' => 'prev range'],
218
            $result
219
        );
220
    }
221
}
222