mirror of https://github.com/Squidex/squidex.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
282 lines
8.5 KiB
282 lines
8.5 KiB
// ==========================================================================
|
|
// Squidex Headless CMS
|
|
// ==========================================================================
|
|
// Copyright (c) Squidex UG (haftungsbeschraenkt)
|
|
// All rights reserved. Licensed under the MIT license.
|
|
// ==========================================================================
|
|
|
|
using Newtonsoft.Json.Linq;
|
|
using Squidex.ClientLibrary;
|
|
using Squidex.ClientLibrary.Utils;
|
|
using System.Net.Http.Json;
|
|
using TestSuite.Model;
|
|
|
|
#pragma warning disable SA1300 // Element should begin with upper-case letter
|
|
#pragma warning disable SA1507 // Code should not contain multiple blank lines in a row
|
|
|
|
namespace TestSuite.ApiTests;
|
|
|
|
public sealed class GraphQLTests : IClassFixture<GraphQLFixture>
|
|
{
|
|
public GraphQLFixture _ { get; }
|
|
|
|
public GraphQLTests(GraphQLFixture fixture)
|
|
{
|
|
_ = fixture;
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Should_query_json()
|
|
{
|
|
// STEP 1: Create a content with JSON.
|
|
var content_0 = await _.Contents.CreateAsync(new TestEntityData
|
|
{
|
|
Json = JToken.FromObject(new
|
|
{
|
|
value = 1,
|
|
obj = new
|
|
{
|
|
value = 2
|
|
}
|
|
})
|
|
}, ContentCreateOptions.AsPublish);
|
|
|
|
|
|
// STEP 2: Query this content.
|
|
var query = new
|
|
{
|
|
query = @"
|
|
{
|
|
findMyWritesContent(id: ""<ID>"") {
|
|
flatData {
|
|
json
|
|
}
|
|
}
|
|
}".Replace("<ID>", content_0.Id, StringComparison.Ordinal)
|
|
};
|
|
|
|
var result = await _.SharedContents.GraphQlAsync<JToken>(query);
|
|
|
|
Assert.Equal(1, result["findMyWritesContent"]["flatData"]["json"]["value"].Value<int>());
|
|
Assert.Equal(2, result["findMyWritesContent"]["flatData"]["json"]["obj"]["value"].Value<int>());
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Should_query_graphql_reference_selectors()
|
|
{
|
|
var query = new
|
|
{
|
|
query = @"
|
|
{
|
|
countries: queryCountriesContents {
|
|
data: flatData {
|
|
name,
|
|
states {
|
|
data: flatData {
|
|
name
|
|
cities {
|
|
data: flatData {
|
|
name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}"
|
|
};
|
|
|
|
var result = await _.SharedContents.GraphQlAsync<JToken>(query);
|
|
|
|
var cityNames =
|
|
result["countries"].ToObject<List<Country>>()[0].Data.States
|
|
.SelectMany(x => x.Data.Cities)
|
|
.Select(x => x.Data.Name)
|
|
.Order();
|
|
|
|
Assert.Equal(new[] { "Leipzig", "Stuttgart" }, cityNames);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Should_query_graphql_reference_operator()
|
|
{
|
|
var query = new
|
|
{
|
|
query = @"
|
|
{
|
|
countries: queryCountriesContents {
|
|
data: flatData {
|
|
name,
|
|
states {
|
|
data: flatData {
|
|
name
|
|
},
|
|
cities: referencesCitiesContents {
|
|
data: flatData {
|
|
name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}"
|
|
};
|
|
|
|
var result = await _.SharedContents.GraphQlAsync<JToken>(query);
|
|
|
|
var cityNames =
|
|
result["countries"]
|
|
.SelectMany(x => x["data"]["states"])
|
|
.SelectMany(x => x["cities"])
|
|
.Select(x => x["data"]["name"].Value<string>())
|
|
.Order();
|
|
|
|
Assert.Equal(new[] { "Leipzig", "Stuttgart" }, cityNames);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Should_query_graphql_reference_operator_with_filter()
|
|
{
|
|
var query = new
|
|
{
|
|
query = @"
|
|
{
|
|
countries: queryCountriesContents {
|
|
data: flatData {
|
|
name,
|
|
states {
|
|
data: flatData {
|
|
name
|
|
},
|
|
cities: referencesCitiesContents(filter: ""data/name/iv eq 'Leipzig'"") {
|
|
data: flatData {
|
|
name
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}"
|
|
};
|
|
|
|
var result = await _.SharedContents.GraphQlAsync<JToken>(query);
|
|
|
|
var cityNames =
|
|
result["countries"]
|
|
.SelectMany(x => x["data"]["states"])
|
|
.SelectMany(x => x["cities"])
|
|
.Select(x => x["data"]["name"].Value<string>())
|
|
.Order();
|
|
|
|
Assert.Equal(new[] { "Leipzig" }, cityNames);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Should_query_graphql_referencing_operator()
|
|
{
|
|
var query = new
|
|
{
|
|
query = @"
|
|
{
|
|
cities: queryCitiesContents {
|
|
states: referencingStatesContents {
|
|
data: flatData {
|
|
name
|
|
}
|
|
}
|
|
}
|
|
}"
|
|
};
|
|
|
|
var result = await _.SharedContents.GraphQlAsync<JToken>(query);
|
|
|
|
var stateNames =
|
|
result["cities"]
|
|
.SelectMany(x => x["states"])
|
|
.Select(x => x["data"]["name"].Value<string>())
|
|
.Order();
|
|
|
|
Assert.Equal(new[] { "Baden Württemberg", "Sachsen" }, stateNames);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Should_query_graphql_referencing_operator_with_filter()
|
|
{
|
|
var query = new
|
|
{
|
|
query = @"
|
|
{
|
|
cities: queryCitiesContents {
|
|
states: referencingStatesContents(filter: ""data/name/iv eq 'Sachsen'"") {
|
|
data: flatData {
|
|
name
|
|
}
|
|
}
|
|
}
|
|
}"
|
|
};
|
|
|
|
var result = await _.SharedContents.GraphQlAsync<JToken>(query);
|
|
|
|
var stateNames =
|
|
result["cities"]
|
|
.SelectMany(x => x["states"])
|
|
.Select(x => x["data"]["name"].Value<string>())
|
|
.Order();
|
|
|
|
Assert.Equal(new[] { "Sachsen" }, stateNames);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Should_query_correct_content_type_for_graphql()
|
|
{
|
|
var query = new
|
|
{
|
|
query = @"
|
|
{
|
|
queryCitiesContents {
|
|
id
|
|
}
|
|
}"
|
|
};
|
|
|
|
var httpClient = _.ClientManager.CreateHttpClient();
|
|
|
|
// Create the request manually to check the content type.
|
|
var response = await httpClient.PostAsync(_.ClientManager.GenerateUrl($"api/content/{_.AppName}/graphql/batch"), query.ToContent());
|
|
|
|
Assert.Equal("application/json", response.Content.Headers.ContentType.MediaType);
|
|
}
|
|
|
|
[Fact]
|
|
public async Task Should_return_correct_vary_headers()
|
|
{
|
|
var query = new
|
|
{
|
|
query = @"
|
|
{
|
|
queryCitiesContents {
|
|
id
|
|
}
|
|
}"
|
|
};
|
|
|
|
var httpClient = _.ClientManager.CreateHttpClient();
|
|
|
|
// Create the request manually to check the headers.
|
|
var response = await httpClient.PostAsJsonAsync($"api/content/{_.AppName}/graphql", query);
|
|
|
|
Assert.Equal(new string[]
|
|
{
|
|
"Auth-State",
|
|
"X-Flatten",
|
|
"X-Languages",
|
|
"X-NoCleanup",
|
|
"X-NoEnrichment",
|
|
"X-NoResolveLanguages",
|
|
"X-Resolve-Urls",
|
|
"X-ResolveFlow",
|
|
"X-Unpublished"
|
|
}, response.Headers.Vary.Order().ToArray());
|
|
}
|
|
}
|
|
|