コード例 #1
0
        public async Task PostList_IncludeDeleted(TimelineNameGenerator generator)
        {
            using var client = await CreateClientAsUser();

            var posts = new List <HttpTimelinePost>();

            for (int i = 0; i < 4; i++)
            {
                var body = await client.TestPostAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts", CreateTextPostRequest("a"));

                posts.Add(body);
            }

            foreach (var id in new long[] { posts[0].Id, posts[2].Id })
            {
                await client.TestDeleteAsync($"timelines/{generator(1)}/posts/{id}");
            }

            {
                posts = await client.TestGetAsync <List <HttpTimelinePost> >($"timelines/{generator(1)}/posts?includeDeleted=true");

                posts.Should().HaveCount(4);
                posts.Select(p => p.Deleted).Should().Equal(true, false, true, false);
            }
        }
コード例 #2
0
        public async Task CreatePostPermission_Should_Work(TimelineNameGenerator generator)
        {
            using (var client = await CreateClientAsUser())
            {
                await client.PutTimelineMemberAsync(generator(1), "user2");
            }

            using (var client = await CreateDefaultClient())
            { // no auth should get 401
                await client.TestPostAssertUnauthorizedAsync($"timelines/{generator(1)}/posts", CreateTextPostRequest("aaa"));
            }

            using (var client = await CreateClientAsUser())
            {
                // post self's
                await client.TestPostAsync($"timelines/{generator(1)}/posts", CreateTextPostRequest("aaa"));

                // post other not as a member should get 403
                await client.TestPostAssertForbiddenAsync($"timelines/{generator(0)}/posts", CreateTextPostRequest("aaa"));
            }

            using (var client = await CreateClientAsAdministrator())
            { // post as admin
                await client.TestPostAsync($"timelines/{generator(1)}/posts", CreateTextPostRequest("aaa"));
            }

            using (var client = await CreateClientAs(2))
            { // post as member
                await client.TestPostAsync($"timelines/{generator(1)}/posts", CreateTextPostRequest("aaa"));
            }
        }
コード例 #3
0
        public async Task TimelineDescription_Should_Work(TimelineNameGenerator generator)
        {
            // TODO! Permission tests.

            using var client = await CreateClientAsUser();

            var timelineName = generator(1);

            {
                var timeline = await client.GetTimelineAsync(timelineName);

                timeline.Description.Should().BeEmpty();
            }

            const string mockDescription = "haha";

            {
                var timeline = await client.PatchTimelineAsync(timelineName, new() { Description = mockDescription });

                timeline.Description.Should().Be(mockDescription);
            }

            {
                var timeline = await client.GetTimelineAsync(timelineName);

                timeline.Description.Should().Be(mockDescription);
            }

            {
                var timeline = await client.PatchTimelineAsync(timelineName, new() { Description = null });

                timeline.Description.Should().Be(mockDescription);
            }

            {
                var timeline = await client.GetTimelineAsync(timelineName);

                timeline.Description.Should().Be(mockDescription);
            }

            {
                var timeline = await client.PatchTimelineAsync(timelineName, new() { Description = "" });

                timeline.Description.Should().BeEmpty();
            }

            {
                var timeline = await client.GetTimelineAsync(timelineName);

                timeline.Description.Should().BeEmpty();
            }
        }
コード例 #4
0
        public async Task GetPost(TimelineNameGenerator generator)
        {
            using var client = await CreateClientAsUser();


            await client.TestGetAssertNotFoundAsync($"timelines/{generator(1)}/posts/1");

            var post = await client.TestPostAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts", CreateTextPostRequest("a"));

            var post2 = await client.TestGetAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts/{post.Id}");

            post2.Should().BeEquivalentTo(post);

            await client.TestDeleteAsync($"timelines/{generator(1)}/posts/{post.Id}");

            await client.TestGetAssertNotFoundAsync($"timelines/{generator(1)}/posts/{post.Id}");
        }
コード例 #5
0
        public async Task Member_Should_Work(TimelineNameGenerator generator)
        {
            // TODO! Invalid model tests.
            // TODO! Permission tests.

            using var client = await CreateClientAsUser();

            var timelineName = generator(1);

            async Task AssertMembers(List <HttpUser> members)
            {
                var body = await client.GetTimelineAsync(timelineName);

                body.Members.Should().NotBeNull().And.BeEquivalentTo(members);
            }

            async Task AssertEmptyMembers()
            {
                var body = await client.GetTimelineAsync(timelineName);

                body.Members.Should().NotBeNull().And.BeEmpty();
            }

            await AssertEmptyMembers();

            await client.TestPutAssertErrorAsync($"timelines/{timelineName}/members/usernotexist", errorCode : ErrorCodes.NotExist.User);

            await AssertEmptyMembers();

            await client.PutTimelineMemberAsync(timelineName, "user2");

            await AssertMembers(new List <HttpUser> {
                await client.GetUserAsync("user2")
            });

            await client.DeleteTimelineMemberAsync(timelineName, "user2");

            await AssertEmptyMembers();

            await client.TestDeleteAssertErrorAsync($"timelines/{timelineName}/members/usernotexist");

            await AssertEmptyMembers();
        }
