public void TestSetTokensFiresEvent()
        {
            var credentials = new MeliCredentials(MeliSite.Panama, 123456, "secret", "oldToken");

            credentials.TokensChanged += (sender, args) => receivedEvents.Add(args);

            var model = new TokenResponse { AccessToken = "access", RefreshToken = "refresh" };

            credentials.SetTokens(model);

            Assert.AreEqual(1, receivedEvents.Count);
            Assert.AreSame(model, receivedEvents[0].Info);

            model.AccessToken = "new";
            model.RefreshToken = "value";

            Assert.AreEqual("oldToken", model.PreviousAccessToken);
            Assert.AreEqual("oldToken", receivedEvents[0].Info.PreviousAccessToken);

            credentials.SetTokens(model);

            Assert.AreEqual(2, receivedEvents.Count);
            Assert.AreSame(model, receivedEvents[0].Info);
            Assert.AreSame(receivedEvents[0].Info, receivedEvents[1].Info);
            Assert.AreEqual("access", model.PreviousAccessToken);
            Assert.AreEqual("access", receivedEvents[1].Info.PreviousAccessToken);
        }
        public void TestSetTokens()
        {
            var credentials = new MeliCredentials(MeliSite.Panama, 123456, "secret", "oldToken", "oldRefreshToken");

            var model = new TokenResponse {AccessToken = "newToken", RefreshToken = "newRefreshToken"};

            credentials.SetTokens(model);

            Assert.AreEqual("newToken", credentials.AccessToken);
            Assert.AreEqual("oldToken", model.PreviousAccessToken);
            Assert.AreEqual("newRefreshToken", credentials.RefreshToken);
        }
        public async void TestAuthorizeAsyncIsSuccessfull()
        {
            service.Credentials.Site = MeliSite.Mexico;

            var eventArgs = new List<MeliTokenEventArgs>();

            service.Credentials.TokensChanged += (sender, args) => eventArgs.Add(args);

            service.Credentials.Site = MeliSite.Mexico;

            var response = new TokenResponse
                           {
                               AccessToken = "valid token",
                               RefreshToken = "valid refresh token"
                           };

            mockHttp.Expect(HttpMethod.Post, "https://api.mercadolibre.com/oauth/token")
                    .WithQueryString("grant_type", "authorization_code")
                    .WithQueryString("client_id", "123456")
                    .WithQueryString("client_secret", "secret")
                    .WithQueryString("code", "valid code with refresh token")
                    .WithQueryString("redirect_uri", "https://someurl.com")
                    .Respond("application/json", JsonConvert.SerializeObject(response));

            var success = await service.AuthorizeAsync("valid code with refresh token", "https://someurl.com");

            Assert.IsTrue(success);

            Assert.AreEqual("valid token", service.Credentials.AccessToken);
            Assert.AreEqual("valid refresh token", service.Credentials.RefreshToken);

            Assert.AreEqual(1, eventArgs.Count);
            Assert.AreEqual("valid token", eventArgs[0].Info.AccessToken);
            Assert.AreEqual("valid refresh token", eventArgs[0].Info.RefreshToken);

            mockHttp.VerifyNoOutstandingExpectation();
        }
        /// <summary>
        /// Sets the tokens.
        /// </summary>
        /// <param name="model">The model.</param>
        /// <returns></returns>
        /// <remarks>
        /// Fires the 
        /// <see cref="OnTokensChanged" /> event if the token values have changed.
        /// Listen to this event if you need to persists the tokens.
        /// </remarks>
        public MeliCredentials SetTokens(TokenResponse model)
        {
            if (AccessToken != model.AccessToken || RefreshToken != model.RefreshToken)
            {
                model.PreviousAccessToken = AccessToken;
                OnTokensChanged(new MeliTokenEventArgs {Info = model});
            }

            AccessToken = model.AccessToken;
            RefreshToken = model.RefreshToken;

            return this;
        }