fork of hey-api/openapi-ts because I need some additional things
at feat/skip-token 188 lines 5.3 kB view raw
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});