@pod-os/elements 0.13.1-9efc307.0 → 0.13.1-cd22eb8.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 (93) hide show
  1. package/dist/cjs/elements.cjs.js +1 -1
  2. package/dist/cjs/loader.cjs.js +1 -1
  3. package/dist/collection/collection-manifest.json +2 -3
  4. package/dist/elements/elements.esm.js +1 -1
  5. package/dist/elements/elements.esm.js.map +1 -1
  6. package/dist/esm/elements.js +1 -1
  7. package/dist/esm/loader.js +1 -1
  8. package/dist/types/components.d.ts +0 -13
  9. package/package.json +1 -1
  10. package/dist/cjs/test-component.cjs.entry.js +0 -15
  11. package/dist/cjs/test-component.cjs.entry.js.map +0 -1
  12. package/dist/collection/apps/pos-app-document-viewer/pos-app-document-viewer.spec.js +0 -29
  13. package/dist/collection/apps/pos-app-document-viewer/pos-app-document-viewer.spec.js.map +0 -1
  14. package/dist/collection/apps/pos-app-image-viewer/pos-app-image-viewer.spec.js +0 -29
  15. package/dist/collection/apps/pos-app-image-viewer/pos-app-image-viewer.spec.js.map +0 -1
  16. package/dist/collection/components/broken-file/BrokenFile.spec.js +0 -45
  17. package/dist/collection/components/broken-file/BrokenFile.spec.js.map +0 -1
  18. package/dist/collection/components/pos-add-literal-value/test/pos-add-literal-value.spec.js +0 -185
  19. package/dist/collection/components/pos-add-literal-value/test/pos-add-literal-value.spec.js.map +0 -1
  20. package/dist/collection/components/pos-add-new-thing/test/pos-add-new-thing.spec.js +0 -59
  21. package/dist/collection/components/pos-add-new-thing/test/pos-add-new-thing.spec.js.map +0 -1
  22. package/dist/collection/components/pos-container-contents/pos-container-contents.spec.js +0 -132
  23. package/dist/collection/components/pos-container-contents/pos-container-contents.spec.js.map +0 -1
  24. package/dist/collection/components/pos-container-contents/pos-container-item.spec.js +0 -64
  25. package/dist/collection/components/pos-container-contents/pos-container-item.spec.js.map +0 -1
  26. package/dist/collection/components/pos-container-contents/selectIconForTypes.spec.js +0 -30
  27. package/dist/collection/components/pos-container-contents/selectIconForTypes.spec.js.map +0 -1
  28. package/dist/collection/components/pos-description/pos-description.spec.js +0 -31
  29. package/dist/collection/components/pos-description/pos-description.spec.js.map +0 -1
  30. package/dist/collection/components/pos-document/pos-document.spec.js +0 -219
  31. package/dist/collection/components/pos-document/pos-document.spec.js.map +0 -1
  32. package/dist/collection/components/pos-error-toast/test/pos-error-toast.spec.js +0 -18
  33. package/dist/collection/components/pos-error-toast/test/pos-error-toast.spec.js.map +0 -1
  34. package/dist/collection/components/pos-image/pos-image.integration.spec.js +0 -124
  35. package/dist/collection/components/pos-image/pos-image.integration.spec.js.map +0 -1
  36. package/dist/collection/components/pos-image/pos-image.spec.js +0 -219
  37. package/dist/collection/components/pos-image/pos-image.spec.js.map +0 -1
  38. package/dist/collection/components/pos-label/pos-label.integration.spec.js +0 -101
  39. package/dist/collection/components/pos-label/pos-label.integration.spec.js.map +0 -1
  40. package/dist/collection/components/pos-label/pos-label.spec.js +0 -31
  41. package/dist/collection/components/pos-label/pos-label.spec.js.map +0 -1
  42. package/dist/collection/components/pos-literals/pos-literals.spec.js +0 -118
  43. package/dist/collection/components/pos-literals/pos-literals.spec.js.map +0 -1
  44. package/dist/collection/components/pos-login/pos-login.integration.spec.js +0 -35
  45. package/dist/collection/components/pos-login/pos-login.integration.spec.js.map +0 -1
  46. package/dist/collection/components/pos-login/pos-login.spec.js +0 -46
  47. package/dist/collection/components/pos-login/pos-login.spec.js.map +0 -1
  48. package/dist/collection/components/pos-navigation-bar/pos-navigation-bar.spec.js +0 -41
  49. package/dist/collection/components/pos-navigation-bar/pos-navigation-bar.spec.js.map +0 -1
  50. package/dist/collection/components/pos-new-thing-form/test/pos-new-thing-form.spec.js +0 -239
  51. package/dist/collection/components/pos-new-thing-form/test/pos-new-thing-form.spec.js.map +0 -1
  52. package/dist/collection/components/pos-picture/pos-picture.integration.spec.js +0 -79
  53. package/dist/collection/components/pos-picture/pos-picture.integration.spec.js.map +0 -1
  54. package/dist/collection/components/pos-picture/pos-picture.spec.js +0 -49
  55. package/dist/collection/components/pos-picture/pos-picture.spec.js.map +0 -1
  56. package/dist/collection/components/pos-relations/pos-relations.spec.js +0 -64
  57. package/dist/collection/components/pos-relations/pos-relations.spec.js.map +0 -1
  58. package/dist/collection/components/pos-resource/pos-resource.integration.spec.js +0 -355
  59. package/dist/collection/components/pos-resource/pos-resource.integration.spec.js.map +0 -1
  60. package/dist/collection/components/pos-resource/pos-resource.spec.js +0 -237
  61. package/dist/collection/components/pos-resource/pos-resource.spec.js.map +0 -1
  62. package/dist/collection/components/pos-reverse-relations/pos-reverse-relations.spec.js +0 -64
  63. package/dist/collection/components/pos-reverse-relations/pos-reverse-relations.spec.js.map +0 -1
  64. package/dist/collection/components/pos-rich-link/pos-rich-link.spec.js +0 -37
  65. package/dist/collection/components/pos-rich-link/pos-rich-link.spec.js.map +0 -1
  66. package/dist/collection/components/pos-select-term/test/pos-select-term.spec.js +0 -75
  67. package/dist/collection/components/pos-select-term/test/pos-select-term.spec.js.map +0 -1
  68. package/dist/collection/components/pos-subjects/pos-subjects.spec.js +0 -58
  69. package/dist/collection/components/pos-subjects/pos-subjects.spec.js.map +0 -1
  70. package/dist/collection/components/pos-type-badges/pos-type-badges.spec.js +0 -119
  71. package/dist/collection/components/pos-type-badges/pos-type-badges.spec.js.map +0 -1
  72. package/dist/collection/components/pos-type-router/pos-type-router.spec.js +0 -105
  73. package/dist/collection/components/pos-type-router/pos-type-router.spec.js.map +0 -1
  74. package/dist/collection/components/pos-type-router/selectAppForTypes.spec.js +0 -85
  75. package/dist/collection/components/pos-type-router/selectAppForTypes.spec.js.map +0 -1
  76. package/dist/collection/components/pos-value/pos-value.spec.js +0 -31
  77. package/dist/collection/components/pos-value/pos-value.spec.js.map +0 -1
  78. package/dist/collection/test/TestComponent.js +0 -4
  79. package/dist/collection/test/TestComponent.js.map +0 -1
  80. package/dist/collection/test/mockPodOS.js +0 -38
  81. package/dist/collection/test/mockPodOS.js.map +0 -1
  82. package/dist/collection/test/renderFunctionalComponent.js +0 -9
  83. package/dist/collection/test/renderFunctionalComponent.js.map +0 -1
  84. package/dist/components/test-component.d.ts +0 -11
  85. package/dist/components/test-component.js +0 -9
  86. package/dist/components/test-component.js.map +0 -1
  87. package/dist/elements/p-c5bcab34.entry.js +0 -2
  88. package/dist/elements/p-c5bcab34.entry.js.map +0 -1
  89. package/dist/esm/test-component.entry.js +0 -11
  90. package/dist/esm/test-component.entry.js.map +0 -1
  91. package/dist/types/test/TestComponent.d.ts +0 -2
  92. package/dist/types/test/mockPodOS.d.ts +0 -13
  93. package/dist/types/test/renderFunctionalComponent.d.ts +0 -1
