3 namespace spec\Behat\MinkExtension\Listener;
5 use Behat\Behat\EventDispatcher\Event\ScenarioTested;
6 use Behat\Gherkin\Node\FeatureNode;
7 use Behat\Gherkin\Node\ScenarioNode;
9 use Behat\Testwork\ServiceContainer\Exception\ProcessingException;
10 use Behat\Testwork\Suite\Exception\SuiteConfigurationException;
11 use Behat\Testwork\Suite\Suite;
12 use PhpSpec\ObjectBehavior;
14 class SessionsListenerSpec extends ObjectBehavior
16 function let(Mink $mink, ScenarioTested $event, FeatureNode $feature, ScenarioNode $scenario, Suite $suite)
18 $this->beConstructedWith($mink, 'goutte', 'selenium2', array('selenium2', 'sahi'));
20 $event->getSuite()->willReturn($suite);
21 $event->getFeature()->willReturn($feature);
22 $event->getScenario()->willReturn($scenario);
24 $suite->hasSetting('mink_session')->willReturn(false);
25 $suite->getName()->willReturn('default');
27 $feature->hasTag('insulated')->willReturn(false);
28 $feature->getTags()->willReturn(array());
29 $scenario->hasTag('insulated')->willReturn(false);
30 $scenario->getTags()->willReturn(array());
33 function it_is_an_event_subscriber()
35 $this->shouldHaveType('Symfony\Component\EventDispatcher\EventSubscriberInterface');
38 function it_resets_the_default_session_before_scenarios($event, $mink)
40 $mink->resetSessions()->shouldBeCalled();
41 $mink->setDefaultSessionName('goutte')->shouldBeCalled();
43 $this->prepareDefaultMinkSession($event);
46 function it_supports_changing_the_default_session_per_suite($event, $mink, $suite)
48 $suite->hasSetting('mink_session')->willReturn(true);
49 $suite->getSetting('mink_session')->willReturn('test');
51 $mink->resetSessions()->shouldBeCalled();
52 $mink->setDefaultSessionName('test')->shouldBeCalled();
54 $this->prepareDefaultMinkSession($event);
57 function it_fails_for_non_string_default_suite_session($event, $suite)
59 $suite->hasSetting('mink_session')->willReturn(true);
60 $suite->getSetting('mink_session')->willReturn(array());
62 $this->shouldThrow(new SuiteConfigurationException('`mink_session` setting of the "default" suite is expected to be a string, array given.', 'default'))
63 ->duringPrepareDefaultMinkSession($event);
66 function it_switches_to_the_javascript_session_for_tagged_scenarios($event, $mink, $scenario, $suite)
68 $suite->hasSetting('mink_javascript_session')->willReturn(false);
69 $scenario->getTags()->willReturn(array('javascript'));
70 $mink->resetSessions()->shouldBeCalled();
71 $mink->setDefaultSessionName('selenium2')->shouldBeCalled();
73 $this->prepareDefaultMinkSession($event);
76 function it_switches_to_the_javascript_session_for_tagged_features($event, $mink, $feature, $suite)
78 $suite->hasSetting('mink_javascript_session')->willReturn(false);
79 $feature->getTags()->willReturn(array('javascript'));
80 $mink->resetSessions()->shouldBeCalled();
81 $mink->setDefaultSessionName('selenium2')->shouldBeCalled();
83 $this->prepareDefaultMinkSession($event);
86 function it_supports_changing_the_default_javascript_session_per_suite($event, $mink, $scenario, $suite)
88 $suite->hasSetting('mink_javascript_session')->willReturn(true);
89 $suite->getSetting('mink_javascript_session')->willReturn('sahi');
91 $scenario->getTags()->willReturn(array('javascript'));
92 $mink->resetSessions()->shouldBeCalled();
93 $mink->setDefaultSessionName('sahi')->shouldBeCalled();
95 $this->prepareDefaultMinkSession($event);
98 function it_fails_for_non_string_javascript_suite_session($event, $scenario, $suite)
100 $suite->hasSetting('mink_javascript_session')->willReturn(true);
101 $suite->getSetting('mink_javascript_session')->willReturn(array());
103 $scenario->getTags()->willReturn(array('javascript'));
105 $this->shouldThrow(new SuiteConfigurationException('`mink_javascript_session` setting of the "default" suite is expected to be a string, array given.', 'default'))
106 ->duringPrepareDefaultMinkSession($event);
109 function it_fails_for_invalid_javascript_suite_session($event, $scenario, $suite)
111 $suite->hasSetting('mink_javascript_session')->willReturn(true);
112 $suite->getSetting('mink_javascript_session')->willReturn('test');
114 $scenario->getTags()->willReturn(array('javascript'));
116 $this->shouldThrow(new SuiteConfigurationException('`mink_javascript_session` setting of the "default" suite is not a javascript session. test given but expected one of selenium2, sahi.', 'default'))
117 ->duringPrepareDefaultMinkSession($event);
120 function it_fails_when_the_javascript_session_is_used_but_not_defined($event, $mink, $feature, $suite)
122 $suite->hasSetting('mink_javascript_session')->willReturn(false);
123 $this->beConstructedWith($mink, 'goutte', null);
124 $feature->getTags()->willReturn(array('javascript'));
126 $this->shouldThrow(new ProcessingException('The @javascript tag cannot be used without enabling a javascript session'))
127 ->duringPrepareDefaultMinkSession($event);
130 function it_switches_to_a_named_session($event, $mink, $scenario)
132 $scenario->getTags()->willReturn(array('mink:test'));
133 $mink->resetSessions()->shouldBeCalled();
134 $mink->setDefaultSessionName('test')->shouldBeCalled();
136 $this->prepareDefaultMinkSession($event);
139 function it_prefers_the_scenario_over_the_feature($event, $mink, $scenario, $feature, $suite)
141 $suite->hasSetting('mink_javascript_session')->willReturn(false);
142 $scenario->getTags()->willReturn(array('mink:test'));
143 $feature->getTags()->willReturn(array('javascript'));
144 $mink->resetSessions()->shouldBeCalled();
145 $mink->setDefaultSessionName('test')->shouldBeCalled();
147 $this->prepareDefaultMinkSession($event);
150 function it_stops_the_sessions_for_insulated_scenarios($event, $mink, $scenario)
152 $scenario->hasTag('insulated')->willReturn(true);
153 $mink->stopSessions()->shouldBeCalled();
154 $mink->setDefaultSessionName('goutte')->shouldBeCalled();
156 $this->prepareDefaultMinkSession($event);
159 function it_stops_the_sessions_for_insulated_features($event, $mink, $feature)
161 $feature->hasTag('insulated')->willReturn(true);
162 $mink->stopSessions()->shouldBeCalled();
163 $mink->setDefaultSessionName('goutte')->shouldBeCalled();
165 $this->prepareDefaultMinkSession($event);
168 function it_stops_the_sessions_at_the_end_of_the_exercise($mink)
170 $mink->stopSessions()->shouldBeCalled();
172 $this->tearDownMinkSessions();