Skip to content

Commit

Permalink
fix(dotnet): allow case with empty read body
Browse files Browse the repository at this point in the history
  • Loading branch information
adriantam committed Nov 15, 2023
1 parent 4cc5ac6 commit d756a33
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 5 deletions.
11 changes: 8 additions & 3 deletions config/clients/dotnet/template/Client/Client.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -138,11 +138,16 @@ public class {{appShortName}}Client : IDisposable {
* Read - Read tuples previously written to the store (does not evaluate)
*/
public async Task<ReadResponse> Read(ClientReadRequest body, IClientReadOptions? options = default,
CancellationToken cancellationToken = default) =>
await api.Read(
CancellationToken cancellationToken = default) {
TupleKey tupleKey = null;
if (body != null && (body.User != null || body.Relation != null || body.Object != null)) {
tupleKey = body;
}
return await api.Read(
new ReadRequest {
TupleKey = body, PageSize = options?.PageSize, ContinuationToken = options?.ContinuationToken
TupleKey = tupleKey, PageSize = options?.PageSize, ContinuationToken = options?.ContinuationToken
}, cancellationToken);
}

/**
* Write - Create or delete relationship tuples
Expand Down
53 changes: 51 additions & 2 deletions config/clients/dotnet/template/OpenFgaClientTests.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -593,7 +593,8 @@ public class {{appShortName}}ClientTests {
"SendAsync",
ItExpr.Is<HttpRequestMessage>(req =>
req.RequestUri == new Uri($"{_config.BasePath}/stores/{_config.StoreId}/read") &&
req.Method == HttpMethod.Post),
req.Method == HttpMethod.Post &&
req.Content.ReadAsStringAsync().Result.Contains("tuple")),
ItExpr.IsAny<CancellationToken>()
)
.ReturnsAsync(new HttpResponseMessage() {
Expand All @@ -616,7 +617,55 @@ public class {{appShortName}}ClientTests {
Times.Exactly(1),
ItExpr.Is<HttpRequestMessage>(req =>
req.RequestUri == new Uri($"{_config.BasePath}/stores/{_config.StoreId}/read") &&
req.Method == HttpMethod.Post),
req.Method == HttpMethod.Post &&
req.Content.ReadAsStringAsync().Result.Contains("tuple")),
ItExpr.IsAny<CancellationToken>()
);

Assert.IsType<ReadResponse>(response);
Assert.Single(response.Tuples);
Assert.Equal(response, expectedResponse);
}

/// <summary>
/// Test Read with Empty Body
/// </summary>
[Fact]
public async Task ReadEmptyTest() {
var mockHandler = new Mock<HttpMessageHandler>(MockBehavior.Strict);
var expectedResponse = new ReadResponse() {
Tuples = new List<Model.Tuple>() {
new(new TupleKey("document:roadmap", "viewer", "user:81684243-9356-4421-8fbf-a4f8d36aa31b"),
DateTime.Now)
}
};
mockHandler.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.Is<HttpRequestMessage>(req =>
req.RequestUri == new Uri($"{_config.BasePath}/stores/{_config.StoreId}/read") &&
req.Method == HttpMethod.Post &&
!req.Content.ReadAsStringAsync().Result.Contains("tuple")),
ItExpr.IsAny<CancellationToken>()
)
.ReturnsAsync(new HttpResponseMessage() {
StatusCode = HttpStatusCode.OK, Content = Utils.CreateJsonStringContent(expectedResponse),
});

var httpClient = new HttpClient(mockHandler.Object);
var fgaClient = new {{appShortName}}Client(_config, httpClient);

var body = new ClientReadRequest() { };
var options = new ClientReadOptions { };
var response = await fgaClient.Read(body, options);

mockHandler.Protected().Verify(
"SendAsync",
Times.Exactly(1),
ItExpr.Is<HttpRequestMessage>(req =>
req.RequestUri == new Uri($"{_config.BasePath}/stores/{_config.StoreId}/read") &&
req.Method == HttpMethod.Post &&
!req.Content.ReadAsStringAsync().Result.Contains("tuple")),
ItExpr.IsAny<CancellationToken>()
);

Expand Down
44 changes: 44 additions & 0 deletions config/clients/dotnet/template/api_test.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -1359,6 +1359,50 @@ namespace {{testPackageName}}.Api {
Assert.Equal(response, expectedResponse);
}

/// <summary>
/// Test Read With Empty Parameters
/// </summary>
[Fact]
public async Task ReadEmptyTest() {
var mockHandler = new Mock<HttpMessageHandler>(MockBehavior.Strict);
var expectedResponse = new ReadResponse() {
Tuples = new List<{{packageName}}.Model.Tuple>() {
new(new TupleKey("document:roadmap", "viewer", "user:81684243-9356-4421-8fbf-a4f8d36aa31b"), DateTime.Now)
}
};
mockHandler.Protected()
.Setup<Task<HttpResponseMessage>>(
"SendAsync",
ItExpr.Is<HttpRequestMessage>(req =>
req.RequestUri == new Uri($"{_config.BasePath}/stores/{_config.StoreId}/read") &&
req.Method == HttpMethod.Post),
ItExpr.IsAny<CancellationToken>()
)
.ReturnsAsync(new HttpResponseMessage() {
StatusCode = HttpStatusCode.OK,
Content = Utils.CreateJsonStringContent(expectedResponse),
});

var httpClient = new HttpClient(mockHandler.Object);
var {{appCamelCaseName}}Api = new {{classname}}(_config, httpClient);

var body = new ReadRequest{};
var response = await {{appCamelCaseName}}Api.Read(body);

mockHandler.Protected().Verify(
"SendAsync",
Times.Exactly(1),
ItExpr.Is<HttpRequestMessage>(req =>
req.RequestUri == new Uri($"{_config.BasePath}/stores/{_config.StoreId}/read") &&
req.Method == HttpMethod.Post),
ItExpr.IsAny<CancellationToken>()
);

Assert.IsType<ReadResponse>(response);
Assert.Single(response.Tuples);
Assert.Equal(response, expectedResponse);
}

/// <summary>
/// Test ReadChanges
/// </summary>
Expand Down
1 change: 1 addition & 0 deletions config/clients/dotnet/template/modelGeneric.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@
{{^conditionalSerialization}}
[DataMember(Name = "{{baseName}}"{{#required}}, IsRequired = true{{/required}}, EmitDefaultValue = {{#vendorExtensions.x-emit-default-value}}true{{/vendorExtensions.x-emit-default-value}}{{^vendorExtensions.x-emit-default-value}}{{#isBoolean}}true{{/isBoolean}}{{^isBoolean}}{{#isNullable}}true{{/isNullable}}{{^isNullable}}false{{/isNullable}}{{/isBoolean}}{{/vendorExtensions.x-emit-default-value}})]
[JsonPropertyName("{{baseName}}")]
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)]
{{#isDate}}
[JsonConverter(typeof(OpenAPIDateConverter))]
{{/isDate}}
Expand Down

0 comments on commit d756a33

Please sign in to comment.