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

rwjdk / TrelloDotNet / 13617669023

02 Mar 2025 05:20PM UTC coverage: 49.905% (+4.0%) from 45.939%
13617669023

push

github

rwjdk
Fixes + Increase new Filter Test Coverage

1297 of 3263 branches covered (39.75%)

Branch coverage included in aggregate %.

26 of 34 new or added lines in 1 file covered. (76.47%)

34 existing lines in 7 files now uncovered.

2903 of 5153 relevant lines covered (56.34%)

53.77 hits per line

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

65.71
/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; }
759✔
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; }
221✔
21

22
        /// <summary>
23
        /// Controls if cards should include their attachments (Default: False)
24
        /// </summary>
25
        public GetCardOptionsIncludeAttachments IncludeAttachments { get; set; } = GetCardOptionsIncludeAttachments.False;
594✔
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; }
221✔
31

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

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

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

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

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

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

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

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

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

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

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

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

92
        /// <summary>
93
        /// What board-fields to include if IncludeBoard are set to True
94
        /// </summary>
95
        public BoardFields BoardFields { get; set; }
221✔
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; }
86✔
101

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

107
        /// <summary>
108
        /// Pagination (Only return cards since this Card Id was created)
109
        /// </summary>
110
        public string Since { get; set; } = null;
86✔
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; }
88✔
116

117
        /// <summary>
118
        /// Order the cards returned by this (only used when multiple cards are returned)
119
        /// </summary>
120
        public CardsOrderBy? OrderBy { get; set; }
168✔
121

122
        /// <summary>
123
        /// 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)
124
        /// </summary>
125
        public List<CardsFilterCondition> FilterConditions { get; set; } = new List<CardsFilterCondition>();
649✔
126

127
        /// <summary>
128
        /// 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)
129
        /// </summary>
130
        public List<QueryParameter> AdditionalParameters { get; set; } = new List<QueryParameter>();
442✔
131

132
        internal QueryParameter[] GetParameters(bool multipleObjects)
133
        {
134
            List<QueryParameter> parameters = new List<QueryParameter>();
221✔
135
            if (CardFields != null)
221✔
136
            {
137
                parameters.Add(new QueryParameter("fields", string.Join(",", CardFields.Fields)));
143✔
138
            }
139

140
            if (ActionsTypes != null)
221!
141
            {
142
                parameters.Add(new QueryParameter("actions", string.Join(",", ActionsTypes.ActionTypes)));
×
143
            }
144

145
            if (AttachmentFields != null)
221!
146
            {
147
                parameters.Add(new QueryParameter("attachment_fields", string.Join(",", AttachmentFields.Fields)));
×
148
            }
149

150
            if (MemberFields != null)
221!
151
            {
152
                parameters.Add(new QueryParameter("member_fields", string.Join(",", MemberFields.Fields)));
×
153
            }
154

155
            if (BoardFields != null)
221!
156
            {
157
                parameters.Add(new QueryParameter("board_fields", string.Join(",", BoardFields.Fields)));
×
158
            }
159

160
            if (ChecklistFields != null)
221!
161
            {
162
                parameters.Add(new QueryParameter("checklist_fields", string.Join(",", ChecklistFields.Fields)));
×
163
            }
164

165
            if (StickerFields != null)
221!
166
            {
167
                parameters.Add(new QueryParameter("sticker_fields", string.Join(",", StickerFields.Fields)));
×
168
            }
169

170
            if (MembersVotedFields != null)
221!
171
            {
172
                parameters.Add(new QueryParameter("memberVoted_fields", string.Join(",", MembersVotedFields.Fields)));
×
173
            }
174

175
            parameters.Add(new QueryParameter("members", IncludeMembers));
221✔
176
            parameters.Add(new QueryParameter("board", IncludeBoard));
221✔
177
            parameters.Add(new QueryParameter("list", IncludeList));
221✔
178
            parameters.Add(new QueryParameter("checklists", IncludeChecklists ? "all" : "none"));
221✔
179
            parameters.Add(new QueryParameter("pluginData", IncludePluginData));
221✔
180
            parameters.Add(new QueryParameter("stickers", IncludeStickers));
221✔
181
            parameters.Add(new QueryParameter("customFieldItems", IncludeCustomFieldItems));
221✔
182
            parameters.Add(new QueryParameter("membersVoted", IncludeMemberVotes));
221✔
183

184
            switch (IncludeAttachments)
221!
185
            {
186
                case GetCardOptionsIncludeAttachments.True:
187
                    parameters.Add(new QueryParameter("attachments", true));
77✔
188
                    break;
77✔
189
                case GetCardOptionsIncludeAttachments.False:
190
                    parameters.Add(new QueryParameter("attachments", false));
144✔
191
                    break;
144✔
192
                case GetCardOptionsIncludeAttachments.Cover:
193
                    parameters.Add(new QueryParameter("attachments", "cover"));
×
194
                    break;
×
195
                default:
196
                    throw new ArgumentOutOfRangeException();
×
197
            }
198

199
            if (multipleObjects)
221✔
200
            {
201
                if (Limit.HasValue)
86!
202
                {
203
                    parameters.Add(new QueryParameter("limit", Limit.Value));
×
204
                }
205

206
                if (Before != null)
86!
207
                {
208
                    parameters.Add(new QueryParameter("before", Before));
×
209
                }
210

211
                if (Since != null)
86!
212
                {
213
                    parameters.Add(new QueryParameter("since", Since));
×
214
                }
215
            }
216

217
            parameters.AddRange(AdditionalParameters);
221✔
218

219
            return parameters.ToArray();
221✔
220
        }
