@@ -10,7 +10,7 @@ import { test } from '@playwright/test'
1010import { expect , expectRowVisible , stopInstance } from './utils'
1111
1212test ( 'can create a NIC with a specified IP address' , async ( { page } ) => {
13- // go to an instance’ s Network Interfaces page
13+ // go to an instance' s Network Interfaces page
1414 await page . goto ( '/projects/mock-project/instances/db1/networking' )
1515
1616 await stopInstance ( page )
@@ -24,7 +24,10 @@ test('can create a NIC with a specified IP address', async ({ page }) => {
2424 await page . getByRole ( 'option' , { name : 'mock-vpc' } ) . click ( )
2525 await page . getByRole ( 'button' , { name : 'Subnet' } ) . click ( )
2626 await page . getByRole ( 'option' , { name : 'mock-subnet' } ) . click ( )
27- await page . getByLabel ( 'IP Address' ) . fill ( '1.2.3.4' )
27+
28+ // Select IPv4 only
29+ await page . getByRole ( 'radio' , { name : 'IPv4' , exact : true } ) . click ( )
30+ await page . getByLabel ( 'IPv4 Address' ) . fill ( '1.2.3.4' )
2831
2932 const sidebar = page . getByRole ( 'dialog' , { name : 'Add network interface' } )
3033
@@ -37,7 +40,7 @@ test('can create a NIC with a specified IP address', async ({ page }) => {
3740} )
3841
3942test ( 'can create a NIC with a blank IP address' , async ( { page } ) => {
40- // go to an instance’ s Network Interfaces page
43+ // go to an instance' s Network Interfaces page
4144 await page . goto ( '/projects/mock-project/instances/db1/networking' )
4245
4346 await stopInstance ( page )
@@ -52,8 +55,9 @@ test('can create a NIC with a blank IP address', async ({ page }) => {
5255 await page . getByRole ( 'button' , { name : 'Subnet' } ) . click ( )
5356 await page . getByRole ( 'option' , { name : 'mock-subnet' } ) . click ( )
5457
55- // make sure the IP address field has a non-conforming bit of text in it
56- await page . getByLabel ( 'IP Address' ) . fill ( 'x' )
58+ // Dual-stack is selected by default, so both fields should be visible
59+ // make sure the IPv4 address field has a non-conforming bit of text in it
60+ await page . getByLabel ( 'IPv4 Address' ) . fill ( 'x' )
5761
5862 // try to submit it
5963 const sidebar = page . getByRole ( 'dialog' , { name : 'Add network interface' } )
@@ -62,8 +66,9 @@ test('can create a NIC with a blank IP address', async ({ page }) => {
6266 // it should error out
6367 await expect ( sidebar . getByText ( 'Zod error for body' ) ) . toBeVisible ( )
6468
65- // make sure the IP address field has spaces in it
66- await page . getByLabel ( 'IP Address' ) . fill ( ' ' )
69+ // make sure both IP address fields have spaces in them
70+ await page . getByLabel ( 'IPv4 Address' ) . fill ( ' ' )
71+ await page . getByLabel ( 'IPv6 Address' ) . fill ( ' ' )
6772
6873 // test that the form can be submitted and a new network interface is created
6974 await sidebar . getByRole ( 'button' , { name : 'Add network interface' } ) . click ( )
@@ -73,3 +78,53 @@ test('can create a NIC with a blank IP address', async ({ page }) => {
7378 const table = page . getByRole ( 'table' , { name : 'Network interfaces' } )
7479 await expectRowVisible ( table , { name : 'nic-2' , 'Private IP' : '123.45.68.8fd12:3456::' } )
7580} )
81+
82+ test ( 'can create a NIC with IPv6 only' , async ( { page } ) => {
83+ await page . goto ( '/projects/mock-project/instances/db1/networking' )
84+
85+ await stopInstance ( page )
86+
87+ await page . getByRole ( 'button' , { name : 'Add network interface' } ) . click ( )
88+
89+ await page . getByLabel ( 'Name' ) . fill ( 'nic-3' )
90+ await page . getByLabel ( 'VPC' , { exact : true } ) . click ( )
91+ await page . getByRole ( 'option' , { name : 'mock-vpc' } ) . click ( )
92+ await page . getByRole ( 'button' , { name : 'Subnet' } ) . click ( )
93+ await page . getByRole ( 'option' , { name : 'mock-subnet' } ) . click ( )
94+
95+ // Select IPv6 only
96+ await page . getByRole ( 'radio' , { name : 'IPv6' , exact : true } ) . click ( )
97+ await page . getByLabel ( 'IPv6 Address' ) . fill ( '::1' )
98+
99+ const sidebar = page . getByRole ( 'dialog' , { name : 'Add network interface' } )
100+ await sidebar . getByRole ( 'button' , { name : 'Add network interface' } ) . click ( )
101+ await expect ( sidebar ) . toBeHidden ( )
102+
103+ const table = page . getByRole ( 'table' , { name : 'Network interfaces' } )
104+ await expectRowVisible ( table , { name : 'nic-3' , 'Private IP' : '::1' } )
105+ } )
106+
107+ test ( 'can create a NIC with dual-stack and explicit IPs' , async ( { page } ) => {
108+ await page . goto ( '/projects/mock-project/instances/db1/networking' )
109+
110+ await stopInstance ( page )
111+
112+ await page . getByRole ( 'button' , { name : 'Add network interface' } ) . click ( )
113+
114+ await page . getByLabel ( 'Name' ) . fill ( 'nic-4' )
115+ await page . getByLabel ( 'VPC' , { exact : true } ) . click ( )
116+ await page . getByRole ( 'option' , { name : 'mock-vpc' } ) . click ( )
117+ await page . getByRole ( 'button' , { name : 'Subnet' } ) . click ( )
118+ await page . getByRole ( 'option' , { name : 'mock-subnet' } ) . click ( )
119+
120+ // Dual-stack is selected by default
121+ await page . getByLabel ( 'IPv4 Address' ) . fill ( '10.0.0.5' )
122+ await page . getByLabel ( 'IPv6 Address' ) . fill ( 'fd00::5' )
123+
124+ const sidebar = page . getByRole ( 'dialog' , { name : 'Add network interface' } )
125+ await sidebar . getByRole ( 'button' , { name : 'Add network interface' } ) . click ( )
126+ await expect ( sidebar ) . toBeHidden ( )
127+
128+ const table = page . getByRole ( 'table' , { name : 'Network interfaces' } )
129+ await expectRowVisible ( table , { name : 'nic-4' , 'Private IP' : '10.0.0.5fd00::5' } )
130+ } )
0 commit comments