@uarlouski/testrail-mcp-server 1.1.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +62 -16
  3. package/package.json +3 -2
  4. package/src/client/testrail.ts +111 -56
  5. package/src/index.ts +32 -2
  6. package/src/tools/add_attachment_to_run.ts +62 -0
  7. package/src/tools/add_results.ts +28 -0
  8. package/src/tools/add_run.ts +24 -0
  9. package/src/tools/create_case.ts +10 -17
  10. package/src/tools/get_case.ts +5 -12
  11. package/src/tools/get_case_fields.ts +4 -11
  12. package/src/tools/get_cases.ts +9 -16
  13. package/src/tools/get_projects.ts +7 -27
  14. package/src/tools/get_sections.ts +7 -27
  15. package/src/tools/get_statuses.ts +18 -0
  16. package/src/tools/get_templates.ts +7 -27
  17. package/src/tools/get_tests.ts +22 -0
  18. package/src/tools/update_case.ts +7 -14
  19. package/src/tools/update_cases.ts +10 -16
  20. package/src/types/custom.ts +1 -16
  21. package/src/types/testrail.ts +140 -87
  22. package/src/utils/sanitizer.ts +29 -0
  23. package/test/client/testrail.test.ts +329 -141
  24. package/test/tools/add_results.test.ts +94 -0
  25. package/test/tools/add_run.test.ts +83 -0
  26. package/test/tools/create_case.test.ts +10 -16
  27. package/test/tools/get_case.test.ts +47 -62
  28. package/test/tools/get_case_fields.test.ts +7 -80
  29. package/test/tools/get_cases.test.ts +19 -108
  30. package/test/tools/get_projects.test.ts +4 -41
  31. package/test/tools/get_sections.test.ts +7 -36
  32. package/test/tools/get_statuses.test.ts +56 -0
  33. package/test/tools/get_templates.test.ts +1 -30
  34. package/test/tools/get_tests.test.ts +47 -0
  35. package/test/tools/update_case.test.ts +10 -16
  36. package/test/tools/update_cases.test.ts +29 -28
  37. package/test/utils/mapper.test.ts +13 -13
  38. package/test/utils/sanitizer.test.ts +85 -1
@@ -1,5 +1,5 @@
1
1
  import { describe, test, expect } from '@jest/globals';
2
- import { sanitizeValue } from '../../src/utils/sanitizer.js';
2
+ import { sanitizeValue, removeNullish } from '../../src/utils/sanitizer.js';
3
3
 
4
4
  describe('sanitizeValue', () => {
5
5
  test('strips style attributes from string values', () => {
@@ -57,3 +57,87 @@ describe('sanitizeValue', () => {
57
57
  expect(sanitizeValue(null)).toBe(null);
58
58
  });
59
59
  });
60
+
61
+ describe('removeNullish', () => {
62
+ test('removes null values from object', () => {
63
+ const input = { a: 1, b: null, c: 3 };
64
+ expect(removeNullish(input)).toEqual({ a: 1, c: 3 });
65
+ });
66
+
67
+ test('removes undefined values from object', () => {
68
+ const input = { a: 1, b: undefined, c: 3 };
69
+ expect(removeNullish(input)).toEqual({ a: 1, c: 3 });
70
+ });
71
+
72
+ test('handles nested objects', () => {
73
+ const input = {
74
+ name: 'test',
75
+ metadata: { id: 1, value: null, active: true },
76
+ count: null
77
+ };
78
+ expect(removeNullish(input)).toEqual({
79
+ name: 'test',
80
+ metadata: { id: 1, active: true }
81
+ });
82
+ });
83
+
84
+ test('filters null items from arrays', () => {
85
+ const input = [1, null, 3, undefined, 5];
86
+ expect(removeNullish(input)).toEqual([1, 3, 5]);
87
+ });
88
+
89
+ test('cleans nested objects in arrays', () => {
90
+ const input = [
91
+ { id: 1, name: 'item1', value: null },
92
+ { id: 2, name: null, value: 'test' }
93
+ ];
94
+ expect(removeNullish(input)).toEqual([
95
+ { id: 1, name: 'item1' },
96
+ { id: 2, value: 'test' }
97
+ ]);
98
+ });
99
+
100
+ test('handles deeply nested structures', () => {
101
+ const input = {
102
+ projects: [
103
+ {
104
+ id: 1,
105
+ name: 'Project A',
106
+ metadata: { created: null, updated: '2024-01-01' },
107
+ tags: [null, 'important', undefined, 'urgent']
108
+ },
109
+ null
110
+ ],
111
+ count: undefined
112
+ };
113
+ expect(removeNullish(input)).toEqual({
114
+ projects: [
115
+ {
116
+ id: 1,
117
+ name: 'Project A',
118
+ metadata: { updated: '2024-01-01' },
119
+ tags: ['important', 'urgent']
120
+ }
121
+ ]
122
+ });
123
+ });
124
+
125
+ test('preserves primitive values', () => {
126
+ expect(removeNullish(42)).toBe(42);
127
+ expect(removeNullish('test')).toBe('test');
128
+ expect(removeNullish(true)).toBe(true);
129
+ expect(removeNullish(0)).toBe(0);
130
+ expect(removeNullish('')).toBe('');
131
+ expect(removeNullish(false)).toBe(false);
132
+ });
133
+
134
+ test('returns null/undefined as-is for root values', () => {
135
+ expect(removeNullish(null)).toBe(null);
136
+ expect(removeNullish(undefined)).toBe(undefined);
137
+ });
138
+
139
+ test('handles empty objects and arrays', () => {
140
+ expect(removeNullish({})).toEqual({});
141
+ expect(removeNullish([])).toEqual([]);
142
+ });
143
+ });