public void Cannot_Register_with_null_client()
        {
            var sut = new TwitterUserTracker();
            var ex  = Record.Exception(() => sut.Register(Guid.NewGuid(), null));

            ex.Should().BeOfType <ArgumentNullException>();
        }
        public void Get_Auth_Sign_In_Populates_Twitter_Auth_Link()
        {
            //arrange
            var twitterApi  = A.Fake <ITwitterAuthenticatedClient>();
            var callBackUrl = new Uri("http://api.faketwitter.com/?foo=bar");

            A.CallTo(() => twitterApi.GetAuthorizationUri(A <string> ._)).Returns(callBackUrl);

            var twitterUserTracker = new TwitterUserTracker();

            var bootstrapper = new TestBootstrapper(
                with =>
            {
                with.Module <AuthModule>();
                with.Dependency <ITwitterAuthenticatedClient>(twitterApi);
                with.Dependency <ITwitterUserTracker>(twitterUserTracker);
            });

            var browser = new Browser(bootstrapper);

            //act
            var response = browser.Get("/auth/signin");

            //assert
            response.StatusCode.Should().Be(HttpStatusCode.OK);
            response.GetViewName().Should().Be("SignIn");
            var authUrl = (Uri)(response.Context.ViewBag.AuthUrl);

            authUrl.ShouldBeEquivalentTo(callBackUrl);
        }
        protected override void ConfigureApplicationContainer(TinyIoCContainer container)
        {
            base.ConfigureApplicationContainer(container);

            //plug in twitter api

            var consumerKey       = ConfigurationManager.AppSettings["ConsumerKey"];
            var consumerSecret    = ConfigurationManager.AppSettings["ConsumerSecret"];
            var accessToken       = ConfigurationManager.AppSettings["AccessToken"];
            var accessTokenSecret = ConfigurationManager.AppSettings["AccessTokenSecret"];

            var twitterApi =
                TweetSharpPublicClientAdapter.Create(consumerKey, consumerSecret, accessToken, accessTokenSecret)
                .GetAwaiter()
                .GetResult();

            // public twitter client singleton
            container.Register <ITwitterPublicClient>(twitterApi);

            // factory method for authed twitter client
            // instantiated on sign in then cached in-mem
            // for each user
            container.Register <ITwitterAuthenticatedClient>((_, __) => new TweetSharpAuthenticatedClientAdapter(consumerKey, consumerSecret));

            // user tracker singleton
            // maps session guids to IUserIdentity
            // retrieves authenticated twitter client for a given user
            var twitterUserTracker = new TwitterUserTracker();

            container.Register <ITwitterUserTracker>(twitterUserTracker);
            container.Register <IUserMapper>(twitterUserTracker);
        }
        public void Cannot_Register_with_invalid_Guid()
        {
            var client = A.Fake <ITwitterAuthenticatedClient>();
            var sut    = new TwitterUserTracker();
            var ex     = Record.Exception(() => sut.Register(new Guid(), client));

            ex.Should().BeOfType <ArgumentOutOfRangeException>();
        }
        public void Returns_null_UserIdentity_When_Not_registered()
        {
            var context = new NancyContext();
            var sut     = new TwitterUserTracker();

            var result = sut.GetUserFromIdentifier(Guid.NewGuid(), context);

            result.Should().BeNull();
        }
        public void When_registered_Can_retrieve_TwitterClient_from_UserId()
        {
            const long TwitterUserId = 123L;
            var        sessionid     = Guid.NewGuid();

            var client = A.Fake <ITwitterAuthenticatedClient>();

            A.CallTo(() => client.UserId).Returns(TwitterUserId);
            var sut = new TwitterUserTracker();

            sut.Register(sessionid, client);

            var result = sut.GetAuthenticatedTwitterClientForUser(TwitterUserId);

            result.Should().NotBeNull();
            result.UserId.Should().Be(TwitterUserId);
        }
        public void Can_register_multiple_sessions_from_the_same_user()
        {
            const long TwitterUserId   = 123L;
            var        sessionid       = Guid.NewGuid();
            var        secondSessionId = Guid.NewGuid();

            var client = A.Fake <ITwitterAuthenticatedClient>();

            A.CallTo(() => client.UserId).Returns(TwitterUserId);
            var sut = new TwitterUserTracker();

            sut.Register(sessionid, client);
            sut.Register(secondSessionId, client);

            var result = sut.GetAuthenticatedTwitterClientForUser(TwitterUserId);

            result.Should().NotBeNull();
            result.UserId.Should().Be(TwitterUserId);
        }
        public void When_registered_Can_retrieve_UserIdentity_from_Session_Id()
        {
            const long TwitterUserId = 123L;
            var        sessionid     = Guid.NewGuid();

            var client = A.Fake <ITwitterAuthenticatedClient>();

            A.CallTo(() => client.UserId).Returns(TwitterUserId);

            var context = new NancyContext();
            var sut     = new TwitterUserTracker();

            sut.Register(sessionid, client);

            var user = sut.GetUserFromIdentifier(sessionid, context);

            user.Should().NotBeNull();
            user.Should().BeOfType <TwitterUser>();
            user.As <TwitterUser>().TwitterUserId.Should().Be(TwitterUserId);
        }
        public void Unauthenticated_Get_should_return_403()
        {
            //arrange
            var twitterUserTracker = new TwitterUserTracker();

            var bootstrapper = new TestBootstrapper(
                with =>
            {
                with.Module <TweetModule>();
                with.Dependency <ITwitterUserTracker>(twitterUserTracker);
            });

            var browser = new Browser(bootstrapper);

            //act
            var response = browser.Get("/tweet");

            //assert
            response.StatusCode.Should().Be(HttpStatusCode.Unauthorized);
        }