/**
  * @test
  * @expectedException SocialNorm\Exceptions\InvalidAuthorizationCodeException
  */
 public function it_throws_if_the_state_cant_be_verified()
 {
     $session = M::mock('SocialNorm\\Session');
     $session->shouldReceive('get')->with('oauth.state')->andReturn('valid-state');
     $provider = new ProviderStub('http://example.com/authorize', M::mock('SocialNorm\\User'));
     $socialNorm = new SocialNorm(new ProviderRegistry(), $session, new Request(['state' => 'invalid-state']), new StateGenerator());
     $socialNorm->registerProvider('foo', $provider);
     $socialNorm->getUser('foo');
 }
 /** @test */
 public function it_works()
 {
     $authorizeUrl = 'http://example.com/authorize';
     $user = M::mock('SocialNorm\\User');
     $provider = new ProviderStub($authorizeUrl, $user);
     $session = new InMemorySession();
     // Simulate first request
     $socialNorm = new SocialNorm(new ProviderRegistry(), $session, new Request([]), new StateGenerator());
     $socialNorm->registerProvider('foo', $provider);
     $returnedUrl = $socialNorm->authorize('foo');
     $this->assertStringStartsWith($authorizeUrl, $returnedUrl);
     // Simulate second request
     $state = $this->parseStateFromUrl($returnedUrl);
     $socialNorm = new SocialNorm(new ProviderRegistry(), $session, new Request(['state' => $state]), new StateGenerator());
     $socialNorm->registerProvider('foo', $provider);
     $returnedUser = $socialNorm->getUser('foo');
     $this->assertEquals($user, $returnedUser);
 }