• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

Shane32 / PostGrid / 13908682632

17 Mar 2025 07:58PM UTC coverage: 82.329% (+0.9%) from 81.421%
13908682632

push

github

web-flow
Remove delete from check API (#11)

194 of 266 branches covered (72.93%)

Branch coverage included in aggregate %.

4 of 14 new or added lines in 2 files covered. (28.57%)

3 existing lines in 1 file now uncovered.

612 of 713 relevant lines covered (85.83%)

5.13 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

81.85
/src/Project/PostGridConnection.Checks.cs
1
using System.Net.Http.Headers;
2
using System.Web;
3
using Shane32.PostGrid.Checks;
4

5
namespace Shane32.PostGrid;
6

7
public partial class PostGridConnection
8
{
9
    /// <inheritdoc />
10
    public async Task<CheckResponse> ExecuteAsync(CreateRequest request, CancellationToken cancellationToken = default)
11
    {
2✔
12
        if (request == null)
2!
13
            throw new ArgumentNullException(nameof(request));
×
14

15
        if (request.LetterPDF != null && request.LetterHTML != null)
2!
16
            throw new ArgumentException("Only one of LetterPDF or LetterHTML can be provided", nameof(request));
×
17

18
        // Handle the request based on whether we're using LetterPDF or not
19
        if (request.LetterPDF != null) {
3✔
20
            // Use multipart/form-data for LetterPDF
21
            var content = new MultipartFormDataContent {
1✔
22
                // Required fields
1✔
23
                { new StringContent(request.To), "to" },
1✔
24
                { new StringContent(request.From), "from" },
1✔
25
                { new StringContent(request.BankAccount), "bankAccount" },
1✔
26
                { new StringContent(request.Amount.ToString()), "amount" },
1✔
27
                { new StringContent(request.Number.ToString()), "number" }
1✔
28
            };
1✔
29

30
            // Optional fields
31
            if (request.RedirectTo != null)
1!
32
                content.Add(new StringContent(request.RedirectTo), "redirectTo");
×
33

34
            if (request.Memo != null)
1✔
35
                content.Add(new StringContent(request.Memo), "memo");
1✔
36

37
            if (request.Message != null)
1✔
38
                content.Add(new StringContent(request.Message), "message");
1✔
39

40
            if (request.Logo != null)
1✔
41
                content.Add(new StringContent(request.Logo), "logo");
1✔
42

43
            if (request.ExtraService != null)
1!
44
                content.Add(new StringContent(request.ExtraService), "extraService");
×
45

46
            if (request.CurrencyCode != null)
1✔
47
                content.Add(new StringContent(request.CurrencyCode), "currencyCode");
1✔
48

49
            if (request.Express.HasValue)
1!
50
                content.Add(new StringContent(request.Express.Value.ToString().ToLowerInvariant()), "express");
×
51

52
            if (request.SendDate.HasValue)
1!
53
                content.Add(new StringContent(request.SendDate.Value.ToString("o")), "sendDate");
×
54

55
            if (request.MailingClass != null)
1✔
56
                content.Add(new StringContent(request.MailingClass), "mailingClass");
1✔
57

58
            if (request.Description != null)
1✔
59
                content.Add(new StringContent(request.Description), "description");
1✔
60

61
            if (request.Size != null)
1✔
62
                content.Add(new StringContent(request.Size), "size");
1✔
63

64
            // Add the PDF content
65
            var pdfContent = new ByteArrayContent(request.LetterPDF);
1✔
66
            pdfContent.Headers.ContentType = new MediaTypeHeaderValue(request.LetterPDFContentType ?? "application/pdf");
1!
67
            content.Add(pdfContent, "letterPDF");
1✔
68

69
            // Handle merge variables
70
            if (request.MergeVariables != null) {
2✔
71
                foreach (var item in request.MergeVariables) {
9✔
72
                    content.Add(new StringContent(item.Value), $"mergeVariables[{item.Key}]");
2✔
73
                }
2✔
74
            }
1✔
75

76
            // Handle metadata
77
            if (request.Metadata != null) {
2✔
78
                foreach (var item in request.Metadata) {
9✔
79
                    content.Add(new StringContent(item.Value), $"metadata[{item.Key}]");
2✔
80
                }
2✔
81
            }
1✔
82

83
            // Create a request factory function
84
            Func<HttpRequestMessage> requestFactory = () => {
2✔
85
                var newRequest = new HttpRequestMessage(HttpMethod.Post, $"{_options.BaseUrl}/cheques");
1✔
86
                newRequest.Content = content;
1✔
87

1✔
88
                // Add idempotency key header
1✔
89
                newRequest.Headers.Add("Idempotency-Key", request.IdempotencyKey.ToString());
1✔
90

1✔
91
                return newRequest;
1✔
92
            };
2✔
93

94
            // Use the generic SendRequestAsync method with JsonTypeInfo
95
            return await SendRequestAsync(requestFactory, PostGridJsonSerializerContext.Default.CheckResponse, cancellationToken);
1✔
96
        } else {
1✔
97
            // Use form-urlencoded for regular requests or LetterHTML
98
            var formData = new List<KeyValuePair<string, string>> {
1✔
99
                // Required fields
1✔
100
                new KeyValuePair<string, string>("to", request.To),
1✔
101
                new KeyValuePair<string, string>("from", request.From),
1✔
102
                new KeyValuePair<string, string>("bankAccount", request.BankAccount),
1✔
103
                new KeyValuePair<string, string>("amount", request.Amount.ToString()),
1✔
104
                new KeyValuePair<string, string>("number", request.Number.ToString())
1✔
105
            };
1✔
106

107
            // Optional fields
108
            if (request.RedirectTo != null)
1!
109
                formData.Add(new KeyValuePair<string, string>("redirectTo", request.RedirectTo));
×
110

111
            if (request.Memo != null)
1✔
112
                formData.Add(new KeyValuePair<string, string>("memo", request.Memo));
1✔
113

114
            if (request.Message != null)
1✔
115
                formData.Add(new KeyValuePair<string, string>("message", request.Message));
1✔
116

117
            if (request.Logo != null)
1✔
118
                formData.Add(new KeyValuePair<string, string>("logo", request.Logo));
1✔
119

120
            if (request.ExtraService != null)
1!
121
                formData.Add(new KeyValuePair<string, string>("extraService", request.ExtraService));
×
122

123
            if (request.CurrencyCode != null)
1✔
124
                formData.Add(new KeyValuePair<string, string>("currencyCode", request.CurrencyCode));
1✔
125

126
            if (request.Express.HasValue)
1!
127
                formData.Add(new KeyValuePair<string, string>("express", request.Express.Value.ToString().ToLowerInvariant()));
×
128

129
            if (request.SendDate.HasValue)
1!
130
                formData.Add(new KeyValuePair<string, string>("sendDate", request.SendDate.Value.ToString("o")));
×
131

132
            if (request.MailingClass != null)
1✔
133
                formData.Add(new KeyValuePair<string, string>("mailingClass", request.MailingClass));
1✔
134

135
            if (request.Description != null)
1✔
136
                formData.Add(new KeyValuePair<string, string>("description", request.Description));
1✔
137

138
            if (request.Size != null)
1✔
139
                formData.Add(new KeyValuePair<string, string>("size", request.Size));
1✔
140

141
            // Add letterHTML if provided
142
            if (request.LetterHTML != null)
1✔
143
                formData.Add(new KeyValuePair<string, string>("letterHTML", request.LetterHTML));
1✔
144

145
            // Handle merge variables
146
            if (request.MergeVariables != null) {
2✔
147
                foreach (var item in request.MergeVariables) {
9✔
148
                    formData.Add(new KeyValuePair<string, string>($"mergeVariables[{item.Key}]", item.Value));
2✔
149
                }
2✔
150
            }
1✔
151

152
            // Handle metadata
153
            if (request.Metadata != null) {
2✔
154
                foreach (var item in request.Metadata) {
9✔
155
                    formData.Add(new KeyValuePair<string, string>($"metadata[{item.Key}]", item.Value));
2✔
156
                }
2✔
157
            }
1✔
158

159
            // Create a request factory function
160
            Func<HttpRequestMessage> requestFactory = () => {
2✔
161
                var newRequest = new HttpRequestMessage(HttpMethod.Post, $"{_options.BaseUrl}/cheques");
1✔
162
                newRequest.Content = new FormUrlEncodedContent(formData);
1✔
163

1✔
164
                // Add idempotency key header
1✔
165
                newRequest.Headers.Add("Idempotency-Key", request.IdempotencyKey.ToString());
1✔
166

1✔
167
                return newRequest;
1✔
168
            };
2✔
169

170
            // Use the generic SendRequestAsync method with JsonTypeInfo
171
            return await SendRequestAsync(requestFactory, PostGridJsonSerializerContext.Default.CheckResponse, cancellationToken);
1✔
172
        }
173
    }
2✔
174

175
    /// <inheritdoc />
176
    public async Task<CheckResponse> ExecuteAsync(GetRequest request, CancellationToken cancellationToken = default)
177
    {
2✔
178
        if (request == null)
2!
179
            throw new ArgumentNullException(nameof(request));
×
180

181
        if (string.IsNullOrEmpty(request.Id))
2!
182
            throw new ArgumentException("Cheque ID cannot be null or empty", nameof(request));
×
183

184
        // Create a request factory function
185
        Func<HttpRequestMessage> requestFactory =
2✔
186
            () => new HttpRequestMessage(HttpMethod.Get, $"{_options.BaseUrl}/cheques/{request.Id}");
4✔
187

188
        // Use the generic SendRequestAsync method with JsonTypeInfo
189
        return await SendRequestAsync(requestFactory, PostGridJsonSerializerContext.Default.CheckResponse, cancellationToken);
2✔
190
    }
2✔
191

192
    /// <inheritdoc />
193
    public async Task<CheckResponse> ExecuteAsync(CancelRequest request, CancellationToken cancellationToken = default)
194
    {
1✔
195
        if (request == null)
1!
196
            throw new ArgumentNullException(nameof(request));
×
197

198
        if (string.IsNullOrEmpty(request.Id))
1!
199
            throw new ArgumentException("Cheque ID cannot be null or empty", nameof(request));
×
200

201
        // Create a request factory function
202
        Func<HttpRequestMessage> requestFactory;
203
        if (request.Note == null || string.IsNullOrWhiteSpace(request.Note)) {
2!
204
            requestFactory = () => new HttpRequestMessage(HttpMethod.Delete, $"{_options.BaseUrl}/cheques/{request.Id}");
2✔
205
        } else {
1✔
206
            // Convert the request object to form data
NEW
207
            var formData = new List<KeyValuePair<string, string>>();
×
208

209
            // Add the note if provided
NEW
210
            if (request.Note != null)
×
NEW
211
                formData.Add(new KeyValuePair<string, string>("note", request.Note));
×
212

213
            // Create a request factory function
NEW
214
            requestFactory = () => {
×
NEW
215
                var newRequest = new HttpRequestMessage(HttpMethod.Post, $"{_options.BaseUrl}/cheques/{request.Id}/cancellation");
×
NEW
216
                newRequest.Content = new FormUrlEncodedContent(formData);
×
NEW
217
                return newRequest;
×
NEW
218
            };
×
NEW
219
        }
×
220

221
        // Use the generic SendRequestAsync method with JsonTypeInfo
222
        return await SendRequestAsync(requestFactory, PostGridJsonSerializerContext.Default.CheckResponse, cancellationToken);
1✔
223
    }
1✔
224

225
    /// <inheritdoc />
226
    public async Task<ListResponse<CheckResponse>> ExecuteAsync(ListRequest request, CancellationToken cancellationToken = default)
227
    {
1✔
228
        if (request == null)
1!
229
            throw new ArgumentNullException(nameof(request));
×
230

231
        // Build the query string
232
        var queryParams = new List<string>();
1✔
233

234
        if (request.Skip.HasValue)
1✔
235
            queryParams.Add($"skip={request.Skip.Value}");
1✔
236

237
        if (request.Limit.HasValue)
1✔
238
            queryParams.Add($"limit={request.Limit.Value}");
1✔
239

240
        var queryString = queryParams.Count > 0 ? $"?{string.Join("&", queryParams)}" : "";
1!
241

242
        // Create a request factory function
243
        Func<HttpRequestMessage> requestFactory =
1✔
244
            () => new HttpRequestMessage(HttpMethod.Get, $"{_options.BaseUrl}/cheques{queryString}");
2✔
245

246
        // Use the generic SendRequestAsync method with JsonTypeInfo
247
        return await SendRequestAsync(requestFactory, PostGridJsonSerializerContext.Default.ListResponseCheckResponse, cancellationToken);
1✔
248
    }
1✔
249
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc