public async void SearchAsync_InMultiList()
    {
        //Write two comments with two users in them. See if chaining to that field works
        var comment1 = GetNewCommentView(AllAccessContentId);

        comment1.text = $"And it's %{NormalUserId}%";
        var comment2 = GetNewCommentView(AllAccessContentId);

        comment2.text = $"And it's also %{SuperUserId}%";

        var writtenComment1 = await writer.WriteAsync(comment1, NormalUserId);

        var writtenComment2 = await writer.WriteAsync(comment2, SuperUserId);

        //Now search specifically for those two comments, but with users chained to the uidsInText field
        var search = new SearchRequests()
        {
            requests = new List <SearchRequest> {
                new SearchRequest()
                {
                    type   = "message",
                    fields = "*",
                    query  = "id in @ids"
                },
                new SearchRequest()
                {
                    type   = "user",
                    fields = "*",
                    query  = "id in @message.uidsInText"
                }
            },
            values = new Dictionary <string, object> {
                { "ids", new[] { writtenComment1.id, writtenComment2.id } }
            }
        };

        var results = await searcher.Search(search, NormalUserId);

        var comments = searcher.ToStronglyTyped <MessageView>(results.objects["message"]);
        var users    = searcher.ToStronglyTyped <UserView>(results.objects["user"]);

        Assert.Equal(2, comments.Count);
        Assert.Equal(2, users.Count);
        Assert.Contains(writtenComment1.id, comments.Select(x => x.id));
        Assert.Contains(writtenComment2.id, comments.Select(x => x.id));
        Assert.Contains(NormalUserId, users.Select(x => x.id));
        Assert.Contains(SuperUserId, users.Select(x => x.id));
    }
    public static async Task <List <T> > SearchSingleType <T>(this IGenericSearch search, long uid, SearchRequest request, Dictionary <string, object>?values = null)
    {
        //Now go get some random-ass module message
        var searchResult = await search.Search(new SearchRequests()
        {
            values   = values ?? new Dictionary <string, object>(),
            requests = new List <SearchRequest> {
                request
            }
        }, uid);

        return(search.ToStronglyTyped <T>(searchResult.objects.First().Value));
    }
    public async Task GetAllStatusesAsync_0Exists()
    {
        await userStatuses.AddStatusAsync(SuperUserId, 0, "here!", 1);

        var result = await userStatuses.GetUserStatusesAsync(searcher, NormalUserId, EasyFields);

        Assert.Contains(0, result.statuses.Keys);
        Assert.Contains("user", result.objects.Keys);
        Assert.Contains("content", result.objects.Keys);
        Assert.Empty(result.objects["content"]);
        var users = searcher.ToStronglyTyped <UserView>(result.objects["user"]);

        Assert.Single(users);
        Assert.Equal(SuperUserId, users.First().id);
    }
    private async Task <List <ActivityView> > GetActivityForContentAsync(long id)
    {
        //Go get all activity for content 1
        var search = new SearchRequests();

        search.values.Add("id", id);
        search.requests.Add(new SearchRequest()
        {
            type   = "activity",
            fields = "*",
            query  = "contentId = @id"
        });
        var baseResult = await searcher.SearchUnrestricted(search);

        var activities = searcher.ToStronglyTyped <ActivityView>(baseResult.objects["activity"]);

        return(activities);
    }