44import React from 'react' ;
55import { render } from '@testing-library/react' ;
66import { getComponentsTree } from '../utils' ;
7- import { METADATA_ATTRIBUTE , activateAnalyticsMetadata } from '../attributes' ;
7+ import { METADATA_ATTRIBUTE , activateAnalyticsMetadata , getAnalyticsMetadataAttribute } from '../attributes' ;
88import { ComponentOne , ComponentTwo , ComponentThree } from './components' ;
99
1010describe ( 'getComponentsTree' , ( ) => {
@@ -55,8 +55,11 @@ describe('getComponentsTree', () => {
5555 {
5656 name : 'ComponentThree' ,
5757 children : [
58- { name : 'ComponentTwo' , label : 'sub label' } ,
59- { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ,
58+ {
59+ name : 'ComponentTwo' ,
60+ label : 'sub label' ,
61+ children : [ { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ] ,
62+ } ,
6063 ] ,
6164 } ,
6265 { name : 'ComponentTwo' , label : 'sub label' } ,
@@ -66,23 +69,20 @@ describe('getComponentsTree', () => {
6669 const { container } = render (
6770 < div id = "outer-target-1" >
6871 < ComponentThree >
69- < ComponentThree />
72+ < ComponentTwo />
7073 </ ComponentThree >
7174 </ div >
7275 ) ;
7376 expect ( getComponentsTree ( container . querySelector ( '#outer-target-1' ) as HTMLElement ) ) . toEqual ( [
7477 {
7578 name : 'ComponentThree' ,
7679 children : [
77- { name : 'ComponentTwo' , label : 'sub label' } ,
78- { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ,
7980 {
80- name : 'ComponentThree' ,
81- children : [
82- { name : 'ComponentTwo' , label : 'sub label' } ,
83- { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ,
84- ] ,
81+ name : 'ComponentTwo' ,
82+ label : 'sub label' ,
83+ children : [ { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ] ,
8584 } ,
85+ { name : 'ComponentTwo' , label : 'sub label' } ,
8686 ] ,
8787 } ,
8888 ] ) ;
@@ -98,8 +98,11 @@ describe('getComponentsTree', () => {
9898 {
9999 name : 'ComponentThree' ,
100100 children : [
101- { name : 'ComponentTwo' , label : 'sub label' } ,
102- { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ,
101+ {
102+ name : 'ComponentTwo' ,
103+ label : 'sub label' ,
104+ children : [ { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ] ,
105+ } ,
103106 ] ,
104107 } ,
105108 { name : 'ComponentTwo' , label : 'sub label' } ,
@@ -116,6 +119,83 @@ describe('getComponentsTree', () => {
116119 { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ,
117120 ] ) ;
118121 } ) ;
122+ describe ( 'with portals' , ( ) => {
123+ test ( 'returns an empty array when portal outside of the node element' , ( ) => {
124+ const { container } = render (
125+ < div id = "outer-target" >
126+ < div id = "id:portal-1" > </ div >
127+ < div data-awsui-referrer-id = "id:portal-1" >
128+ < ComponentOne />
129+ </ div >
130+ < div id = "inner-target" > </ div >
131+ </ div >
132+ ) ;
133+ const target = container . querySelector ( '#inner-target' ) as HTMLElement ;
134+ expect ( getComponentsTree ( target ) ) . toEqual ( [ ] ) ;
135+ } ) ;
136+ test ( 'returns nested portal correctly' , ( ) => {
137+ const { container } = render (
138+ < div id = "outer-target" >
139+ < div data-awsui-referrer-id = "id:portal-1" >
140+ < ComponentOne />
141+ </ div >
142+ < div id = "inner-target" >
143+ < div { ...getAnalyticsMetadataAttribute ( { component : { name : 'ComponentFour' } } ) } >
144+ < ComponentTwo />
145+ < div id = "id:portal-1" > </ div >
146+ </ div >
147+ </ div >
148+ </ div >
149+ ) ;
150+ expect ( getComponentsTree ( container . querySelector ( '#outer-target' ) as HTMLElement ) ) . toEqual ( [
151+ {
152+ name : 'ComponentFour' ,
153+ children : [
154+ { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ,
155+ { name : 'ComponentTwo' , label : 'sub label' } ,
156+ ] ,
157+ } ,
158+ ] ) ;
159+ expect ( getComponentsTree ( container . querySelector ( '#inner-target' ) as HTMLElement ) ) . toEqual ( [
160+ {
161+ name : 'ComponentFour' ,
162+ children : [
163+ { name : 'ComponentTwo' , label : 'sub label' } ,
164+ { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ,
165+ ] ,
166+ } ,
167+ ] ) ;
168+ } ) ;
169+ test ( 'returns recursively nested portals' , ( ) => {
170+ const { container } = render (
171+ < div id = "outer-target" >
172+ < div data-awsui-referrer-id = "id:portal-1" >
173+ < ComponentOne />
174+ < div id = "id:portal-2" > </ div >
175+ </ div >
176+ < div data-awsui-referrer-id = "id:portal-2" >
177+ < div { ...getAnalyticsMetadataAttribute ( { component : { name : 'ComponentFive' } } ) } />
178+ </ div >
179+ < div id = "inner-target" >
180+ < div { ...getAnalyticsMetadataAttribute ( { component : { name : 'ComponentFour' } } ) } >
181+ < ComponentTwo />
182+ < div id = "id:portal-1" > </ div >
183+ </ div >
184+ </ div >
185+ </ div >
186+ ) ;
187+ expect ( getComponentsTree ( container . querySelector ( '#inner-target' ) as HTMLElement ) ) . toEqual ( [
188+ {
189+ name : 'ComponentFour' ,
190+ children : [
191+ { name : 'ComponentTwo' , label : 'sub label' } ,
192+ { name : 'ComponentOne' , label : 'component label' , properties : { multi : 'true' } } ,
193+ { name : 'ComponentFive' } ,
194+ ] ,
195+ } ,
196+ ] ) ;
197+ } ) ;
198+ } ) ;
119199 } ) ;
120200
121201 describe ( 'with inactive analytics metadata' , ( ) => {
0 commit comments