@onlineapps/conn-base-storage 1.0.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 (39) hide show
  1. package/API.md +618 -0
  2. package/README.md +341 -0
  3. package/SHARED_URL_ADDRESSING.md +258 -0
  4. package/coverage/base.css +224 -0
  5. package/coverage/block-navigation.js +87 -0
  6. package/coverage/clover.xml +213 -0
  7. package/coverage/coverage-final.json +3 -0
  8. package/coverage/favicon.png +0 -0
  9. package/coverage/index.html +131 -0
  10. package/coverage/index.js.html +1579 -0
  11. package/coverage/internal-url-adapter.js.html +604 -0
  12. package/coverage/lcov-report/base.css +224 -0
  13. package/coverage/lcov-report/block-navigation.js +87 -0
  14. package/coverage/lcov-report/favicon.png +0 -0
  15. package/coverage/lcov-report/index.html +131 -0
  16. package/coverage/lcov-report/index.js.html +1579 -0
  17. package/coverage/lcov-report/internal-url-adapter.js.html +604 -0
  18. package/coverage/lcov-report/prettify.css +1 -0
  19. package/coverage/lcov-report/prettify.js +2 -0
  20. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  21. package/coverage/lcov-report/sorter.js +210 -0
  22. package/coverage/lcov.info +434 -0
  23. package/coverage/prettify.css +1 -0
  24. package/coverage/prettify.js +2 -0
  25. package/coverage/sort-arrow-sprite.png +0 -0
  26. package/coverage/sorter.js +210 -0
  27. package/jest.config.js +13 -0
  28. package/jest.integration.config.js +9 -0
  29. package/package.json +33 -0
  30. package/src/index.js +853 -0
  31. package/src/internal-url-adapter.js +174 -0
  32. package/src/sharedUrlAdapter.js +258 -0
  33. package/test/component/storage.component.test.js +363 -0
  34. package/test/integration/setup.js +3 -0
  35. package/test/integration/storage.integration.test.js +224 -0
  36. package/test/unit/internal-url-adapter.test.js +211 -0
  37. package/test/unit/legacy.storage.test.js.bak +614 -0
  38. package/test/unit/storage.extended.unit.test.js +435 -0
  39. package/test/unit/storage.unit.test.js +373 -0
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Tests for Internal URL Adapter
3
+ */
4
+
5
+ const InternalUrlAdapter = require('../../src/internal-url-adapter');
6
+
7
+ describe('InternalUrlAdapter', () => {
8
+ let adapter;
9
+
10
+ beforeEach(() => {
11
+ adapter = new InternalUrlAdapter();
12
+ });
13
+
14
+ describe('URL Resolution', () => {
15
+ test('should resolve internal://storage URL for Docker environment', () => {
16
+ adapter.dockerNetwork = true;
17
+ const internalUrl = 'internal://storage/bucket/path/to/file.json';
18
+ const resolved = adapter.resolve(internalUrl);
19
+
20
+ expect(resolved).toBe('http://api_services_storage:9000/bucket/path/to/file.json');
21
+ });
22
+
23
+ test('should resolve internal://storage URL for local environment', () => {
24
+ adapter.dockerNetwork = false;
25
+ const internalUrl = 'internal://storage/bucket/path/to/file.json';
26
+ const resolved = adapter.resolve(internalUrl);
27
+
28
+ expect(resolved).toBe('http://localhost:9000/bucket/path/to/file.json');
29
+ });
30
+
31
+ test('should resolve internal://registry URL', () => {
32
+ adapter.dockerNetwork = false;
33
+ const internalUrl = 'internal://registry/services/list';
34
+ const resolved = adapter.resolve(internalUrl);
35
+
36
+ expect(resolved).toBe('http://localhost:8080/services/list');
37
+ });
38
+
39
+ test('should resolve internal://monitoring URL', () => {
40
+ adapter.dockerNetwork = true;
41
+ const internalUrl = 'internal://monitoring/metrics';
42
+ const resolved = adapter.resolve(internalUrl);
43
+
44
+ expect(resolved).toBe('http://api_monitoring:3000/metrics');
45
+ });
46
+
47
+ test('should pass through non-internal URLs unchanged', () => {
48
+ const normalUrl = 'http://example.com/path';
49
+ const resolved = adapter.resolve(normalUrl);
50
+
51
+ expect(resolved).toBe(normalUrl);
52
+ });
53
+
54
+ test('should handle URLs with query parameters', () => {
55
+ adapter.dockerNetwork = false;
56
+ const internalUrl = 'internal://storage/bucket/file?version=2&download=true';
57
+ const resolved = adapter.resolve(internalUrl);
58
+
59
+ expect(resolved).toBe('http://localhost:9000/bucket/file?version=2&download=true');
60
+ });
61
+
62
+ test('should throw error for unknown service', () => {
63
+ const unknownUrl = 'internal://unknown-service/path';
64
+
65
+ expect(() => adapter.resolve(unknownUrl)).toThrow('Unknown service: unknown-service');
66
+ });
67
+ });
68
+
69
+ describe('Reverse URL Conversion', () => {
70
+ test('should convert actual URL to internal format', () => {
71
+ const actualUrl = 'http://api_services_storage:9000/bucket/path/file.json';
72
+ const internal = adapter.toInternal(actualUrl, 'storage');
73
+
74
+ expect(internal).toBe('internal://storage/bucket/path/file.json');
75
+ });
76
+
77
+ test('should preserve query parameters in conversion', () => {
78
+ const actualUrl = 'http://localhost:9000/bucket/file?version=2';
79
+ const internal = adapter.toInternal(actualUrl, 'storage');
80
+
81
+ expect(internal).toBe('internal://storage/bucket/file?version=2');
82
+ });
83
+ });
84
+
85
+ describe('Service Registration', () => {
86
+ test('should register new service', () => {
87
+ adapter.registerService('custom', 'custom-container:8080', 'localhost:8080');
88
+
89
+ const internalUrl = 'internal://custom/api/endpoint';
90
+ adapter.dockerNetwork = true;
91
+ const resolved = adapter.resolve(internalUrl);
92
+
93
+ expect(resolved).toBe('http://custom-container:8080/api/endpoint');
94
+ });
95
+
96
+ test('should override existing service', () => {
97
+ adapter.registerService('storage', 'new-storage:9001', 'localhost:9001');
98
+
99
+ const internalUrl = 'internal://storage/bucket/file';
100
+ adapter.dockerNetwork = false;
101
+ const resolved = adapter.resolve(internalUrl);
102
+
103
+ expect(resolved).toBe('http://localhost:9001/bucket/file');
104
+ });
105
+ });
106
+
107
+ describe('Response Transformation', () => {
108
+ test('should transform internal URLs in response object', () => {
109
+ adapter.dockerNetwork = false;
110
+
111
+ const response = {
112
+ url: 'internal://storage/bucket/file.json',
113
+ backup: 'internal://storage/backup/file.json',
114
+ metadata: {
115
+ thumbnail: 'internal://storage/thumbnails/thumb.jpg'
116
+ }
117
+ };
118
+
119
+ const transformed = adapter.transformResponse(response);
120
+
121
+ expect(transformed.url).toBe('http://localhost:9000/bucket/file.json');
122
+ expect(transformed.backup).toBe('http://localhost:9000/backup/file.json');
123
+ expect(transformed.metadata.thumbnail).toBe('http://localhost:9000/thumbnails/thumb.jpg');
124
+ });
125
+
126
+ test('should handle arrays in response', () => {
127
+ adapter.dockerNetwork = false;
128
+
129
+ const response = {
130
+ files: [
131
+ 'internal://storage/file1.json',
132
+ 'internal://storage/file2.json',
133
+ 'http://external.com/file3.json'
134
+ ]
135
+ };
136
+
137
+ const transformed = adapter.transformResponse(response);
138
+
139
+ expect(transformed.files[0]).toBe('http://localhost:9000/file1.json');
140
+ expect(transformed.files[1]).toBe('http://localhost:9000/file2.json');
141
+ expect(transformed.files[2]).toBe('http://external.com/file3.json');
142
+ });
143
+
144
+ test('should handle nested objects', () => {
145
+ adapter.dockerNetwork = true;
146
+
147
+ const response = {
148
+ data: {
149
+ primary: {
150
+ location: 'internal://storage/primary/data.json'
151
+ },
152
+ secondary: {
153
+ location: 'internal://storage/secondary/data.json'
154
+ }
155
+ }
156
+ };
157
+
158
+ const transformed = adapter.transformResponse(response);
159
+
160
+ expect(transformed.data.primary.location).toBe('http://api_services_storage:9000/primary/data.json');
161
+ expect(transformed.data.secondary.location).toBe('http://api_services_storage:9000/secondary/data.json');
162
+ });
163
+ });
164
+
165
+ describe('Environment Detection', () => {
166
+ test('should detect Docker environment from env variable', () => {
167
+ const originalEnv = process.env.DOCKER_ENV;
168
+
169
+ process.env.DOCKER_ENV = 'true';
170
+ const adapter1 = new InternalUrlAdapter();
171
+ expect(adapter1.isRunningInDocker()).toBe(true);
172
+
173
+ delete process.env.DOCKER_ENV;
174
+ const adapter2 = new InternalUrlAdapter();
175
+ // Může být stále true pokud běžíme v Dockeru
176
+
177
+ // Obnovit původní hodnotu
178
+ if (originalEnv) process.env.DOCKER_ENV = originalEnv;
179
+ });
180
+ });
181
+
182
+ describe('Available Services', () => {
183
+ test('should return list of available services', () => {
184
+ const services = adapter.getAvailableServices();
185
+
186
+ expect(services).toContain('storage');
187
+ expect(services).toContain('registry');
188
+ expect(services).toContain('monitoring');
189
+ expect(services).toContain('mq');
190
+ expect(services).toContain('cache');
191
+ });
192
+ });
193
+
194
+ describe('Custom Configuration', () => {
195
+ test('should accept custom service mappings', () => {
196
+ const customAdapter = new InternalUrlAdapter({
197
+ services: {
198
+ 'my-service': {
199
+ docker: 'my-container:3000',
200
+ local: 'localhost:3000'
201
+ }
202
+ }
203
+ });
204
+
205
+ customAdapter.dockerNetwork = false;
206
+ const resolved = customAdapter.resolve('internal://my-service/api');
207
+
208
+ expect(resolved).toBe('http://localhost:3000/api');
209
+ });
210
+ });
211
+ });