1+ import { linodeInterfaceFactoryPublic } from '@linode/utilities' ;
12import userEvent from '@testing-library/user-event' ;
23import React from 'react' ;
34
@@ -11,39 +12,60 @@ import { AddInterfaceForm } from './AddInterfaceForm';
1112const props = { linodeId : 0 , onClose : vi . fn ( ) , regionId : '' } ;
1213
1314describe ( 'AddInterfaceForm' , ( ) => {
14- it ( 'renders radios for the interface types (Public, VPC, VLAN)' , ( ) => {
15- const { getByRole } = renderWithTheme ( < AddInterfaceForm { ...props } /> ) ;
15+ beforeEach ( ( ) => {
16+ server . use (
17+ http . get ( '*/linode/instances/:linodeId/interfaces' , ( ) => {
18+ return HttpResponse . json ( {
19+ interfaces : [ ] ,
20+ } ) ;
21+ } )
22+ ) ;
23+ } ) ;
24+
25+ it ( 'renders radios for the interface types (Public, VPC, VLAN)' , async ( ) => {
26+ const { getByRole, findByRole } = renderWithTheme (
27+ < AddInterfaceForm { ...props } />
28+ ) ;
29+
30+ // Wait for the loading to complete and form to render
31+ await findByRole ( 'radio' , { name : 'VPC' } ) ;
1632
1733 expect ( getByRole ( 'radio' , { name : 'VPC' } ) ) . toBeInTheDocument ( ) ;
1834 expect ( getByRole ( 'radio' , { name : 'Public' } ) ) . toBeInTheDocument ( ) ;
1935 expect ( getByRole ( 'radio' , { name : 'VLAN' } ) ) . toBeInTheDocument ( ) ;
2036 } ) ;
2137
2238 it ( 'renders a Firewall select if "VPC" is selected' , async ( ) => {
23- const { getByRole, getByLabelText } = renderWithTheme (
39+ const { getByRole, getByLabelText, findByRole } = renderWithTheme (
2440 < AddInterfaceForm { ...props } />
2541 ) ;
2642
43+ // Wait for the loading to complete and form to render
44+ await findByRole ( 'radio' , { name : 'VPC' } ) ;
2745 await userEvent . click ( getByRole ( 'radio' , { name : 'VPC' } ) ) ;
2846
2947 expect ( getByLabelText ( 'Firewall' ) ) . toBeVisible ( ) ;
3048 } ) ;
3149
3250 it ( 'renders a Firewall select if "Public" is selected' , async ( ) => {
33- const { getByRole, getByLabelText } = renderWithTheme (
51+ const { getByRole, getByLabelText, findByRole } = renderWithTheme (
3452 < AddInterfaceForm { ...props } />
3553 ) ;
3654
55+ // Wait for the loading to complete and form to render
56+ await findByRole ( 'radio' , { name : 'Public' } ) ;
3757 await userEvent . click ( getByRole ( 'radio' , { name : 'Public' } ) ) ;
3858
3959 expect ( getByLabelText ( 'Firewall' ) ) . toBeVisible ( ) ;
4060 } ) ;
4161
4262 it ( 'renders does not render a Firewall select if "VLAN" is selected' , async ( ) => {
43- const { getByRole, queryByLabelText } = renderWithTheme (
63+ const { getByRole, queryByLabelText, findByRole } = renderWithTheme (
4464 < AddInterfaceForm { ...props } />
4565 ) ;
4666
67+ // Wait for the loading to complete and form to render
68+ await findByRole ( 'radio' , { name : 'VLAN' } ) ;
4769 await userEvent . click ( getByRole ( 'radio' , { name : 'VLAN' } ) ) ;
4870
4971 expect ( queryByLabelText ( 'Firewall' ) ) . toBeNull ( ) ;
@@ -67,12 +89,58 @@ describe('AddInterfaceForm', () => {
6789 } )
6890 ) ;
6991
70- const { getByRole, findByDisplayValue } = renderWithTheme (
92+ const { getByRole, findByDisplayValue, findByRole } = renderWithTheme (
7193 < AddInterfaceForm { ...props } />
7294 ) ;
7395
96+ // Wait for the loading to complete and form to render
97+ await findByRole ( 'radio' , { name : 'VPC' } ) ;
7498 await userEvent . click ( getByRole ( 'radio' , { name : 'VPC' } ) ) ;
7599
76100 await findByDisplayValue ( firewall . label ) ;
77101 } ) ;
102+
103+ it ( 'should show a warning notice on selection of VPC option if a Public interface already exists' , async ( ) => {
104+ const mockPublicInterface = linodeInterfaceFactoryPublic . build ( ) ;
105+
106+ server . use (
107+ http . get ( '*/linode/instances/:linodeId/interfaces' , ( ) => {
108+ return HttpResponse . json ( {
109+ interfaces : [ mockPublicInterface ] ,
110+ } ) ;
111+ } )
112+ ) ;
113+
114+ const { getByRole, findByRole, getByText } = renderWithTheme (
115+ < AddInterfaceForm { ...props } />
116+ ) ;
117+
118+ // Wait for the loading to complete and form to render
119+ await findByRole ( 'radio' , { name : 'VPC' } ) ;
120+ await userEvent . click ( getByRole ( 'radio' , { name : 'VPC' } ) ) ;
121+ expect (
122+ getByText ( / T h i s L i n o d e a l r e a d y h a s a p u b l i c i n t e r f a c e / )
123+ ) . toBeVisible ( ) ;
124+ } ) ;
125+
126+ it ( 'should disable Public interface radio button if a Public interface already exists' , async ( ) => {
127+ const mockPublicInterface = linodeInterfaceFactoryPublic . build ( ) ;
128+
129+ server . use (
130+ http . get ( '*/linode/instances/:linodeId/interfaces' , ( ) => {
131+ return HttpResponse . json ( {
132+ interfaces : [ mockPublicInterface ] ,
133+ } ) ;
134+ } )
135+ ) ;
136+
137+ const { getByRole, findByRole } = renderWithTheme (
138+ < AddInterfaceForm { ...props } />
139+ ) ;
140+
141+ // Wait for the loading to complete and form to render
142+ await findByRole ( 'radio' , { name : 'Public' } ) ;
143+
144+ expect ( getByRole ( 'radio' , { name : 'Public' } ) ) . toBeDisabled ( ) ;
145+ } ) ;
78146} ) ;
0 commit comments