/// <summary>
        /// Creates a new list
        /// </summary>
        /// <param name="listName">name of list</param>
        /// <param name="mode">public or private</param>
        /// <param name="description">list description</param>
        /// <param name="callback">Async Callback used in Silverlight queries</param>
        /// <returns>List info for new list</returns>
        public static List CreateList(this TwitterContext ctx, string listName, string mode, string description, Action<TwitterAsyncResponse<List>> callback)
        {
            if (string.IsNullOrEmpty(listName))
            {
                throw new ArgumentException("listName is required.", "listName");
            }

            var createUrl = ctx.BaseUrl + "lists/create.json";

            var reqProc = new ListRequestProcessor<List>();

            ITwitterExecute exec = ctx.TwitterExecutor;
            exec.AsyncCallback = callback;
            var resultsJson =
                exec.PostToTwitter(
                    createUrl,
                    new Dictionary<string, string>
                    {
                        { "name", listName },
                        { "mode", mode },
                        { "description", description }
                    },
                    response => reqProc.ProcessActionResult(response, ListAction.Create));

            List results = reqProc.ProcessActionResult(resultsJson, ListAction.Create);
            return results;
        }
        /// <summary>
        /// Modifies an existing list.
        /// </summary>
        /// <param name="listID">ID of list</param>
        /// <param name="slug">name of list</param>
        /// <param name="ownerID">ID of user who owns the list.</param>
        /// <param name="ownerScreenName">Screen name of user who owns the list.</param>
        /// <param name="mode">public or private</param>
        /// <param name="description">list description</param>
        /// <returns>List info for modified list</returns>
        public async Task<List> UpdateListAsync(ulong listID, string slug, string name, ulong ownerID, string ownerScreenName, string mode, string description, CancellationToken cancelToken = default(CancellationToken))
        {
            if (listID == 0 && string.IsNullOrWhiteSpace(slug))
                throw new ArgumentException("Either listID or slug is required.", ListIDOrSlugParam);

            if (!string.IsNullOrWhiteSpace(slug) && ownerID == 0 && string.IsNullOrWhiteSpace(ownerScreenName))
                throw new ArgumentException("If you specify a Slug, you must also specify either OwnerID or OwnerScreenName.", OwnerIDOrOwnerScreenNameParam);

            var updateListUrl = BaseUrl + "lists/update.json";

            var reqProc = new ListRequestProcessor<List>();

            RawResult =
                await TwitterExecutor.PostToTwitterAsync<List>(
                    updateListUrl,
                    new Dictionary<string, string>
                    {
                        { "list_id", listID.ToString() },
                        { "slug", slug },
                        { "owner_id", ownerID.ToString() },
                        { "owner_screen_name", ownerScreenName },
                        { "mode", mode },
                        { "description", description },
                        { "name", name }
                    },
                    cancelToken)
                    .ConfigureAwait(false);

            return reqProc.ProcessActionResult(RawResult, ListAction.Update);
        }
        public void ProcessResultsTest()
        {
            ListRequestProcessor <List> listProc = new ListRequestProcessor <List>();
            XElement twitterResponse             = XElement.Load(new StringReader(m_testQueryResponse));
            var      actual      = listProc.ProcessResults(twitterResponse.Descendants("list").First());
            var      actualQuery = actual as IList <List>;

            Assert.IsNotNull(actualQuery);
            Assert.AreEqual(actualQuery.Count(), 1);
        }
        public void BuildURLTestMissingScreenName()
        {
            ListRequestProcessor <List> target = new ListRequestProcessor <List> {
                BaseUrl = "https://api.twitter.com/1/"
            };
            Dictionary <string, string> parameters =
                new Dictionary <string, string>
            {
                { "Type", "0" },
            };
            string expected = "https://api.twitter.com/1/JoeMayo/lists.xml";
            string actual   = target.BuildURL(parameters);

            Assert.AreEqual(expected, actual);
        }
        public void GetParametersTest()
        {
            ListRequestProcessor <List>     target     = new ListRequestProcessor <List>();
            Expression <Func <List, bool> > expression =
                list =>
                list.Type == ListType.Members &&
                list.ScreenName == "JoeMayo" &&
                list.Cursor == "123" &&
                list.ListID == "456" &&
                list.MaxID == 789 &&
                list.Page == 1 &&
                list.PerPage == 10 &&
                list.SinceID == 123 &&
                list.ID == "456";
            LambdaExpression lambdaExpression = expression as LambdaExpression;

            var queryParams = target.GetParameters(lambdaExpression);

            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>("Type", ((int)ListType.Members).ToString())));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>("ScreenName", "JoeMayo")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>("Cursor", "123")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>("ListID", "456")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>("MaxID", "789")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>("Page", "1")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>("PerPage", "10")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>("SinceID", "123")));
            Assert.IsTrue(
                queryParams.Contains(
                    new KeyValuePair <string, string>("ID", "456")));
        }
        public void NullParametersTest()
        {
            ListRequestProcessor <List> target = new ListRequestProcessor <List> {
                BaseUrl = "https://api.twitter.com/1/"
            };
            Dictionary <string, string> parameters = null;
            string actual;

            try
            {
                actual = target.BuildURL(parameters);
                Assert.Fail("Expected ArgumentException.");
            }
            catch (ArgumentException ae)
            {
                Assert.AreEqual <string>("Type", ae.ParamName);
            }
        }
        public void BuildStatusUrlTestWithParameters()
        {
            ListRequestProcessor <List> target = new ListRequestProcessor <List>()
            {
                BaseUrl = "https://api.twitter.com/1/"
            };
            var parameters = new Dictionary <string, string>
            {
                { "Type", ((int)ListType.Statuses).ToString() },
                { "ScreenName", "JoeMayo" },
                { "ListID", "1234567" },
                { "MaxID", "9876543" },
                { "SinceID", "2345678" },
                { "PerPage", "100" },
                { "Page", "2" }
            };
            string expected =
                "https://api.twitter.com/1/JoeMayo/lists/1234567/statuses.xml?max_id=9876543&since_id=2345678&per_page=100&page=2";
            string actual = target.BuildURL(parameters);

            Assert.AreEqual(expected, actual);
        }
        /// <summary>
        /// Creates a new list.
        /// </summary>
        /// <param name="listName">name of list</param>
        /// <param name="mode">public or private</param>
        /// <param name="description">list description</param>
        /// <returns>List info for new list</returns>
        public async Task<List> CreateListAsync(string listName, string mode, string description, CancellationToken cancelToken = default(CancellationToken))
        {
            if (string.IsNullOrWhiteSpace(listName))
                throw new ArgumentException("listName is required.", "listName");

            var createUrl = BaseUrl + "lists/create.json";

            var reqProc = new ListRequestProcessor<List>();

            RawResult =
                await TwitterExecutor.PostToTwitterAsync<List>(
                    createUrl,
                    new Dictionary<string, string>
                    {
                        { "name", listName },
                        { "mode", mode },
                        { "description", description }
                    },
                    cancelToken)
                    .ConfigureAwait(false);

            return reqProc.ProcessActionResult(RawResult, ListAction.Create);
        }
        void TestSingleUserResponse(ListRequestProcessor<List> listProc)
        {
            var listsResponse = listProc.ProcessResults(SingleUserResponse);

            var lists = listsResponse as IList<List>;
            Assert.NotNull(lists);
            Assert.Single(lists);
            var users = lists.Single().Users;
            Assert.NotNull(users);
            Assert.Single(users);
            Assert.Equal("LINQ to Tweeter Test", users.Single().Name);
        }
        void TestMultipleUsersResponse(ListRequestProcessor<List> listProc)
        {
            var listsResponse = listProc.ProcessResults(MultipleUsersResponse);

            var lists = listsResponse as IList<List>;
            Assert.NotNull(lists);
            Assert.Single(lists);
            var list = lists.Single();
            var users = list.Users;
            Assert.NotNull(users);
            Assert.Equal(3, users.Count);
            Assert.Equal("LINQ to Tweeter Test", users.First().Name);
            var cursor = list.CursorMovement;
            Assert.NotNull(cursor);
            Assert.Equal("1352721896474871923", cursor.Next);
            Assert.Equal("7", cursor.Previous);
        }
        public void ProcessResults_Handles_Subscriptions_Response()
        {
            var listProc = new ListRequestProcessor<List> { Type = ListType.Subscriptions };

            TestMultipleListsResponse(listProc);
        }
        public void BuildShowUrl_Returns_Url()
        {
            const string ExpectedUrl = "https://api.twitter.com/1.1/lists/show.json?slug=test&owner_id=123&owner_screen_name=JoeMayo&list_id=456";
            var listReqProc = new ListRequestProcessor<List>() { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters = new Dictionary<string, string>
            {
                { "Type", ((int) ListType.Show).ToString() },
                { "OwnerID", "123" },
                { "OwnerScreenName", "JoeMayo" },
                { "Slug", "test" },
                { "ListID", "456" }
            };

            Request req = listReqProc.BuildUrl(parameters);

            Assert.Equal(ExpectedUrl, req.FullUrl);
        }
        public void GetParameters_Parses_All_Available_Parameters()
        {
            var listReqProc = new ListRequestProcessor<List>();
            Expression<Func<List, bool>> expression =
                list =>
                    list.Type == ListType.Members &&
                    list.UserID == "456" &&
                    list.ScreenName == "JoeMayo" &&
                    list.ListID == "456" &&
                    list.Slug == "test" &&
                    list.OwnerID == "789" &&
                    list.OwnerScreenName == "JoeMayo" &&
                    list.Cursor == "123" &&
                    list.MaxID == 789 &&
                    list.Page == 1 &&
                    list.Count == 10 &&
                    list.SinceID == 123 &&
                    list.FilterToOwnedLists == true &&
                    list.TrimUser == true &&
                    list.IncludeEntities == true &&
                    list.IncludeRetweets == true &&
                    list.SkipStatus == true &&
                    list.Reverse == true;

            var queryParams = listReqProc.GetParameters(expression);

            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("Type", ((int)ListType.Members).ToString())));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("UserID", "456")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("ScreenName", "JoeMayo")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("ListID", "456")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("Slug", "test")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("OwnerID", "789")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("OwnerScreenName", "JoeMayo")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("Cursor", "123")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("MaxID", "789")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("Page", "1")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("Count", "10")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("SinceID", "123")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("FilterToOwnedLists", "True")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("TrimUser", "True")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("IncludeEntities", "True")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("IncludeRetweets", "True")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("SkipStatus", "True")));
            Assert.True(
                queryParams.Contains(
                    new KeyValuePair<string, string>("Reverse", "True")));
        }
        /// <summary>
        /// Deletes membership for a comma-separated list of users.
        /// </summary>
        /// <param name="listID">ID of list.</param>
        /// <param name="slug">Name of list to remove from.</param>
        /// <param name="userIds">List of user IDs of users to remove from list membership.</param>
        /// <param name="screenNames">List of screen names of users to remove from list membership.</param>
        /// <param name="ownerID">ID of users who owns the list.</param>
        /// <param name="ownerScreenName">Screen name of user who owns the list.</param>
        /// <returns>List info for list subscription removed from</returns>
        async Task<List> DeleteMemberRangeFromListAsync(ulong listID, string slug, List<ulong> userIDs, List<string> screenNames, ulong ownerID, string ownerScreenName, CancellationToken cancelToken = default(CancellationToken))
        {
            if (listID == 0 && string.IsNullOrWhiteSpace(slug))
                throw new ArgumentException("Either listID or slug is required.", ListIDOrSlugParam);

            if (listID == 0 && !string.IsNullOrWhiteSpace(slug) && 
                ownerID == 0 && string.IsNullOrWhiteSpace(ownerScreenName))
                throw new ArgumentException("If using slug, you must also provide either ownerID or ownerScreenName.", OwnerIDOrOwnerScreenNameParam);

            if ((userIDs != null && userIDs.Count > 100) || 
                (screenNames != null && screenNames.Count > 100))
                throw new ArgumentException("You can only remove 100 members at a Time.", "userIDs");

            var destroyAllUrl = BaseUrl + "lists/members/destroy_all.json";

            var reqProc = new ListRequestProcessor<List>();

            var parameters = new Dictionary<string, string>();

            if (listID != 0)
                parameters.Add("list_id", listID.ToString());
            if (!string.IsNullOrWhiteSpace(slug))
                parameters.Add("slug", slug);
            if (userIDs != null && userIDs.Any())
                parameters.Add("user_id", string.Join(",", userIDs.Select(id => id.ToString(CultureInfo.InvariantCulture)).ToArray()));
            if (screenNames != null && screenNames.Any())
                parameters.Add("screen_name", string.Join(",", screenNames));
            if (ownerID != 0)
                parameters.Add("owner_id", ownerID.ToString());
            if (!string.IsNullOrWhiteSpace(ownerScreenName))
                parameters.Add("owner_screen_name", ownerScreenName);

            RawResult =
                await TwitterExecutor.PostToTwitterAsync<List>(destroyAllUrl, parameters, cancelToken).ConfigureAwait(false);

            return reqProc.ProcessActionResult(RawResult, ListAction.DestroyAll);
        }
        /// <summary>
        /// Removes a user as a list subscriber.
        /// </summary>
        /// <param name="listID">ID of list.</param>
        /// <param name="slug">Name of list to remove from.</param>
        /// <param name="ownerID">ID of user who owns the list.</param>
        /// <param name="ownerScreenName">Screen name of user who owns the list.</param>
        /// <returns>List info for list subscription removed from</returns>
        public async Task<List> UnsubscribeFromListAsync(ulong listID, string slug, ulong ownerID, string ownerScreenName, CancellationToken cancelToken = default(CancellationToken))
        {
            if (listID == 0 && string.IsNullOrWhiteSpace(slug))
                throw new ArgumentException("Either listID or slug is required.", ListIDOrSlugParam);

            if (!string.IsNullOrWhiteSpace(slug) && ownerID == 0 && string.IsNullOrWhiteSpace(ownerScreenName))
                throw new ArgumentException("If using slug, you must also provide either ownerID or ownerScreenName.", OwnerIDOrOwnerScreenNameParam);

            var unsubscribeUrl = BaseUrl + "lists/subscribers/destroy.json";

            var reqProc = new ListRequestProcessor<List>();

            var parameters = new Dictionary<string, string>();

            if (listID != 0)
                parameters.Add("list_id", listID.ToString());
            if (!string.IsNullOrWhiteSpace(slug))
                parameters.Add("slug", slug);
            if (ownerID != 0)
                parameters.Add("owner_id", ownerID.ToString());
            if (!string.IsNullOrWhiteSpace(ownerScreenName))
                parameters.Add("owner_screen_name", ownerScreenName);

            RawResult =
                await TwitterExecutor.PostToTwitterAsync<List>(unsubscribeUrl, parameters, cancelToken).ConfigureAwait(false);

            return reqProc.ProcessActionResult(RawResult, ListAction.Unsubscribe);
        }
        public void ListRequestProcessor_Handles_Actions()
        {
            var listReqProc = new ListRequestProcessor<List>();

            Assert.IsAssignableFrom<IRequestProcessorWithAction<List>>(listReqProc);
        }