コード例 #6
0
        public async Task Get_Manageable_Postable(TimelineNameGenerator generator)
        {
            {
                using var client = await CreateClientAsUser();

                var timeline = await client.TestGetAsync <HttpTimeline>($"timelines/{generator(1)}");

                timeline.Manageable.Should().Be(true);
                timeline.Postable.Should().Be(true);
            }

            {
                using var client = await CreateClientAs(2);

                var timeline = await client.TestGetAsync <HttpTimeline>($"timelines/{generator(1)}");

                timeline.Manageable.Should().Be(false);
                timeline.Postable.Should().Be(false);
            }
        }
コード例 #7
0
        public async Task Color(TimelineNameGenerator generator)
        {
            using var client = await CreateClientAsUser();

            await client.TestPostAssertInvalidModelAsync($"timelines/{generator(1)}/posts", CreateTextPostRequest("a", color : "aa"));

            long id;

            {
                var post = await client.TestPostAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts",
                                                                         CreateTextPostRequest("a", color : "#aabbcc"));

                post.Color.Should().Be("#aabbcc");
                id = post.Id;
            }

            {
                var post = await client.TestGetAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts/{id}");

                post.Color.Should().Be("#aabbcc");
            }
        }
コード例 #8
0
        public async Task Title(TimelineNameGenerator generator)
        {
            using var client = await CreateClientAsUser();

            {
                var body = await client.GetTimelineAsync(generator(1));

                body.Title.Should().Be(body.Name);
            }

            {
                var body = await client.PatchTimelineAsync(generator(1), new HttpTimelinePatchRequest { Title = "atitle" });

                body.Title.Should().Be("atitle");
            }

            {
                var body = await client.GetTimelineAsync(generator(1));

                body.Title.Should().Be("atitle");
            }
        }
コード例 #9
0
        public async Task PatchPost(TimelineNameGenerator generator)
        {
            using var client = await CreateClientAsUser();

            var post = await client.TestPostAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts",
                                                                     CreateTextPostRequest("a"));

            var date = new DateTime(2000, 10, 1);

            var post2 = await client.TestPatchAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts/{post.Id}", new HttpTimelinePostPatchRequest
            {
                Time  = date,
                Color = "#aabbcc"
            });

            post2.Time.Should().Be(date);
            post2.Color.Should().Be("#aabbcc");

            var post3 = await client.TestGetAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts/{post.Id}");

            post3.Time.Should().Be(date);
            post3.Color.Should().Be("#aabbcc");
        }
コード例 #10
0
        public async Task Post_ModifiedSince_And_IncludeDeleted(TimelineNameGenerator generator)
        {
            using var client = await CreateClientAsUser();

            var posts = new List <HttpTimelinePost>();

            for (int i = 0; i < 4; i++)
            {
                var post = await client.TestPostAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts", CreateTextPostRequest("a"));

                posts.Add(post);
                await Task.Delay(TimeSpan.FromSeconds(1));
            }

            await client.TestDeleteAsync($"timelines/{generator(1)}/posts/{posts[2].Id}");

            {
                posts = await client.TestGetAsync <List <HttpTimelinePost> >($"timelines/{generator(1)}/posts?modifiedSince={posts[1].LastUpdated.ToString("s", CultureInfo.InvariantCulture)}&includeDeleted=true");

                posts.Should().HaveCount(3);
                posts.Select(p => p.Deleted).Should().Equal(false, true, false);
            }
        }
コード例 #11
0
        public async Task GetPost_Should_Ordered(TimelineNameGenerator generator)
        {
            using var client = await CreateClientAsUser();

            async Task <long> CreatePost(DateTime time)
            {
                var body = await client.TestPostAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts", CreateTextPostRequest("aaa", time));

                return(body.Id);
            }

            var now = DateTime.UtcNow;
            var id0 = await CreatePost(now.AddDays(1));

            var id1 = await CreatePost(now.AddDays(-1));

            var id2 = await CreatePost(now);

            {
                var body = await client.TestGetAsync <List <HttpTimelinePost> >($"timelines/{generator(1)}/posts");

                body.Select(p => p.Id).Should().Equal(id1, id2, id0);
            }
        }
コード例 #12
0
        public async Task Color(TimelineNameGenerator generator)
        {
            using var client = await CreateClientAsUser();

            {
                var timeline = await client.TestGetAsync <HttpTimeline>($"timelines/{generator(1)}");

                timeline.Color.Should().Be(null);
            }

            await client.TestPatchAssertInvalidModelAsync($"timelines/{generator(1)}", new HttpTimelinePatchRequest { Color = "!!!" });

            {
                var timeline = await client.TestPatchAsync <HttpTimeline>($"timelines/{generator(1)}", new HttpTimelinePatchRequest { Color = "#112233" });

                timeline.Color.Should().Be("#112233");
            }

            {
                var timeline = await client.TestGetAsync <HttpTimeline>($"timelines/{generator(1)}");

                timeline.Color.Should().Be("#112233");
            }
        }
