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

rwjdk / TrelloDotNet / 22641078342

03 Mar 2026 08:22PM UTC coverage: 80.414% (-0.09%) from 80.5%
22641078342

push

github

rwjdk
v2.3.0

2632 of 3566 branches covered (73.81%)

Branch coverage included in aggregate %.

155 of 170 new or added lines in 21 files covered. (91.18%)

106 existing lines in 5 files now uncovered.

4676 of 5522 relevant lines covered (84.68%)

149.74 hits per line

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

97.16
/src/TrelloDotNet/Model/Options/GetCardOptions/GetCardOptions.cs
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4

5
namespace TrelloDotNet.Model.Options.GetCardOptions
6
{
7
    /// <summary>
8
    /// Options on how and what should be included on the cards (Example only a few fields to increase performance or more nested data to avoid more API calls)
9
    /// </summary>
10
    public class GetCardOptions
11
    {
12
        /// <summary>
13
        /// All or a comma-separated list of fields. Defaults: badges, checkItemStates, closed, dateLastActivity, desc, descData, due, start, email, idBoard, idChecklists, idLabels, idList, idMembers, idShort, idAttachmentCover, manualCoverAttachment, labels, name, pos, shortUrl, url
14
        /// </summary>
15
        public CardFields CardFields { get; set; }
1,690✔
16

17
        /// <summary>
18
        /// Provide one or more Card-action types there (TrelloDotNet.Model.Webhook.WebhookActionTypes) to get them included with the Card
19
        /// </summary>
20
        public ActionTypesToInclude ActionsTypes { get; set; }
464✔
21

22
        /// <summary>
23
        /// Controls if cards should include their attachments (Default: False)
24
        /// </summary>
25
        public GetCardOptionsIncludeAttachments IncludeAttachments { get; set; } = GetCardOptionsIncludeAttachments.False;
1,178✔
26

27
        /// <summary>
28
        /// What attachments-fields to include if IncludeAttachments are set to 'True' or 'Cover'
29
        /// </summary>
30
        public AttachmentFields AttachmentFields { get; set; }
462✔
31

32
        /// <summary>
33
        /// Whether to return member objects for members on the card (Default: False)
34
        /// </summary>
35
        public bool IncludeMembers { get; set; }
483✔
36

37
        /// <summary>
38
        /// Whether to return checklist objects for members on the card (Default: False)
39
        /// </summary>
40
        public bool IncludeChecklists { get; set; }
589✔
41

42
        /// <summary>
43
        /// What member-fields to include if IncludeMembers are set to True
44
        /// </summary>
45
        public MemberFields MemberFields { get; set; }
461✔
46

47
        /// <summary>
48
        /// What member-fields to include if IncludeMemberVotes are set to True
49
        /// </summary>
50
        public MemberFields MembersVotedFields { get; set; }
461✔
51

52
        /// <summary>
53
        /// What checklist-fields to include if IncludeChecklists are set to True
54
        /// </summary>
55
        public ChecklistFields ChecklistFields { get; set; }
462✔
56

57
        /// <summary>
58
        /// What stickers-fields to include if IncludeStickers are set to True
59
        /// </summary>
60
        public StickerFields StickerFields { get; set; }
461✔
61

62
        /// <summary>
63
        /// Whether to return Board object the card is on (Default: False)
64
        /// </summary>
65
        public bool IncludeBoard { get; set; }
968✔
66

67
        /// <summary>
68
        /// Whether to return List object the card is in (Default: False)
69
        /// </summary>
70
        public bool IncludeList { get; set; }
991✔
71

72
        /// <summary>
73
        /// Whether to return Plugin object of the card (Default: False)
74
        /// </summary>
75
        public bool IncludePluginData { get; set; }
459✔
76

77
        /// <summary>
78
        /// Whether to return Sticker objects of the card (Default: False)
79
        /// </summary>
80
        public bool IncludeStickers { get; set; }
459✔
81

82
        /// <summary>
83
        /// Whether to return MemberVotes objects of the card (Default: False)
84
        /// </summary>
85
        public bool IncludeMemberVotes { get; set; }
462✔
86

87
        /// <summary>
88
        /// Whether to return CustomFieldsItem objects of the card (Default: False)
89
        /// </summary>
90
        public bool IncludeCustomFieldItems { get; set; }
625✔
91

92
        /// <summary>
93
        /// What board-fields to include if IncludeBoard are set to True
94
        /// </summary>
95
        public BoardFields BoardFields { get; set; }
461✔
96

97
        /// <summary>
98
        /// Limit how many object are returned (Default All) [Only used by methods where multiple objects are returned
99
        /// </summary>
100
        public int? Limit { get; set; }
265✔
101

102
        /// <summary>
103
        /// Pagination (Only return cards before this Card Id was created)
104
        /// </summary>
105
        public string Before { get; set; } = null;
262✔
106

107
        /// <summary>
108
        /// Pagination (Only return cards since this Card Id was created)
109
        /// </summary>
110
        public string Since { get; set; } = null;
262✔
111

112
        /// <summary>
113
        /// What Kind of Cards should be included (Active, Closed/Archived or All) [Only used on GetCardsForBoard(...)]
114
        /// </summary>
115
        public CardsFilter? Filter { get; set; }
258✔
116

117
        /// <summary>
118
        /// Order the cards returned by this (only used when multiple cards are returned) [Note: This ordering happens In-memory as the REST API can't do ordering]
119
        /// </summary>
120
        public CardsOrderBy? OrderBy { get; set; }
517✔
121

122
        /// <summary>
123
        /// Set how many cards the API should get per request to the API (Use this if you get an 'API_TOO_MANY_CARDS_REQUESTED' error)
124
        /// Behind the scenes this use the 'Before' parameter + 'sort = -id' parameter to do multiple calls until the amount of cards you set as limit is retrieved (or all in no limit)
125
        /// </summary>
126
        public int? PageSize { get; set; }
254✔
127

128
        /// <summary>
129
        /// Add conditions of which of the data from the call is actually returned (Note: this is in-memory filtering as Trello's API is not able to filter on server-side)
130
        /// </summary>
131
        public List<CardsFilterCondition> FilterConditions { get; set; } = new List<CardsFilterCondition>();
1,713✔
132

133
        /// <summary>
134
        /// Send these Additional Parameters not supported out-of-the-box (should you need to do something to the query-parameters not yet supported by this API)
135
        /// </summary>
136
        public List<QueryParameter> AdditionalParameters { get; set; } = new List<QueryParameter>();
918✔
137

138
        internal QueryParameter[] GetParameters(bool multipleObjects)
139
        {
140
            List<QueryParameter> parameters = new List<QueryParameter>();
457✔
141
            if (CardFields != null)
457✔
142
            {
143
                parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Fields, string.Join(",", CardFields.Fields)));
317✔
144
            }
145

146
            if (ActionsTypes != null)
457✔
147
            {
148
                parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Actions, string.Join(",", ActionsTypes.ActionTypes)));
