fork of hey-api/openapi-ts because I need some additional things
1import { pathToName } from '../path';
2
3describe('pathToName', () => {
4 // ── OpenAPI 3.x component schemas ──
5
6 it('handles top-level schema', () => {
7 expect(pathToName(['components', 'schemas', 'User'])).toBe('User');
8 });
9
10 it('handles nested property', () => {
11 expect(pathToName(['components', 'schemas', 'User', 'properties', 'address'])).toBe(
12 'User-address',
13 );
14 });
15
16 it('handles deeply nested properties', () => {
17 expect(
18 pathToName(['components', 'schemas', 'User', 'properties', 'address', 'properties', 'city']),
19 ).toBe('User-address-city');
20 });
21
22 it('handles property literally named "properties"', () => {
23 expect(pathToName(['components', 'schemas', 'Foo', 'properties', 'properties'])).toBe(
24 'Foo-properties',
25 );
26 });
27
28 it('handles property named "properties" with children', () => {
29 expect(
30 pathToName([
31 'components',
32 'schemas',
33 'Foo',
34 'properties',
35 'properties',
36 'properties',
37 'items',
38 ]),
39 ).toBe('Foo-properties-items');
40 });
41
42 it('handles property named "items"', () => {
43 expect(pathToName(['components', 'schemas', 'Foo', 'properties', 'items'])).toBe('Foo-items');
44 });
45
46 // ── additionalProperties ──
47
48 it('handles additionalProperties', () => {
49 expect(pathToName(['components', 'schemas', 'Pet', 'additionalProperties'])).toBe('Pet-Value');
50 });
51
52 it('handles nested additionalProperties', () => {
53 expect(
54 pathToName([
55 'components',
56 'schemas',
57 'Pet',
58 'properties',
59 'metadata',
60 'additionalProperties',
61 ]),
62 ).toBe('Pet-metadata-Value');
63 });
64
65 // ── Array items ──
66
67 it('handles array items (skips index)', () => {
68 expect(
69 pathToName(['components', 'schemas', 'Order', 'properties', 'line_items', 'items', 0]),
70 ).toBe('Order-line_items');
71 });
72
73 it('handles items without numeric index', () => {
74 expect(pathToName(['components', 'schemas', 'Result', 'items', 0])).toBe('Result');
75 });
76
77 // ── Tuple items ──
78
79 it('handles tuple items at different indices', () => {
80 expect(pathToName(['components', 'schemas', 'Pair', 'items', 0])).toBe('Pair');
81
82 expect(pathToName(['components', 'schemas', 'Pair', 'items', 1])).toBe('Pair');
83 });
84
85 // ── patternProperties ──
86
87 it('handles patternProperties', () => {
88 expect(pathToName(['components', 'schemas', 'Config', 'patternProperties', '^x-'])).toBe(
89 'Config-^x-',
90 );
91 });
92
93 // ── OpenAPI 2.0 ──
94
95 it('handles definitions (OpenAPI 2.0)', () => {
96 expect(pathToName(['definitions', 'User'])).toBe('User');
97 });
98
99 it('handles definitions with nested properties', () => {
100 expect(pathToName(['definitions', 'User', 'properties', 'address'])).toBe('User-address');
101 });
102
103 // ── Paths (operations) ──
104
105 it('handles simple path', () => {
106 expect(pathToName(['paths', '/event', 'get', 'properties', 'query'])).toBe('Event-get-query');
107 });
108
109 it('handles path with multiple segments', () => {
110 expect(pathToName(['paths', '/api/v1/users', 'post', 'properties', 'body'])).toBe(
111 'ApiV1Users-post-body',
112 );
113 });
114
115 it('handles path with parameter', () => {
116 expect(pathToName(['paths', '/users/{id}/posts', 'get', 'properties', 'query'])).toBe(
117 'UsersIdPosts-get-query',
118 );
119 });
120
121 it('handles path without properties', () => {
122 expect(pathToName(['paths', '/event', 'get'])).toBe('Event-get');
123 });
124
125 // ── Webhooks ──
126
127 it('handles webhooks', () => {
128 expect(pathToName(['webhooks', 'onEvent', 'post', 'properties', 'body'])).toBe(
129 'onEvent-post-body',
130 );
131 });
132
133 // ── Component types beyond schemas ──
134
135 it('handles component parameters', () => {
136 expect(pathToName(['components', 'parameters', 'UserId'])).toBe('UserId');
137 });
138
139 it('handles component requestBodies', () => {
140 expect(pathToName(['components', 'requestBodies', 'CreateUser', 'properties', 'name'])).toBe(
141 'CreateUser-name',
142 );
143 });
144
145 // ── Encoded characters ──
146
147 it('handles URI-encoded names', () => {
148 expect(pathToName(['components', 'schemas', 'My%20Schema'])).toBe('My Schema');
149 });
150
151 // ── Anchor option ──
152
153 it('uses anchor for component schema', () => {
154 expect(
155 pathToName(['components', 'schemas', 'User', 'properties', 'address'], {
156 anchor: 'UserDTO',
157 }),
158 ).toBe('UserDTO-address');
159 });
160
161 it('uses anchor for paths', () => {
162 expect(
163 pathToName(['paths', '/event', 'get', 'properties', 'query'], {
164 anchor: 'event.subscribe',
165 }),
166 ).toBe('event.subscribe-query');
167 });
168
169 it('uses anchor and preserves structural suffix', () => {
170 expect(
171 pathToName(['components', 'schemas', 'Pet', 'additionalProperties'], {
172 anchor: 'PetMap',
173 }),
174 ).toBe('PetMap-Value');
175 });
176
177 it('uses anchor with deeply nested properties', () => {
178 expect(
179 pathToName(['components', 'schemas', 'User', 'properties', 'address', 'properties', 'city'], {
180 anchor: 'UserInput',
181 }),
182 ).toBe('UserInput-address-city');
183 });
184
185 it('uses anchor for unknown root', () => {
186 expect(pathToName(['foo', 'bar', 'baz'], { anchor: 'Root' })).toBe('Root');
187 });
188});