@@ -1,219 +0,0 @@
1
- jest.mock('../../store/session');
2
- jest.mock('../broken-file/BrokenFile');
3
- import { newSpecPage } from "@stencil/core/testing";
4
- import { Blob } from "buffer";
5
- import { mockPodOS } from "../../test/mockPodOS";
6
- import { BrokenFile } from "../broken-file/BrokenFile";
7
- import { PosDocument } from "./pos-document";
8
- import { when } from "jest-when";
9
- import { h } from "@stencil/core";
10
- import session from "../../store/session";
11
- describe('pos-document', () => {
12
- let pdfBlob;
13
- beforeEach(() => {
14
- pdfBlob = new Blob(['1'], {
15
- type: 'application/pdf',
16
- });
17
- });
18
- beforeEach(() => {
19
- jest.spyOn(URL, 'createObjectURL').mockReturnValue('blob:fake-pdf-data');
20
- });
21
- it('renders loading indicator initially', async () => {
22
- const page = await newSpecPage({
23
- components: [PosDocument],
24
- html: `<pos-document src="https://pod.test/test.pdf" />`,
25
- });
26
- expect(page.root).toEqualHtml(`
27
- <pos-document src="https://pod.test/test.pdf">
28
- <mock:shadow-root>
29
- <ion-skeleton-text animated=""></ion-skeleton-text>
30
- </mock:shadow-root>
31
- </pos-document>
32
- `);
33
- });
34
- it('renders loading indicator while fetching', async () => {
35
- const page = await newSpecPage({
36
- components: [PosDocument],
37
- html: `<pos-document src="https://pod.test/test.pdf" />`,
38
- });
39
- const os = mockPodOS();
40
- when(os.fetchFile)
41
- .calledWith('https://pod.test/test.pdf')
42
- .mockReturnValue(new Promise(() => null));
43
- await page.rootInstance.setOs(os);
44
- await page.waitForChanges();
45
- expect(page.root).toEqualHtml(`
46
- <pos-document src="https://pod.test/test.pdf">
47
- <mock:shadow-root>
48
- <ion-skeleton-text animated=""></ion-skeleton-text>
49
- </mock:shadow-root>
50
- </pos-document>
51
- `);
52
- });
53
- it('renders iframe after loading', async () => {
54
- const file = mockBinaryFile(pdfBlob);
55
- const page = await newSpecPage({
56
- components: [PosDocument],
57
- html: `<pos-document src="https://pod.test/test.pdf" />`,
58
- });
59
- const os = mockPodOS();
60
- when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValue(file);
61
- await page.rootInstance.setOs(os);
62
- await page.waitForChanges();
63
- expect(URL.createObjectURL).toHaveBeenCalledWith(pdfBlob);
64
- expect(page.root).toEqualHtml(`
65
- <pos-document src="https://pod.test/test.pdf">
66
- <mock:shadow-root>
67
- <iframe src="blob:fake-pdf-data"></iframe>
68
- </mock:shadow-root>
69
- </pos-document>
70
- `);
71
- });
72
- it('emits event after loading', async () => {
73
- const onResourceLoaded = jest.fn();
74
- const file = mockBinaryFile(pdfBlob);
75
- const page = await newSpecPage({
76
- components: [PosDocument],
77
- html: `<pos-document src="https://pod.test/test.pdf" />`,
78
- });
79
- page.root.addEventListener('pod-os:resource-loaded', onResourceLoaded);
80
- const os = mockPodOS();
81
- when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValue(file);
82
- await page.rootInstance.setOs(os);
83
- await page.waitForChanges();
84
- expect(onResourceLoaded).toHaveBeenCalled();
85
- expect(onResourceLoaded.mock.calls[0][0].detail).toEqual('https://pod.test/test.pdf');
86
- });
87
- it('renders error when fetch failed', async () => {
88
- const page = await newSpecPage({
89
- components: [PosDocument],
90
- html: `<pos-document src="https://pod.test/test.pdf" />`,
91
- });
92
- const os = mockPodOS();
93
- when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockRejectedValue(new Error('network error'));
94
- await page.rootInstance.setOs(os);
95
- await page.waitForChanges();
96
- expect(page.root).toEqualHtml(`
97
- <pos-document src="https://pod.test/test.pdf">
98
- <mock:shadow-root>
99
- <div class="error">
100
- network error
101
- </div>
102
- </mock:shadow-root>
103
- </pos-document>
104
- `);
105
- });
106
- it('renders error for inaccessible file', async () => {
107
- const brokenImage = {
108
- blob: () => null,
109
- toString: () => '403 - Forbidden - https://pod.test/test.pdf',
110
- };
111
- when(BrokenFile).mockReturnValue(h("div", { class: "error" }, "403 - Forbidden - https://pod.test/test.pdf"));
112
- const page = await newSpecPage({
113
- components: [PosDocument],
114
- html: `<pos-document src="https://pod.test/test.pdf" />`,
115
- });
116
- const os = mockPodOS();
117
- when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValue(brokenImage);
118
- await page.rootInstance.setOs(os);
119
- await page.waitForChanges();
120
- expect(page.root).toEqualHtml(`
121
- <pos-document src="https://pod.test/test.pdf">
122
- <mock:shadow-root>
123
- <div class="error">
124
- 403 - Forbidden - https://pod.test/test.pdf
125
- </div>
126
- </mock:shadow-root>
127
- </pos-document>
128
- `);
129
- });
130
- it('updates and loads resource when src changes', async () => {
131
- const file = mockBinaryFile(pdfBlob);
132
- const page = await newSpecPage({
133
- components: [PosDocument],
134
- html: `<pos-document src="https://pod.test/test.pdf" />`,
135
- });
136
- const os = mockPodOS();
137
- when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValue(file);
138
- when(os.fetchFile)
139
- .calledWith('https://pod.test/other.png')
140
- .mockReturnValue(new Promise(() => null));
141
- await page.rootInstance.setOs(os);
142
- page.root.setAttribute('src', 'https://pod.test/other.png');
143
- await page.waitForChanges();
144
- expect(page.root).toEqualHtml(`
145
- <pos-document src="https://pod.test/other.png">
146
- <mock:shadow-root>
147
- <ion-skeleton-text animated=""></ion-skeleton-text>
148
- </mock:shadow-root>
149
- </pos-document>
150
- `);
151
- });
152
- it('re-fetches resource when session state changes', async () => {
153
- const file = mockBinaryFile(pdfBlob);
154
- let sessionChanged;
155
- // @ts-ignore
156
- session.onChange = (prop, callback) => {
157
- if (prop === 'isLoggedIn') {
158
- sessionChanged = callback;
159
- }
160
- };
161
- const page = await newSpecPage({
162
- components: [PosDocument],
163
- html: `<pos-document src="https://pod.test/test.pdf" />`,
164
- });
165
- const os = mockPodOS();
166
- when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValueOnce(file);
167
- when(os.fetchFile)
168
- .calledWith('https://pod.test/test.pdf')
169
- .mockReturnValueOnce(new Promise(() => null));
170
- await page.rootInstance.setOs(os);
171
- expect(sessionChanged).toBeDefined();
172
- sessionChanged();
173
- await page.waitForChanges();
174
- expect(page.root).toEqualHtml(`
175
- <pos-document src="https://pod.test/test.pdf">
176
- <mock:shadow-root>
177
- <ion-skeleton-text animated=""></ion-skeleton-text>
178
- </mock:shadow-root>
179
- </pos-document>
180
- `);
181
- });
182
- it('removes error message after successful loading', async () => {
183
- const file = mockBinaryFile(pdfBlob);
184
- const unauthorizedFile = {
185
- toString: () => 'Unauthorized',
186
- };
187
- let sessionChanged;
188
- // @ts-ignore
189
- session.onChange = (prop, callback) => {
190
- if (prop === 'isLoggedIn') {
191
- sessionChanged = callback;
192
- }
193
- };
194
- const page = await newSpecPage({
195
- components: [PosDocument],
196
- html: `<pos-document src="https://pod.test/test.pdf" />`,
197
- });
198
- const os = mockPodOS();
199
- when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValueOnce(unauthorizedFile);
200
- when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValueOnce(file);
201
- await page.rootInstance.setOs(os);
202
- expect(sessionChanged).toBeDefined();
203
- sessionChanged();
204
- await page.waitForChanges();
205
- expect(page.root).toEqualHtml(`
206
- <pos-document src="https://pod.test/test.pdf">
207
- <mock:shadow-root>
208
- <iframe src="blob:fake-pdf-data"></iframe>
209
- </mock:shadow-root>
210
- </pos-document>
211
- `);
212
- });
213
- });
214
- function mockBinaryFile(pngBlob) {
215
- return {
216
- blob: () => pngBlob,
217
- };
218
- }
219
- //# sourceMappingURL=pos-document.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pos-document.spec.js","sourceRoot":"","sources":["../../../../src/components/pos-document/pos-document.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["jest.mock('../../store/session');\njest.mock('../broken-file/BrokenFile');\n\nimport { BinaryFile, BrokenFile as BrokenFileData } from '@pod-os/core';\nimport { newSpecPage } from '@stencil/core/testing';\nimport { Blob } from 'buffer';\nimport { mockPodOS } from '../../test/mockPodOS';\nimport { BrokenFile } from '../broken-file/BrokenFile';\nimport { PosDocument } from './pos-document';\nimport { when } from 'jest-when';\nimport { h } from '@stencil/core';\n\nimport session from '../../store/session';\n\ndescribe('pos-document', () => {\n let pdfBlob;\n beforeEach(() => {\n pdfBlob = new Blob(['1'], {\n type: 'application/pdf',\n });\n });\n\n beforeEach(() => {\n jest.spyOn(URL, 'createObjectURL').mockReturnValue('blob:fake-pdf-data');\n });\n\n it('renders loading indicator initially', async () => {\n const page = await newSpecPage({\n components: [PosDocument],\n html: `<pos-document src=\"https://pod.test/test.pdf\" />`,\n });\n expect(page.root).toEqualHtml(`\n <pos-document src=\"https://pod.test/test.pdf\">\n <mock:shadow-root>\n <ion-skeleton-text animated=\"\"></ion-skeleton-text>\n </mock:shadow-root>\n </pos-document>\n `);\n });\n\n it('renders loading indicator while fetching', async () => {\n const page = await newSpecPage({\n components: [PosDocument],\n html: `<pos-document src=\"https://pod.test/test.pdf\" />`,\n });\n const os = mockPodOS();\n when(os.fetchFile)\n .calledWith('https://pod.test/test.pdf')\n .mockReturnValue(new Promise(() => null));\n await page.rootInstance.setOs(os);\n await page.waitForChanges();\n expect(page.root).toEqualHtml(`\n <pos-document src=\"https://pod.test/test.pdf\">\n <mock:shadow-root>\n <ion-skeleton-text animated=\"\"></ion-skeleton-text>\n </mock:shadow-root>\n </pos-document>\n `);\n });\n\n it('renders iframe after loading', async () => {\n const file = mockBinaryFile(pdfBlob);\n const page = await newSpecPage({\n components: [PosDocument],\n html: `<pos-document src=\"https://pod.test/test.pdf\" />`,\n });\n const os = mockPodOS();\n when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValue(file);\n await page.rootInstance.setOs(os);\n await page.waitForChanges();\n expect(URL.createObjectURL).toHaveBeenCalledWith(pdfBlob);\n expect(page.root).toEqualHtml(`\n <pos-document src=\"https://pod.test/test.pdf\">\n <mock:shadow-root>\n <iframe src=\"blob:fake-pdf-data\"></iframe>\n </mock:shadow-root>\n </pos-document>\n `);\n });\n\n it('emits event after loading', async () => {\n const onResourceLoaded = jest.fn();\n const file = mockBinaryFile(pdfBlob);\n const page = await newSpecPage({\n components: [PosDocument],\n html: `<pos-document src=\"https://pod.test/test.pdf\" />`,\n });\n page.root.addEventListener('pod-os:resource-loaded', onResourceLoaded);\n const os = mockPodOS();\n when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValue(file);\n await page.rootInstance.setOs(os);\n await page.waitForChanges();\n expect(onResourceLoaded).toHaveBeenCalled();\n expect(onResourceLoaded.mock.calls[0][0].detail).toEqual('https://pod.test/test.pdf');\n });\n\n it('renders error when fetch failed', async () => {\n const page = await newSpecPage({\n components: [PosDocument],\n html: `<pos-document src=\"https://pod.test/test.pdf\" />`,\n });\n const os = mockPodOS();\n when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockRejectedValue(new Error('network error'));\n await page.rootInstance.setOs(os);\n await page.waitForChanges();\n expect(page.root).toEqualHtml(`\n <pos-document src=\"https://pod.test/test.pdf\">\n <mock:shadow-root>\n <div class=\"error\">\n network error\n </div>\n </mock:shadow-root>\n </pos-document>\n `);\n });\n\n it('renders error for inaccessible file', async () => {\n const brokenImage = {\n blob: () => null,\n toString: () => '403 - Forbidden - https://pod.test/test.pdf',\n } as unknown as BrokenFileData;\n when(BrokenFile).mockReturnValue(<div class=\"error\">403 - Forbidden - https://pod.test/test.pdf</div>);\n const page = await newSpecPage({\n components: [PosDocument],\n html: `<pos-document src=\"https://pod.test/test.pdf\" />`,\n });\n const os = mockPodOS();\n when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValue(brokenImage);\n await page.rootInstance.setOs(os);\n await page.waitForChanges();\n expect(page.root).toEqualHtml(`\n <pos-document src=\"https://pod.test/test.pdf\">\n <mock:shadow-root>\n <div class=\"error\">\n 403 - Forbidden - https://pod.test/test.pdf\n </div>\n </mock:shadow-root>\n </pos-document>\n `);\n });\n\n it('updates and loads resource when src changes', async () => {\n const file = mockBinaryFile(pdfBlob);\n const page = await newSpecPage({\n components: [PosDocument],\n html: `<pos-document src=\"https://pod.test/test.pdf\" />`,\n });\n const os = mockPodOS();\n when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValue(file);\n when(os.fetchFile)\n .calledWith('https://pod.test/other.png')\n .mockReturnValue(new Promise(() => null));\n await page.rootInstance.setOs(os);\n page.root.setAttribute('src', 'https://pod.test/other.png');\n await page.waitForChanges();\n expect(page.root).toEqualHtml(`\n <pos-document src=\"https://pod.test/other.png\">\n <mock:shadow-root>\n <ion-skeleton-text animated=\"\"></ion-skeleton-text>\n </mock:shadow-root>\n </pos-document>\n `);\n });\n\n it('re-fetches resource when session state changes', async () => {\n const file = mockBinaryFile(pdfBlob);\n let sessionChanged;\n // @ts-ignore\n session.onChange = (prop, callback) => {\n if (prop === 'isLoggedIn') {\n sessionChanged = callback;\n }\n };\n const page = await newSpecPage({\n components: [PosDocument],\n html: `<pos-document src=\"https://pod.test/test.pdf\" />`,\n });\n const os = mockPodOS();\n when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValueOnce(file);\n when(os.fetchFile)\n .calledWith('https://pod.test/test.pdf')\n .mockReturnValueOnce(new Promise(() => null));\n await page.rootInstance.setOs(os);\n expect(sessionChanged).toBeDefined();\n sessionChanged();\n await page.waitForChanges();\n expect(page.root).toEqualHtml(`\n <pos-document src=\"https://pod.test/test.pdf\">\n <mock:shadow-root>\n <ion-skeleton-text animated=\"\"></ion-skeleton-text>\n </mock:shadow-root>\n </pos-document>\n `);\n });\n\n it('removes error message after successful loading', async () => {\n const file = mockBinaryFile(pdfBlob);\n const unauthorizedFile = {\n toString: () => 'Unauthorized',\n } as BrokenFileData;\n let sessionChanged;\n // @ts-ignore\n session.onChange = (prop, callback) => {\n if (prop === 'isLoggedIn') {\n sessionChanged = callback;\n }\n };\n const page = await newSpecPage({\n components: [PosDocument],\n html: `<pos-document src=\"https://pod.test/test.pdf\" />`,\n });\n const os = mockPodOS();\n when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValueOnce(unauthorizedFile);\n when(os.fetchFile).calledWith('https://pod.test/test.pdf').mockResolvedValueOnce(file);\n await page.rootInstance.setOs(os);\n expect(sessionChanged).toBeDefined();\n sessionChanged();\n await page.waitForChanges();\n expect(page.root).toEqualHtml(`\n <pos-document src=\"https://pod.test/test.pdf\">\n <mock:shadow-root>\n <iframe src=\"blob:fake-pdf-data\"></iframe>\n </mock:shadow-root>\n </pos-document>\n `);\n });\n});\n\nfunction mockBinaryFile(pngBlob) {\n return {\n blob: () => pngBlob,\n } as BinaryFile;\n}\n"]}
@@ -1,18 +0,0 @@
1
- import { newSpecPage } from "@stencil/core/testing";
2
- import { PosErrorToast } from "../pos-error-toast";
3
- describe('pos-error-toast', () => {
4
- it('renders its children', async () => {
5
- const page = await newSpecPage({
6
- components: [PosErrorToast],
7
- html: `<pos-error-toast></pos-error-toast>`,
8
- });
9
- expect(page.root).toEqualHtml(`
10
- <pos-error-toast>
11
- <mock:shadow-root>
12
- <slot></slot>
13
- </mock:shadow-root>
14
- </pos-error-toast>
15
- `);
16
- });
17
- });
18
- //# sourceMappingURL=pos-error-toast.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pos-error-toast.spec.js","sourceRoot":"","sources":["../../../../../src/components/pos-error-toast/test/pos-error-toast.spec.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;EAC/B,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IACpC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC;MAC7B,UAAU,EAAE,CAAC,aAAa,CAAC;MAC3B,IAAI,EAAE,qCAAqC;KAC5C,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC;;;;;;KAM7B,CAAC,CAAC;EACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { newSpecPage } from '@stencil/core/testing';\n\nimport { PosErrorToast } from '../pos-error-toast';\n\ndescribe('pos-error-toast', () => {\n it('renders its children', async () => {\n const page = await newSpecPage({\n components: [PosErrorToast],\n html: `<pos-error-toast></pos-error-toast>`,\n });\n expect(page.root).toEqualHtml(`\n <pos-error-toast>\n <mock:shadow-root>\n <slot></slot>\n </mock:shadow-root>\n </pos-error-toast>\n `);\n });\n});\n"]}
@@ -1,124 +0,0 @@
1
- import { newSpecPage } from "@stencil/core/testing";
2
- import { Blob } from "buffer";
3
- import { when } from "jest-when";
4
- import { mockPodOS } from "../../test/mockPodOS";
5
- import { PosApp } from "../pos-app/pos-app";
6
- import { PosImage } from "./pos-image";
7
- describe('pos-image', () => {
8
- let pngBlob;
9
- beforeEach(() => {
10
- pngBlob = new Blob(['1'], {
11
- type: 'image/png',
12
- });
13
- });
14
- it('renders img after successfully loading image data', async () => {
15
- const os = mockPodOS();
16
- const file = mockBinaryFile(pngBlob);
17
- jest.spyOn(URL, 'createObjectURL').mockReturnValue('blob:fake-png-data');
18
- const loadingPromise = new Promise(resolve => setTimeout(() => resolve(file), 1));
19
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockReturnValue(loadingPromise);
20
- const page = await newSpecPage({
21
- components: [PosApp, PosImage],
22
- html: `<pos-app>
23
- <pos-image src="https://pod.test/image.png" />
24
- </pos-app>`,
25
- });
26
- await loadingPromise;
27
- await page.waitForChanges();
28
- expect(URL.createObjectURL).toHaveBeenCalledWith(pngBlob);
29
- expect(page.root).toEqualHtml(`
30
- <pos-app>
31
- <pos-image src="https://pod.test/image.png">
32
- <mock:shadow-root>
33
- <img src="blob:fake-png-data" />
34
- </mock:shadow-root>
35
- </pos-image>
36
- </pos-app>
37
- `);
38
- });
39
- it('renders placeholder while loading image data', async () => {
40
- const os = mockPodOS();
41
- const file = mockBinaryFile(pngBlob);
42
- jest.spyOn(URL, 'createObjectURL').mockReturnValue('blob:fake-png-data');
43
- const loadingPromise = new Promise(resolve => setTimeout(() => resolve(file), 1));
44
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockReturnValue(loadingPromise);
45
- const page = await newSpecPage({
46
- components: [PosApp, PosImage],
47
- html: `<pos-app>
48
- <pos-image src="https://pod.test/image.png" />
49
- </pos-app>`,
50
- });
51
- expect(page.root).toEqualHtml(`
52
- <pos-app>
53
- <pos-image src="https://pod.test/image.png">
54
- <mock:shadow-root>
55
- <ion-skeleton-text animated></ion-skeleton-text>
56
- </mock:shadow-root>
57
- </pos-image>
58
- </pos-app>
59
- `);
60
- await loadingPromise;
61
- });
62
- it('renders error when fetching image data failed', async () => {
63
- const os = mockPodOS();
64
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockRejectedValue(new Error('network error'));
65
- const page = await newSpecPage({
66
- components: [PosApp, PosImage],
67
- html: `<pos-app>
68
- <pos-image src="https://pod.test/image.png" />
69
- </pos-app>`,
70
- });
71
- expect(page.root).toEqualHtml(`
72
- <pos-app>
73
- <pos-image src="https://pod.test/image.png">
74
- <mock:shadow-root>
75
- <div class="error">
76
- network error
77
- </div>
78
- </mock:shadow-root>
79
- </pos-image>
80
- </pos-app>
81
- `);
82
- });
83
- it('renders broken image when fetching failed with http error', async () => {
84
- const os = mockPodOS();
85
- const brokenImage = {
86
- blob: () => null,
87
- status: {
88
- code: 403,
89
- },
90
- };
91
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockResolvedValue(brokenImage);
92
- const page = await newSpecPage({
93
- components: [PosApp, PosImage],
94
- html: `<pos-app>
95
- <pos-image src="https://pod.test/image.png" />
96
- </pos-app>`,
97
- });
98
- expect(page.root).toEqualHtml(`
99
- <pos-app>
100
- <pos-image src="https://pod.test/image.png">
101
- <mock:shadow-root>
102
- <div>
103
- <a class="error">
104
- <div>
105
- <ion-icon name="lock-closed-outline"></ion-icon>
106
- </div>
107
- <div class="code">
108
- 403
109
- </div>
110
- <div class="text"></div>
111
- </a>
112
- </div>
113
- </mock:shadow-root>
114
- </pos-image>
115
- </pos-app>
116
- `);
117
- });
118
- });
119
- function mockBinaryFile(pngBlob) {
120
- return {
121
- blob: () => pngBlob,
122
- };
123
- }
124
- //# sourceMappingURL=pos-image.integration.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pos-image.integration.spec.js","sourceRoot":"","sources":["../../../../src/components/pos-image/pos-image.integration.spec.tsx"],"names":[],"mappings":"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","sourcesContent":["import { BinaryFile, BrokenFile } from '@pod-os/core';\nimport { newSpecPage } from '@stencil/core/testing';\nimport { Blob } from 'buffer';\nimport { when } from 'jest-when';\nimport { mockPodOS } from '../../test/mockPodOS';\nimport { PosApp } from '../pos-app/pos-app';\nimport { PosImage } from './pos-image';\n\ndescribe('pos-image', () => {\n let pngBlob;\n beforeEach(() => {\n pngBlob = new Blob(['1'], {\n type: 'image/png',\n });\n });\n\n it('renders img after successfully loading image data', async () => {\n const os = mockPodOS();\n const file = mockBinaryFile(pngBlob);\n jest.spyOn(URL, 'createObjectURL').mockReturnValue('blob:fake-png-data');\n const loadingPromise = new Promise(resolve => setTimeout(() => resolve(file), 1));\n when(os.fetchFile).calledWith('https://pod.test/image.png').mockReturnValue(loadingPromise);\n const page = await newSpecPage({\n components: [PosApp, PosImage],\n html: `<pos-app>\n <pos-image src=\"https://pod.test/image.png\" />\n </pos-app>`,\n });\n await loadingPromise;\n await page.waitForChanges();\n expect(URL.createObjectURL).toHaveBeenCalledWith(pngBlob);\n expect(page.root).toEqualHtml(`\n <pos-app>\n <pos-image src=\"https://pod.test/image.png\">\n <mock:shadow-root>\n <img src=\"blob:fake-png-data\" />\n </mock:shadow-root>\n </pos-image>\n </pos-app>\n `);\n });\n\n it('renders placeholder while loading image data', async () => {\n const os = mockPodOS();\n const file = mockBinaryFile(pngBlob);\n jest.spyOn(URL, 'createObjectURL').mockReturnValue('blob:fake-png-data');\n const loadingPromise = new Promise(resolve => setTimeout(() => resolve(file), 1));\n when(os.fetchFile).calledWith('https://pod.test/image.png').mockReturnValue(loadingPromise);\n const page = await newSpecPage({\n components: [PosApp, PosImage],\n html: `<pos-app>\n <pos-image src=\"https://pod.test/image.png\" />\n </pos-app>`,\n });\n expect(page.root).toEqualHtml(`\n <pos-app>\n <pos-image src=\"https://pod.test/image.png\">\n <mock:shadow-root>\n <ion-skeleton-text animated></ion-skeleton-text>\n </mock:shadow-root>\n </pos-image>\n </pos-app>\n `);\n await loadingPromise;\n });\n\n it('renders error when fetching image data failed', async () => {\n const os = mockPodOS();\n when(os.fetchFile).calledWith('https://pod.test/image.png').mockRejectedValue(new Error('network error'));\n const page = await newSpecPage({\n components: [PosApp, PosImage],\n html: `<pos-app>\n <pos-image src=\"https://pod.test/image.png\" />\n </pos-app>`,\n });\n expect(page.root).toEqualHtml(`\n <pos-app>\n <pos-image src=\"https://pod.test/image.png\">\n <mock:shadow-root>\n <div class=\"error\">\n network error\n </div>\n </mock:shadow-root>\n </pos-image>\n </pos-app>\n `);\n });\n\n it('renders broken image when fetching failed with http error', async () => {\n const os = mockPodOS();\n const brokenImage = {\n blob: () => null,\n status: {\n code: 403,\n },\n } as unknown as BrokenFile;\n when(os.fetchFile).calledWith('https://pod.test/image.png').mockResolvedValue(brokenImage);\n const page = await newSpecPage({\n components: [PosApp, PosImage],\n html: `<pos-app>\n <pos-image src=\"https://pod.test/image.png\" />\n </pos-app>`,\n });\n expect(page.root).toEqualHtml(`\n <pos-app>\n <pos-image src=\"https://pod.test/image.png\">\n <mock:shadow-root>\n <div>\n <a class=\"error\">\n <div>\n <ion-icon name=\"lock-closed-outline\"></ion-icon>\n </div>\n <div class=\"code\">\n 403\n </div>\n <div class=\"text\"></div>\n </a>\n </div>\n </mock:shadow-root>\n </pos-image>\n </pos-app>\n `);\n });\n});\n\nfunction mockBinaryFile(pngBlob) {\n return {\n blob: () => pngBlob,\n } as BinaryFile;\n}\n"]}
@@ -1,219 +0,0 @@
1
- jest.mock('../../store/session');
2
- jest.mock('../broken-file/BrokenFile');
3
- import { newSpecPage } from "@stencil/core/testing";
4
- import { Blob } from "buffer";
5
- import { mockPodOS } from "../../test/mockPodOS";
6
- import { BrokenFile } from "../broken-file/BrokenFile";
7
- import { PosImage } from "./pos-image";
8
- import { when } from "jest-when";
9
- import { h } from "@stencil/core";
10
- import session from "../../store/session";
11
- describe('pos-image', () => {
12
- let pngBlob;
13
- beforeEach(() => {
14
- pngBlob = new Blob(['1'], {
15
- type: 'image/png',
16
- });
17
- });
18
- beforeEach(() => {
19
- jest.spyOn(URL, 'createObjectURL').mockReturnValue('blob:fake-png-data');
20
- });
21
- it('renders loading indicator initially', async () => {
22
- const page = await newSpecPage({
23
- components: [PosImage],
24
- html: `<pos-image src="https://pod.test/image.png" alt="image" />`,
25
- });
26
- expect(page.root).toEqualHtml(`
27
- <pos-image src="https://pod.test/image.png" alt="image">
28
- <mock:shadow-root>
29
- <ion-skeleton-text animated=""></ion-skeleton-text>
30
- </mock:shadow-root>
31
- </pos-image>
32
- `);
33
- });
34
- it('renders loading indicator while fetching', async () => {
35
- const page = await newSpecPage({
36
- components: [PosImage],
37
- html: `<pos-image src="https://pod.test/image.png" alt="image" />`,
38
- });
39
- const os = mockPodOS();
40
- when(os.fetchFile)
41
- .calledWith('https://pod.test/image.png')
42
- .mockReturnValue(new Promise(() => null));
43
- await page.rootInstance.setOs(os);
44
- await page.waitForChanges();
45
- expect(page.root).toEqualHtml(`
46
- <pos-image src="https://pod.test/image.png" alt="image">
47
- <mock:shadow-root>
48
- <ion-skeleton-text animated=""></ion-skeleton-text>
49
- </mock:shadow-root>
50
- </pos-image>
51
- `);
52
- });
53
- it('renders img after loading', async () => {
54
- const file = mockBinaryFile(pngBlob);
55
- const page = await newSpecPage({
56
- components: [PosImage],
57
- html: `<pos-image src="https://pod.test/image.png" alt="image" />`,
58
- });
59
- const os = mockPodOS();
60
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockResolvedValue(file);
61
- await page.rootInstance.setOs(os);
62
- await page.waitForChanges();
63
- expect(URL.createObjectURL).toHaveBeenCalledWith(pngBlob);
64
- expect(page.root).toEqualHtml(`
65
- <pos-image src="https://pod.test/image.png" alt="image">
66
- <mock:shadow-root>
67
- <img src="blob:fake-png-data" alt="image">
68
- </mock:shadow-root>
69
- </pos-image>
70
- `);
71
- });
72
- it('emits event after loading image', async () => {
73
- const onResourceLoaded = jest.fn();
74
- const file = mockBinaryFile(pngBlob);
75
- const page = await newSpecPage({
76
- components: [PosImage],
77
- html: `<pos-image src="https://pod.test/image.png" alt="image" />`,
78
- });
79
- page.root.addEventListener('pod-os:resource-loaded', onResourceLoaded);
80
- const os = mockPodOS();
81
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockResolvedValue(file);
82
- await page.rootInstance.setOs(os);
83
- await page.waitForChanges();
84
- expect(onResourceLoaded).toHaveBeenCalled();
85
- expect(onResourceLoaded.mock.calls[0][0].detail).toEqual('https://pod.test/image.png');
86
- });
87
- it('renders error when fetch failed', async () => {
88
- const page = await newSpecPage({
89
- components: [PosImage],
90
- html: `<pos-image src="https://pod.test/image.png" />`,
91
- });
92
- const os = mockPodOS();
93
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockRejectedValue(new Error('network error'));
94
- await page.rootInstance.setOs(os);
95
- await page.waitForChanges();
96
- expect(page.root).toEqualHtml(`
97
- <pos-image src="https://pod.test/image.png">
98
- <mock:shadow-root>
99
- <div class="error">
100
- network error
101
- </div>
102
- </mock:shadow-root>
103
- </pos-image>
104
- `);
105
- });
106
- it('renders error for inaccessible file', async () => {
107
- const brokenImage = {
108
- blob: () => null,
109
- toString: () => '403 - Forbidden - https://pod.test/image.png',
110
- };
111
- when(BrokenFile).mockReturnValue(h("div", { class: "error" }, "403 - Forbidden - https://pod.test/image.png"));
112
- const page = await newSpecPage({
113
- components: [PosImage],
114
- html: `<pos-image src="https://pod.test/image.png" />`,
115
- });
116
- const os = mockPodOS();
117
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockResolvedValue(brokenImage);
118
- await page.rootInstance.setOs(os);
119
- await page.waitForChanges();
120
- expect(page.root).toEqualHtml(`
121
- <pos-image src="https://pod.test/image.png">
122
- <mock:shadow-root>
123
- <div class="error">
124
- 403 - Forbidden - https://pod.test/image.png
125
- </div>
126
- </mock:shadow-root>
127
- </pos-image>
128
- `);
129
- });
130
- it('updates and loads resource when src changes', async () => {
131
- const file = mockBinaryFile(pngBlob);
132
- const page = await newSpecPage({
133
- components: [PosImage],
134
- html: `<pos-image src="https://pod.test/image.png" />`,
135
- });
136
- const os = mockPodOS();
137
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockResolvedValue(file);
138
- when(os.fetchFile)
139
- .calledWith('https://pod.test/other.png')
140
- .mockReturnValue(new Promise(() => null));
141
- await page.rootInstance.setOs(os);
142
- page.root.setAttribute('src', 'https://pod.test/other.png');
143
- await page.waitForChanges();
144
- expect(page.root).toEqualHtml(`
145
- <pos-image src="https://pod.test/other.png">
146
- <mock:shadow-root>
147
- <ion-skeleton-text animated=""></ion-skeleton-text>
148
- </mock:shadow-root>
149
- </pos-image>
150
- `);
151
- });
152
- it('re-fetches resource when session state changes', async () => {
153
- const file = mockBinaryFile(pngBlob);
154
- let sessionChanged;
155
- // @ts-ignore
156
- session.onChange = (prop, callback) => {
157
- if (prop === 'isLoggedIn') {
158
- sessionChanged = callback;
159
- }
160
- };
161
- const page = await newSpecPage({
162
- components: [PosImage],
163
- html: `<pos-image src="https://pod.test/image.png" />`,
164
- });
165
- const os = mockPodOS();
166
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockResolvedValueOnce(file);
167
- when(os.fetchFile)
168
- .calledWith('https://pod.test/image.png')
169
- .mockReturnValueOnce(new Promise(() => null));
170
- await page.rootInstance.setOs(os);
171
- expect(sessionChanged).toBeDefined();
172
- sessionChanged();
173
- await page.waitForChanges();
174
- expect(page.root).toEqualHtml(`
175
- <pos-image src="https://pod.test/image.png">
176
- <mock:shadow-root>
177
- <ion-skeleton-text animated=""></ion-skeleton-text>
178
- </mock:shadow-root>
179
- </pos-image>
180
- `);
181
- });
182
- it('removes error message after successful loading', async () => {
183
- const file = mockBinaryFile(pngBlob);
184
- const unauthorizedFile = {
185
- toString: () => 'Unauthorized',
186
- };
187
- let sessionChanged;
188
- // @ts-ignore
189
- session.onChange = (prop, callback) => {
190
- if (prop === 'isLoggedIn') {
191
- sessionChanged = callback;
192
- }
193
- };
194
- const page = await newSpecPage({
195
- components: [PosImage],
196
- html: `<pos-image src="https://pod.test/image.png" />`,
197
- });
198
- const os = mockPodOS();
199
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockResolvedValueOnce(unauthorizedFile);
200
- when(os.fetchFile).calledWith('https://pod.test/image.png').mockResolvedValueOnce(file);
201
- await page.rootInstance.setOs(os);
202
- expect(sessionChanged).toBeDefined();
203
- sessionChanged();
204
- await page.waitForChanges();
205
- expect(page.root).toEqualHtml(`
206
- <pos-image src="https://pod.test/image.png">
207
- <mock:shadow-root>
208
- <img src="blob:fake-png-data">
209
- </mock:shadow-root>
210
- </pos-image>
211
- `);
212
- });
213
- });
214
- function mockBinaryFile(pngBlob) {
215
- return {
216
- blob: () => pngBlob,
217
- };
218
- }
219
- //# sourceMappingURL=pos-image.spec.js.map