3✔
149
            }
150

151
            if (AttachmentFields != null)
457✔
152
            {
153
                parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.AttachmentFields, string.Join(",", AttachmentFields.Fields)));
2✔
154
            }
155

156
            if (MemberFields != null)
457✔
157
            {
158
                parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.MemberFields, string.Join(",", MemberFields.Fields)));
2✔
159
            }
160

161
            if (BoardFields != null)
457✔
162
            {
163
                parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.BoardFields, string.Join(",", BoardFields.Fields)));
2✔
164
            }
165

166
            if (ChecklistFields != null)
457✔
167
            {
168
                parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.ChecklistFields, string.Join(",", ChecklistFields.Fields)));
2✔
169
            }
170

171
            if (StickerFields != null)
457✔
172
            {
173
                parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.StickerFields, string.Join(",", StickerFields.Fields)));
2✔
174
            }
175

176
            if (MembersVotedFields != null)
457✔
177
            {
178
                parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.MemberVotedFields, string.Join(",", MembersVotedFields.Fields)));
2✔
179
            }
180

181
            parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Members, IncludeMembers));
457✔
182
            parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Board, IncludeBoard));
457✔
183
            parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.List, IncludeList));
457✔
184
            parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Checklists, IncludeChecklists ? "all" : "none"));
457✔
185
            parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.PluginData, IncludePluginData));
457✔
186
            parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Stickers, IncludeStickers));
457✔
187
            parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.CustomFieldItems, IncludeCustomFieldItems));
457✔
188
            parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.MembersVoted, IncludeMemberVotes));
457✔
189

190
            switch (IncludeAttachments)