コード例 #13
0
        public async Task Timeline_LastModified(TimelineNameGenerator generator)
        {
            using var client = await CreateClientAsUser();

            DateTime lastModified;

            {
                var body = await client.GetTimelineAsync(generator(1));

                lastModified = body.LastModified;
            }

            await Task.Delay(1000);

            {
                var body = await client.PatchTimelineAsync(generator(1), new() { Description = "123" });

                lastModified = body.LastModified.Should().BeAfter(lastModified).And.Subject !.Value;
            }

            {
                var body = await client.GetTimelineAsync(generator(1));

                body.LastModified.Should().Be(lastModified);
            }

            await Task.Delay(1000);

            await client.PutTimelineMemberAsync(generator(1), "user2");

            {
                var body = await client.GetTimelineAsync(generator(1));

                body.LastModified.Should().BeAfter(lastModified);
            }
        }
コード例 #14
0
        public async Task GetPostsAndVisibility_Should_Work(TimelineNameGenerator generator)
        {
            { // default visibility is registered
                {
                    using var client = await CreateDefaultClient();

                    await client.TestGetAssertForbiddenAsync($"timelines/{generator(1)}/posts");
                }

                {
                    using var client = await CreateClientAsUser();

                    await client.TestGetAsync($"timelines/{generator(0)}/posts");
                }
            }

            { // change visibility to public
                {
                    using var client = await CreateClientAsUser();

                    await client.PatchTimelineAsync(generator(1), new() { Visibility = TimelineVisibility.Public });
                }

                {
                    using var client = await CreateDefaultClient();

                    await client.TestGetAsync($"timelines/{generator(1)}/posts");
                }
            }

            { // change visibility to private
                {
                    using var client = await CreateClientAsAdministrator();

                    await client.PatchTimelineAsync(generator(1), new() { Visibility = TimelineVisibility.Private });

                    await client.PatchTimelineAsync(generator(0), new() { Visibility = TimelineVisibility.Private });
                }
                {
                    using var client = await CreateDefaultClient();

                    await client.TestGetAssertForbiddenAsync($"timelines/{generator(1)}/posts");
                }
                { // user can't read admin's
                    using var client = await CreateClientAsUser();

                    await client.TestGetAssertForbiddenAsync($"timelines/{generator(0)}/posts");
                }
                { // admin can read user's
                    using var client = await CreateClientAsAdministrator();

                    await client.TestGetAsync($"timelines/{generator(1)}/posts");
                }
                { // add member
                    using var client = await CreateClientAsAdministrator();

                    await client.PutTimelineMemberAsync(generator(0), "user1");
                }
                { // now user can read admin's
                    using var client = await CreateClientAsUser();

                    await client.TestGetAsync($"timelines/{generator(0)}/posts");
                }
            }
        }
コード例 #15
0
        public async Task DeletePostPermission_Should_Work(TimelineNameGenerator generator)
        {
            async Task <long> CreatePost(int userNumber)
            {
                using var client = await CreateClientAs(userNumber);

                var body = await client.TestPostAsync <HttpTimelinePost>($"timelines/{generator(1)}/posts", CreateTextPostRequest("aaa"));

                return(body.Id);
            }

            using (var client = await CreateClientAsUser())
            {
                await client.PutTimelineMemberAsync(generator(1), "user2");

                await client.PutTimelineMemberAsync(generator(1), "user3");
            }

            { // no auth should get 401
                using var client = await CreateDefaultClient();

                await client.TestDeleteAssertUnauthorizedAsync($"timelines/{generator(1)}/posts/12");
            }

            { // self can delete self
                var postId = await CreatePost(1);

                using var client = await CreateClientAsUser();

                await client.TestDeleteAsync($"timelines/{generator(1)}/posts/{postId}");
            }

            { // admin can delete any
                var postId = await CreatePost(1);

                using var client = await CreateClientAsAdministrator();

                await client.TestDeleteAsync($"timelines/{generator(1)}/posts/{postId}");
            }

            { // owner can delete other
                var postId = await CreatePost(2);

                using var client = await CreateClientAsUser();

                await client.TestDeleteAsync($"timelines/{generator(1)}/posts/{postId}");
            }

            { // author can delete self
                var postId = await CreatePost(2);

                using var client = await CreateClientAs(2);

                await client.TestDeleteAsync($"timelines/{generator(1)}/posts/{postId}");
            }

            { // otherwise is forbidden
                var postId = await CreatePost(2);

                using var client = await CreateClientAs(3);

                await client.TestDeleteAssertForbiddenAsync($"timelines/{generator(1)}/posts/{postId}");
            }
        }