221

222
        internal void AdjustFieldsBasedOnSelectedOptions()
223
        {
224
            List<CardFieldsType> cardFieldsNeededForFilterAndOrder = new List<CardFieldsType>();
86✔
225
            switch (OrderBy)
86!
226
            {
227
                case CardsOrderBy.StartDateAsc:
228
                case CardsOrderBy.StartDateDesc:
229
                    cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Start);
×
230
                    break;
×
231
                case CardsOrderBy.DueDateAsc:
232
                case CardsOrderBy.DueDateDesc:
233
                    cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Due);
×
234
                    break;
×
235
                case CardsOrderBy.NameAsc:
236
                case CardsOrderBy.NameDesc:
237
                    cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Name);
×
238
                    break;
239
            }
240

241
            if (FilterConditions != null && FilterConditions.Count != 0)
86✔
242
            {
243
                foreach (CardsFilterCondition condition in FilterConditions)
340✔
244
                {
245
                    switch (condition.Field)
85!
246
                    {
247
                        case CardsConditionField.Name:
248
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Name);
×
249
                            break;
×
250
                        case CardsConditionField.ListId:
251
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.ListId);
10✔
252
                            break;
10✔
253
                        case CardsConditionField.ListName:
254
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.ListId);
24✔
255
                            IncludeList = true;
24✔
256
                            break;
24✔
257
                        case CardsConditionField.LabelId:
258
                        case CardsConditionField.LabelName:
259
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.LabelIds);
34✔
260
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Labels);
34✔
261
                            break;
34✔
262
                        case CardsConditionField.MemberId:
263
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.MemberIds);
5✔
264
                            break;
5✔
265
                        case CardsConditionField.MemberName:
266
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.MemberIds);
12✔
267
                            IncludeMembers = true;
12✔
268
                            break;
12✔
269
                        case CardsConditionField.Description:
270
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Description);
×
271
                            break;
×
272
                        case CardsConditionField.Due:
273
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Due);
×
274
                            break;
×
275
                        case CardsConditionField.DueWithNoDueComplete:
276
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Due);
×
277
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.DueComplete);
×
278
                            break;
×
279
                        case CardsConditionField.Start:
280
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.Start);
×
281
                            break;
×
282
                        case CardsConditionField.CustomField:
283
                            IncludeCustomFieldItems = true;
×
284
                            break;
×
285
                        case CardsConditionField.DueComplete:
286
                            cardFieldsNeededForFilterAndOrder.Add(CardFieldsType.DueComplete);
×
287
                            break;
288
                    }
289
                }
290
            }
291

292
            // ReSharper disable once InvertIf
293
            if (cardFieldsNeededForFilterAndOrder.Count > 0)
86✔
294
            {
295
                if (CardFields == null)
85!
296
                {
UNCOV
297
                    CardFields = CardFields.DefaultFields;
×
298
                }
299

300
                foreach (CardFieldsType cardFieldsType in cardFieldsNeededForFilterAndOrder.Distinct())
408✔
301
                {
302
                    CardFields.AddIfMissing(cardFieldsType);
119✔
303
                }
304
            }
305
        }
86✔
306
    }
307
}
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