457!
191
            {
192
                case GetCardOptionsIncludeAttachments.True:
193
                    parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Attachments, true));
133✔
194
                    break;
133✔
195
                case GetCardOptionsIncludeAttachments.False:
196
                    parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Attachments, false));
324✔
197
                    break;
324✔
198
                case GetCardOptionsIncludeAttachments.Cover:
NEW
199
                    parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Attachments, "cover"));
×
200
                    break;
×
201
                default:
202
                    throw new ArgumentOutOfRangeException();
×
203
            }
204

205
            if (multipleObjects)
457✔
206
            {
207
                if (Limit.HasValue)
257✔
208
                {
209
                    parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Limit, Limit.Value));
4✔
210
                }
211

212
                if (Before != null)
257✔
213
                {
214
                    parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Before, Before));
2✔
215
                }
216

217
                if (Since != null)
257✔
218
                {
219
                    parameters.Add(new QueryParameter(Constants.TrelloIds.QueryParameterNames.Since, Since));
2✔
220
                }
221
            }
222

223
            parameters.AddRange(AdditionalParameters);
457✔
224

225
            return parameters.ToArray();
457✔
226
        }
227

228
        internal void AdjustFieldsBasedOnSelectedOptions()
229
        {
230
            List<CardFieldsType> cardFieldsNeededForFilterAndOrder = new List<CardFieldsType>();
256✔
231
            switch (OrderBy)
256✔
232
            {
233
                case CardsOrderBy.StartDateAsc:
234
                case CardsOrderBy.StartDateDesc:
235
                    cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Start);
2✔
236
                    break;
2✔
237
                case CardsOrderBy.DueDateAsc:
238
                case CardsOrderBy.DueDateDesc:
239
                    cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Due);
2✔
240
                    break;
2✔
241
                case CardsOrderBy.NameAsc:
242
                case CardsOrderBy.NameDesc:
243
                    cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Name);
2✔
244
                    break;
245
            }
246

247
            if (FilterConditions != null && FilterConditions.Count != 0)
256✔
248
            {
249
                foreach (CardsFilterCondition condition in FilterConditions)
1,044✔
250
                {
251
                    switch (condition.Field)
279✔
252
                    {
253
                        case CardsConditionField.Name:
254
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Name);
26✔
255
                            break;
26✔
256
                        case CardsConditionField.ListId:
257
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.ListId);
11✔
258
                            break;
11✔
259
                        case CardsConditionField.ListName:
260
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.ListId);
24✔
261
                            IncludeList = true;
24✔
262
                            break;
24✔
263
                        case CardsConditionField.LabelId:
264
                        case CardsConditionField.LabelName:
265
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.LabelIds);
46✔
266
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Labels);
46✔
267
                            break;
46✔
268
                        case CardsConditionField.MemberId:
269
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.MemberIds);
20✔
270
                            break;
20✔
271
                        case CardsConditionField.MemberName:
272
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.MemberIds);
24✔
273
                            IncludeMembers = true;
24✔
274
                            break;
24✔
275
                        case CardsConditionField.Description:
276
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Description);
26✔
277
                            break;
26✔
278
                        case CardsConditionField.Due:
279
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Due);
16✔
280
                            break;
16✔
281
                        case CardsConditionField.DueWithNoDueComplete:
282
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Due);
16✔
283
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.DueComplete);
16✔
284
                            break;
16✔
285
                        case CardsConditionField.Start:
286
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Start);
16✔
287
                            break;
16✔
288
                        case CardsConditionField.CustomField:
289
                            IncludeCustomFieldItems = true;
36✔
290
                            break;
36✔
291
                        case CardsConditionField.DueComplete:
292
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.DueComplete);
2✔
293
                            break;
294
                    }
295
                }
296
            }
297

298
            // ReSharper disable once InvertIf
299
            if (cardFieldsNeededForFilterAndOrder.Count > 0)
256✔
300
            {
301
                if (CardFields == null)
233✔
302
                {
303
                    CardFields = CardFields.DefaultFields;
1✔
304
                }
305

306
                foreach (CardFieldsType cardFieldsType in cardFieldsNeededForFilterAndOrder.Distinct())
1,056✔
307
                {
308
                    CardFields.AddIfMissing(cardFieldsType);
295✔
309
                }
310
            }
311
        }
256✔
312
    }
313
}
314

315

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