From 0b8030b059f76bec61da163b269f8d8b39a59c59 Mon Sep 17 00:00:00 2001 From: Nate Bross Date: Wed, 8 Nov 2023 21:48:05 +0000 Subject: [PATCH 1/2] fix: clean up overload apis to avoid ambiguity --- src/FMData.Rest/FileMakerRestClient.cs | 1 - src/FMData.Xml/FileMakerXmlClient.cs | 1 - src/FMData/FileMakerApiClientBase.cs | 13 +- src/FMData/IFileMakerApiClient.cs | 9 +- .../FMData.Rest.Tests/Find.SendAsync.Tests.cs | 158 +++++++++++++++++- 5 files changed, 167 insertions(+), 15 deletions(-) diff --git a/src/FMData.Rest/FileMakerRestClient.cs b/src/FMData.Rest/FileMakerRestClient.cs index a71ee870..762d03a2 100644 --- a/src/FMData.Rest/FileMakerRestClient.cs +++ b/src/FMData.Rest/FileMakerRestClient.cs @@ -545,7 +545,6 @@ public override async Task SendAsync(IDeleteRequest req) /// public override async Task<(IEnumerable, DataInfoModel)> SendAsync( IFindRequest req, - bool includeDataInfo, Func fmId = null, Func modId = null) { diff --git a/src/FMData.Xml/FileMakerXmlClient.cs b/src/FMData.Xml/FileMakerXmlClient.cs index 0e4afd3d..4713d2a7 100644 --- a/src/FMData.Xml/FileMakerXmlClient.cs +++ b/src/FMData.Xml/FileMakerXmlClient.cs @@ -183,7 +183,6 @@ public override async Task SendAsync(IEditRequest req) /// public override async Task<(IEnumerable, DataInfoModel)> SendAsync( IFindRequest req, - bool includeDataInfo, Func fmId = null, Func modId = null) { diff --git a/src/FMData/FileMakerApiClientBase.cs b/src/FMData/FileMakerApiClientBase.cs index 50518891..83e81efe 100644 --- a/src/FMData/FileMakerApiClientBase.cs +++ b/src/FMData/FileMakerApiClientBase.cs @@ -466,7 +466,7 @@ public Task> FindAsync( .SetOffset(skip); req.Script = script; req.ScriptParameter = scriptParameter; - return SendAsync(req, fmIdFunc, fmModIdFunc); + return SendAsync(req, fmIdFunc, fmModIdFunc); } /// @@ -642,7 +642,7 @@ public virtual Task> SendAsync( /// public virtual Task> SendAsync( IFindRequest req, - Func fmId) where T : class, new() => SendAsync(req, fmId, null); + Func fmId) where T : class, new() => SendAsync(req, fmId, null); /// /// Send a Find Record request to the FileMaker API. @@ -652,7 +652,7 @@ public virtual async Task> SendAsync( Func fmId, Func modId) where T : class, new() { - var (data, _) = await SendAsync(req, false, fmId, modId).ConfigureAwait(false); + var (data, _) = await SendAsync(req, fmId, modId).ConfigureAwait(false); return data; } @@ -663,15 +663,14 @@ public virtual async Task> SendAsync( Func fmId = null, Func modId = null) where T : class, new() { - return await SendAsync(req, includeDataInfo, fmId, modId).ConfigureAwait(false); + return await SendAsync(req, fmId, modId).ConfigureAwait(false); } /// public abstract Task<(IEnumerable, DataInfoModel)> SendAsync( IFindRequest req, - bool includeDataInfo, - Func fmId = null, - Func modId = null) where TResponse : class, new(); + Func fmId, + Func modId) where TResponse : class, new(); #endregion diff --git a/src/FMData/IFileMakerApiClient.cs b/src/FMData/IFileMakerApiClient.cs index f94a8e5e..635f1ac5 100644 --- a/src/FMData/IFileMakerApiClient.cs +++ b/src/FMData/IFileMakerApiClient.cs @@ -491,21 +491,20 @@ Task> SendAsync( Func modId = null) where T : class, new(); /// - /// Find a record or records matching the request and include a data info model as well as the response. + /// Find a record or records matching the request and include a data info model as well as the response. /// /// The Response type. /// The Request type. /// The find request parameters. /// Function to assign the FileMaker RecordId to each instance of {T}. /// Function to assign the FileMaker ModId to each instance of {T}. - /// Indicates whether the data information portion should be parsed. /// An matching the request parameters. /// The data info portion of the response is always returned when correctly parsed. + /// This method allows using separate Request and Response generics, which is useful when querying with dynamic input, but static output. Task<(IEnumerable, DataInfoModel)> SendAsync( IFindRequest req, - bool includeDataInfo, - Func fmId = null, - Func modId = null) where TResponse : class, new(); + Func fmId, + Func modId) where TResponse : class, new(); /// /// Edit record. diff --git a/tests/FMData.Rest.Tests/Find.SendAsync.Tests.cs b/tests/FMData.Rest.Tests/Find.SendAsync.Tests.cs index 07ac33a2..59a1ada4 100644 --- a/tests/FMData.Rest.Tests/Find.SendAsync.Tests.cs +++ b/tests/FMData.Rest.Tests/Find.SendAsync.Tests.cs @@ -227,6 +227,66 @@ public async Task SendAsync_Find_Should_Have_DataInfo() Assert.Equal(123, info.FoundCount); } + [Fact] + public async Task SendAsync_Find_Should_Have_DataInfo_FirstOverload() + { + // arrange + var mockHttp = new MockHttpMessageHandler(); + Func FMRecordIdMapper = (o, id) => o.FileMakerRecordId = id; + + var layout = "the-layout"; + + mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/sessions") + .Respond("application/json", DataApiResponses.SuccessfulAuthentication()); + + mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/layouts/{layout}/_find") + .Respond(HttpStatusCode.OK, "application/json", DataApiResponses.SuccessfulFindWithDataInfo()); + + var fdc = new FileMakerRestClient(mockHttp.ToHttpClient(), FindTestsHelpers.Connection); + + var toFind = new User() { Id = 35 }; + var req = new FindRequest() { Layout = layout }; + req.AddQuery(toFind, false); + + // act + var (data, info) = await fdc.SendAsync(req, true, FMRecordIdMapper, null); + + // assert + Assert.NotEmpty(data); + Assert.Equal(1, info.ReturnedCount); + Assert.Equal(123, info.FoundCount); + } + + [Fact] + public async Task SendAsync_Find_Should_Have_DataInfo_SecondOverload() + { + // arrange + var mockHttp = new MockHttpMessageHandler(); + Func ModMap = (o, id) => o.FileMakerModId = id; + + var layout = "the-layout"; + + mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/sessions") + .Respond("application/json", DataApiResponses.SuccessfulAuthentication()); + + mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/layouts/{layout}/_find") + .Respond(HttpStatusCode.OK, "application/json", DataApiResponses.SuccessfulFindWithDataInfo()); + + var fdc = new FileMakerRestClient(mockHttp.ToHttpClient(), FindTestsHelpers.Connection); + + var toFind = new User() { Id = 35 }; + var req = new FindRequest() { Layout = layout }; + req.AddQuery(toFind, false); + + // act + var (data, info) = await fdc.SendAsync(req, true, null, ModMap); + + // assert + Assert.NotEmpty(data); + Assert.Equal(1, info.ReturnedCount); + Assert.Equal(123, info.FoundCount); + } + [Fact] public async Task SendAsync_Using_Dictionary_Find_Should_Have_DataInfo() { @@ -248,7 +308,103 @@ public async Task SendAsync_Using_Dictionary_Find_Should_Have_DataInfo() req.AddQuery(toFind, false); // act - var (data, info) = await fdc.SendAsync>(req, true); + var (data, info) = await fdc.SendAsync>(req, null, null); + + // assert + Assert.NotEmpty(data); + Assert.Equal(1, info.ReturnedCount); + Assert.Equal(123, info.FoundCount); + } + + [Fact] + public async Task SendAsync_Using_Dictionary_Find_Should_Have_DataInfo_OverloadOne() + { + // arrange + var mockHttp = new MockHttpMessageHandler(); + Func IdMap = (o, id) => o.FileMakerRecordId = id; + Func ModMap = (o, id) => o.FileMakerModId = id; + + + var layout = "the-layout"; + + mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/sessions") + .Respond("application/json", DataApiResponses.SuccessfulAuthentication()); + + mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/layouts/{layout}/_find") + .Respond(HttpStatusCode.OK, "application/json", DataApiResponses.SuccessfulFindWithDataInfo()); + + var fdc = new FileMakerRestClient(mockHttp.ToHttpClient(), FindTestsHelpers.Connection); + + var toFind = new Dictionary() { { "Id", "35" } }; + var req = new FindRequest>() { Layout = layout }; + req.AddQuery(toFind, false); + + // act + var (data, info) = await fdc.SendAsync>(req, IdMap, null); + + // assert + Assert.NotEmpty(data); + Assert.Equal(1, info.ReturnedCount); + Assert.Equal(123, info.FoundCount); + } + + [Fact] + public async Task SendAsync_Using_Dictionary_Find_Should_Have_DataInfo_OverloadTwo() + { + // arrange + var mockHttp = new MockHttpMessageHandler(); + Func IdMap = (o, id) => o.FileMakerRecordId = id; + Func ModMap = (o, id) => o.FileMakerModId = id; + + + var layout = "the-layout"; + + mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/sessions") + .Respond("application/json", DataApiResponses.SuccessfulAuthentication()); + + mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/layouts/{layout}/_find") + .Respond(HttpStatusCode.OK, "application/json", DataApiResponses.SuccessfulFindWithDataInfo()); + + var fdc = new FileMakerRestClient(mockHttp.ToHttpClient(), FindTestsHelpers.Connection); + + var toFind = new Dictionary() { { "Id", "35" } }; + var req = new FindRequest>() { Layout = layout }; + req.AddQuery(toFind, false); + + // act + var (data, info) = await fdc.SendAsync>(req, null, ModMap); + + // assert + Assert.NotEmpty(data); + Assert.Equal(1, info.ReturnedCount); + Assert.Equal(123, info.FoundCount); + } + + [Fact] + public async Task SendAsync_Using_Dictionary_Find_Should_Have_DataInfo_OverloadThree() + { + // arrange + var mockHttp = new MockHttpMessageHandler(); + Func IdMap = (o, id) => o.FileMakerRecordId = id; + Func ModMap = (o, id) => o.FileMakerModId = id; + + + var layout = "the-layout"; + + mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/sessions") + .Respond("application/json", DataApiResponses.SuccessfulAuthentication()); + + mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/layouts/{layout}/_find") + .Respond(HttpStatusCode.OK, "application/json", DataApiResponses.SuccessfulFindWithDataInfo()); + + var fdc = new FileMakerRestClient(mockHttp.ToHttpClient(), FindTestsHelpers.Connection); + + var toFind = new Dictionary() { { "Id", "35" } }; + var req = new FindRequest>() { Layout = layout }; + req.AddQuery(toFind, false); + + // act + var (data, info) = await fdc.SendAsync>(req, IdMap, ModMap); // assert Assert.NotEmpty(data); From 360b744f7ef866834662f09bbde531e355ad0cb0 Mon Sep 17 00:00:00 2001 From: Nate Bross Date: Wed, 8 Nov 2023 21:49:31 +0000 Subject: [PATCH 2/2] fix: codefactor extra lines --- tests/FMData.Rest.Tests/Find.SendAsync.Tests.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/FMData.Rest.Tests/Find.SendAsync.Tests.cs b/tests/FMData.Rest.Tests/Find.SendAsync.Tests.cs index 59a1ada4..a1cf5757 100644 --- a/tests/FMData.Rest.Tests/Find.SendAsync.Tests.cs +++ b/tests/FMData.Rest.Tests/Find.SendAsync.Tests.cs @@ -324,7 +324,6 @@ public async Task SendAsync_Using_Dictionary_Find_Should_Have_DataInfo_OverloadO Func IdMap = (o, id) => o.FileMakerRecordId = id; Func ModMap = (o, id) => o.FileMakerModId = id; - var layout = "the-layout"; mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/sessions") @@ -356,7 +355,6 @@ public async Task SendAsync_Using_Dictionary_Find_Should_Have_DataInfo_OverloadT Func IdMap = (o, id) => o.FileMakerRecordId = id; Func ModMap = (o, id) => o.FileMakerModId = id; - var layout = "the-layout"; mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/sessions") @@ -388,7 +386,6 @@ public async Task SendAsync_Using_Dictionary_Find_Should_Have_DataInfo_OverloadT Func IdMap = (o, id) => o.FileMakerRecordId = id; Func ModMap = (o, id) => o.FileMakerModId = id; - var layout = "the-layout"; mockHttp.When(HttpMethod.Post, $"{FindTestsHelpers.Server}/fmi/data/v1/databases/{FindTestsHelpers.File}/sessions")