Exemple #17
0
        public void ListRequestProcessor_Handles_Actions()
        {
            var listReqProc = new ListRequestProcessor <List>();

            Assert.IsInstanceOfType(listReqProc, typeof(IRequestProcessorWithAction <List>));
        }
Exemple #18
0
        public void ListRequestProcessor_Handles_Actions()
        {
            var listReqProc = new ListRequestProcessor <List>();

            Assert.IsAssignableFrom <IRequestProcessorWithAction <List> >(listReqProc);
        }
        public void BuildUrl_Throws_On_Null_Param_List()
        {
            const string ExpectedParamName = "Type";
            var listReqProc = new ListRequestProcessor<List> { BaseUrl = "https://api.twitter.com/1.1/" };

            var ex = Assert.Throws<ArgumentException>(() => listReqProc.BuildUrl(null));

            Assert.Equal<string>(ExpectedParamName, ex.ParamName);
        }
        public void BuildListsUrl_Returns_Url()
        {
            const string ExpectedUrl = "https://api.twitter.com/1.1/lists/list.json?user_id=123&screen_name=JoeMayo&cursor=456&reverse=true";
            var listReqProc = new ListRequestProcessor<List>() { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters = new Dictionary<string, string>
            {
                { "Type", ((int) ListType.Lists).ToString() },
                { "UserID", "123" },
                { "ScreenName", "JoeMayo" },
                { "Cursor", "456" },
                { "Reverse", true.ToString() }
            };

            Request req = listReqProc.BuildUrl(parameters);

            Assert.Equal(ExpectedUrl, req.FullUrl);
        }
        public void BuildSubscribersUrl_Requires_Non_Null_And_Not_Empty_ListID_Or_Slug()
        {
            const string ExpectedParamName = "ListIdOrSlug";
            var listReqProc = new ListRequestProcessor<List> { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters = new Dictionary<string, string>
            {
                { "Type", ((int) ListType.Subscribers).ToString()},
                { "ListID", "" },
                { "Slug", null }
                //{"OwnerID", "123"},
            };

            var ex = Assert.Throws<ArgumentException>(() => listReqProc.BuildUrl(parameters));

            Assert.Equal(ExpectedParamName, ex.ParamName);
        }
        public void BuildMembershipsUrl_Does_Not_Add_False_Filter_To_Url()
        {
            const string ExpectedUrl = "https://api.twitter.com/1.1/lists/memberships.json?user_id=123&screen_name=JoeMayo&cursor=456";
            var listReqProc = new ListRequestProcessor<List>() { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters = new Dictionary<string, string>
            {
                { "Type", ((int) ListType.Memberships).ToString() },
                { "UserID", "123" },
                { "ScreenName", "JoeMayo" },
                { "Cursor", "456" },
                { "FilterToOwnedLists", "false" }
            };

            Request req = listReqProc.BuildUrl(parameters);

            Assert.Equal(ExpectedUrl, req.FullUrl);
        }
        public void BuildIsSubscriberUrl_Requires_UserID_Or_ScreenName()
        {
            const string ExpectedParamName = "UserIdOrScreenName";
            var listReqProc = new ListRequestProcessor<List> { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters = new Dictionary<string, string>
            {
                { "Type", ((int) ListType.IsSubscribed).ToString()},
                { "Slug", "test" },
                {"OwnerID", "123"},
            };

            var ex = Assert.Throws<ArgumentException>(() => listReqProc.BuildUrl(parameters));

            Assert.Equal(ExpectedParamName, ex.ParamName);
        }
        public void BuildStatusesUrl_Includes_False_Parameters()
        {
            const string ExpectedUrl = "https://api.twitter.com/1.1/lists/statuses.json?owner_id=123&owner_screen_name=JoeMayo&slug=test&list_id=456&since_id=789&max_id=234&count=25&per_page=25&page=3&trim_user=false&include_entities=false&include_rts=false";
            var listReqProc = new ListRequestProcessor<List>() { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters = new Dictionary<string, string>
            {
                { "Type", ((int) ListType.Statuses).ToString() },
                { "OwnerID", "123" },
                { "OwnerScreenName", "JoeMayo" },
                { "Slug", "test" },
                { "ListID", "456" },
                { "SinceID", "789" },
                { "MaxID", "234" },
                { "Count", "25" },
                { "Page", "3" },
                { "TrimUser", "false" },
                { "IncludeEntities", "false" },
                { "IncludeRetweets", "false" }
            };

            Request req = listReqProc.BuildUrl(parameters);

            Assert.Equal(ExpectedUrl, req.FullUrl);
        }
        public void BuildUrl_Returns_Ownerships_Url()
        {
            const string ExpectedUrl = "https://api.twitter.com/1.1/lists/ownerships.json?user_id=789&screen_name=JoeMayo&count=10&cursor=1";
            var listReqProc = new ListRequestProcessor<List>() { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters = new Dictionary<string, string>
            {
                { "Type", ((int) ListType.Ownerships).ToString() },
                { "UserID", "789" },
                { "ScreenName", "JoeMayo" },
                { "Count", "10" },
                { "Cursor", "1" }
            };

            Request req = listReqProc.BuildUrl(parameters);

            Assert.Equal(ExpectedUrl, req.FullUrl);
        }
        public void BuildUrl_Returns_SubscribersUrl()
        {
            const string ExpectedUrl = "https://api.twitter.com/1.1/lists/subscribers.json?owner_id=123&owner_screen_name=JoeMayo&slug=test&list_id=456&cursor=789&include_entities=true&skip_status=true";
            var listReqProc = new ListRequestProcessor<List>() { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters = new Dictionary<string, string>
            {
                { "Type", ((int) ListType.Subscribers).ToString() },
                { "Slug", "test" },
                { "OwnerID", "123" },
                { "OwnerScreenName", "JoeMayo" },
                { "ListID", "456" },
                { "Cursor", "789" },
                { "IncludeEntities", true.ToString() },
                { "SkipStatus", true.ToString() }
            };

            Request req = listReqProc.BuildUrl(parameters);

            Assert.Equal(ExpectedUrl, req.FullUrl);
        }
        public void ProcessResults_Handles_Statuses_Response()
        {
            var listProc = new ListRequestProcessor<List> { Type = ListType.Statuses };

            var listsResponse = listProc.ProcessResults(ListStatusesResponse);

            var lists = listsResponse as IList<List>;
            Assert.NotNull(lists);
            Assert.Single(lists);
            var statuses = lists.Single().Statuses;
            Assert.NotNull(statuses);
            Assert.Equal(4, statuses.Count);
            Assert.True(statuses.First().Text.StartsWith("so using this approach"));
        }
        public void BuildIsSubscriberUrl_Includes_False_Parameters()
        {
            const string ExpectedUrl = "https://api.twitter.com/1.1/lists/subscribers/show.json?user_id=789&screen_name=JoeMayo&slug=test&owner_id=123&owner_screen_name=JoeMayo&list_id=456&include_entities=false";
            var listReqProc = new ListRequestProcessor<List>() { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters = new Dictionary<string, string>
            {
                { "Type", ((int) ListType.IsSubscribed).ToString() },
                { "UserID", "789" },
                { "ScreenName", "JoeMayo" },
                { "Slug", "test" },
                { "OwnerID", "123" },
                { "OwnerScreenName", "JoeMayo" },
                { "ListID", "456" },
                { "IncludeEntities", "false" }
            };

            Request req = listReqProc.BuildUrl(parameters);

            Assert.Equal(ExpectedUrl, req.FullUrl);
        }
        public void BuildUrl_Works_With_Json_Format_Data()
        {
            var listReqProc = new ListRequestProcessor<List>();

            Assert.IsAssignableFrom<IRequestProcessorWantsJson>(listReqProc);
        }
        void TestMultipleListsResponse(ListRequestProcessor<List> listProc)
        {
            var listsResponse = listProc.ProcessResults(MultipleListsResponse);

            var lists = listsResponse as IList<List>;
            Assert.NotNull(lists);
            Assert.Equal(4, lists.Count());
            var list = lists.First();
            Assert.Equal("test", list.Name);
            Assert.Equal("@Linq2Tweeter/test", list.FullName);
            Assert.Equal(1, list.MemberCount);
            Assert.Equal("This is a test2", list.Description);
            Assert.Equal("public", list.Mode);
            Assert.Equal("/Linq2Tweeter/test", list.Uri);
            var users = list.Users;
            Assert.NotNull(users);
            Assert.Single(users);
            Assert.Equal("LINQ to Tweeter", users.First().Name);
            Assert.Equal("44758373", list.ListIDResult);
            Assert.Equal(0, list.SubscriberCount);
            Assert.Equal(new DateTime(2011, 5, 8, 2, 0, 33), list.CreatedAt);
            Assert.Equal(false, list.Following);
            Assert.Equal("test", list.SlugResult);
        }
        public void ProcessResults_Returns_Empty_Collection_When_Empty_Results()
        {
            var listReqProc = new ListRequestProcessor<List>();

            var results = listReqProc.ProcessResults(string.Empty);

            Assert.Equal(0, results.Count);
        }
        public void ProcessResults_Handles_Show_Response()
        {
            var listProc = new ListRequestProcessor<List> { Type = ListType.Show };

            var listsResponse = listProc.ProcessResults(SingleListResponse);

            var lists = listsResponse as IList<List>;
            Assert.NotNull(lists);
            Assert.Single(lists);
            var list = lists.Single();
            Assert.Equal("DotNetTwittterDevs", list.Name);
            var users = list.Users;
            Assert.NotNull(users);
            Assert.Single(users);
            Assert.Equal("Joe Mayo", users.Single().Name);
        }
        public void ProcessResults_Retains_Original_Input_Parameters()
        {
            var listProc = new ListRequestProcessor<List> 
            { 
                Type = ListType.Show,
                UserID = "123",
                ScreenName = "JoeMayo",
                Cursor = "456",
                ListID = "789",
                Slug = "MyList",
                OwnerID = "123",
                OwnerScreenName = "JoeMayo",
                MaxID = 150,
                Count = 50,
                Page = 1,
                SinceID = 25,
                TrimUser = true,
                IncludeEntities = true,
                IncludeRetweets = true,
                FilterToOwnedLists = true,
                SkipStatus = true,
                Reverse = true
            };

            var listsResponse = listProc.ProcessResults(SingleListResponse);

            var lists = listsResponse as IList<List>;
            Assert.NotNull(lists);
            Assert.Single(lists);
            var list = lists.Single();
            Assert.Equal(ListType.Show, list.Type);
            Assert.Equal("123", list.UserID);
            Assert.Equal("JoeMayo", list.ScreenName);
            Assert.Equal("456", list.Cursor);
            Assert.Equal("789", list.ListID);
            Assert.Equal("MyList", list.Slug);
            Assert.Equal("123", list.OwnerID);
            Assert.Equal("JoeMayo", list.OwnerScreenName);
            Assert.Equal(150ul, list.MaxID);
            Assert.Equal(50, list.Count);
            Assert.Equal(1, list.Page);
            Assert.Equal(25ul, list.SinceID);
            Assert.True(list.TrimUser);
            Assert.True(list.IncludeEntities);
            Assert.True(list.IncludeRetweets);
            Assert.True(list.FilterToOwnedLists);
            Assert.True(list.SkipStatus);
            Assert.True(list.Reverse);
        }
        public void ProcessResults_Handles_Members_Response()
        {
            var listProc = new ListRequestProcessor<List> { Type = ListType.Members };

            TestMultipleUsersResponse(listProc);
        }
        public void BuildUrl_Creates_Lists_Url()
        {
            const string ExpectedUrl = "https://api.twitter.com/1.1/lists/list.json?screen_name=JoeMayo";
            var listReqProc = new ListRequestProcessor<List> { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters =
                new Dictionary<string, string>
                {
                    { "Type", ((int)ListType.Lists).ToString() },
                    { "ScreenName", "JoeMayo" }
                };

            Request req = listReqProc.BuildUrl(parameters);

            Assert.Equal(ExpectedUrl, req.FullUrl);
        }
        public void ProcessResults_Handles_IsSubscribed_Response()
        {
            var listProc = new ListRequestProcessor<List> { Type = ListType.IsSubscribed };

            TestSingleUserResponse(listProc);
        }
        public void BuildUrl_Throws_On_Missing_ScreenName()
        {
            const string ExpectedParamName = "UserIdOrScreenName";
            var listReqProc = new ListRequestProcessor<List> { BaseUrl = "https://api.twitter.com/1.1/" };
            var parameters =
                new Dictionary<string, string>
                {
                    { "Type", "0" },
                };

            var ex = Assert.Throws<ArgumentException>(() => listReqProc.BuildUrl(parameters));

            Assert.Equal(ExpectedParamName, ex.ParamName);
        }