@@ -3,111 +3,71 @@ import userEvent from "@testing-library/user-event"
3
3
import * as API from "api/api"
4
4
import { UpdateTemplateMeta } from "api/typesGenerated"
5
5
import { Language as FooterFormLanguage } from "components/FormFooter/FormFooter"
6
- import { MockTemplate } from "../../../testHelpers/entities"
7
- import { renderWithAuth } from "../../../testHelpers/renderHelpers"
6
+ import {
7
+ MockEntitlementsWithScheduling ,
8
+ MockTemplate ,
9
+ } from "../../../testHelpers/entities"
10
+ import {
11
+ renderWithTemplateSettingsLayout ,
12
+ waitForLoaderToBeRemoved ,
13
+ } from "../../../testHelpers/renderHelpers"
8
14
import { getValidationSchema } from "./TemplateScheduleForm"
9
15
import TemplateSchedulePage from "./TemplateSchedulePage"
10
16
import i18next from "i18next"
11
17
12
18
const { t } = i18next
13
19
14
20
const validFormValues = {
15
- name : "Name" ,
16
- display_name : "A display name" ,
17
- description : "A description" ,
18
- icon : "vscode.png" ,
19
- // these are the form values which are actually hours
20
21
default_ttl_ms : 1 ,
21
22
max_ttl_ms : 2 ,
22
- allow_user_cancel_workspace_jobs : false ,
23
23
}
24
24
25
25
const renderTemplateSchedulePage = async ( ) => {
26
- renderWithAuth ( < TemplateSchedulePage /> , {
27
- route : `/templates/${ MockTemplate . name } /settings` ,
28
- path : `/templates/:template/settings` ,
29
- extraRoutes : [ { path : "templates/:template" , element : < > </ > } ] ,
26
+ renderWithTemplateSettingsLayout ( < TemplateSchedulePage /> , {
27
+ route : `/templates/${ MockTemplate . name } /settings/schedule` ,
28
+ path : `/templates/:template/settings/schedule` ,
30
29
} )
31
- // Wait the form to be rendered
32
- const label = t ( "nameLabel" , { ns : "TemplateSchedulePage" } )
33
- await screen . findAllByLabelText ( label )
30
+ await waitForLoaderToBeRemoved ( )
34
31
}
35
32
36
33
const fillAndSubmitForm = async ( {
37
- name,
38
- display_name,
39
- description,
40
34
default_ttl_ms,
41
35
max_ttl_ms,
42
- icon,
43
- allow_user_cancel_workspace_jobs,
44
- } : Required < UpdateTemplateMeta > ) => {
45
- const label = t ( "nameLabel" , { ns : "TemplateSchedulePage" } )
46
- const nameField = await screen . findByLabelText ( label )
47
- await userEvent . clear ( nameField )
48
- await userEvent . type ( nameField , name )
49
-
50
- const displayNameLabel = t ( "displayNameLabel" , { ns : "TemplateSchedulePage" } )
51
-
52
- const displayNameField = await screen . findByLabelText ( displayNameLabel )
53
- await userEvent . clear ( displayNameField )
54
- await userEvent . type ( displayNameField , display_name )
55
-
56
- const descriptionLabel = t ( "descriptionLabel" , { ns : "TemplateSchedulePage" } )
57
- const descriptionField = await screen . findByLabelText ( descriptionLabel )
58
- await userEvent . clear ( descriptionField )
59
- await userEvent . type ( descriptionField , description )
60
-
61
- const iconLabel = t ( "iconLabel" , { ns : "TemplateSchedulePage" } )
62
- const iconField = await screen . findByLabelText ( iconLabel )
63
- await userEvent . clear ( iconField )
64
- await userEvent . type ( iconField , icon )
65
-
66
- const defaultTtlLabel = t ( "defaultTtlLabel" , { ns : "TemplateSchedulePage" } )
36
+ } : {
37
+ default_ttl_ms : number
38
+ max_ttl_ms : number
39
+ } ) => {
40
+ const user = userEvent . setup ( )
41
+ const defaultTtlLabel = t ( "defaultTtlLabel" , { ns : "templateSettingsPage" } )
67
42
const defaultTtlField = await screen . findByLabelText ( defaultTtlLabel )
68
- await userEvent . clear ( defaultTtlField )
69
- await userEvent . type ( defaultTtlField , default_ttl_ms . toString ( ) )
70
-
71
- const entitlements = await API . getEntitlements ( )
72
- if ( entitlements . features [ "advanced_template_scheduling" ] . enabled ) {
73
- const maxTtlLabel = t ( "maxTtlLabel" , { ns : "TemplateSchedulePage" } )
74
- const maxTtlField = await screen . findByLabelText ( maxTtlLabel )
75
- await userEvent . clear ( maxTtlField )
76
- await userEvent . type ( maxTtlField , max_ttl_ms . toString ( ) )
77
- }
43
+ await user . clear ( defaultTtlField )
44
+ await user . type ( defaultTtlField , default_ttl_ms . toString ( ) )
78
45
79
- const allowCancelJobsField = screen . getByRole ( "checkbox" )
80
- // checkbox is checked by default, so it must be clicked to get unchecked
81
- if ( ! allow_user_cancel_workspace_jobs ) {
82
- await userEvent . click ( allowCancelJobsField )
83
- }
46
+ const maxTtlLabel = t ( "maxTtlLabel" , { ns : "templateSettingsPage" } )
47
+ const maxTtlField = await screen . findByLabelText ( maxTtlLabel )
48
+ await user . clear ( maxTtlField )
49
+ await user . type ( maxTtlField , max_ttl_ms . toString ( ) )
84
50
85
51
const submitButton = await screen . findByText (
86
52
FooterFormLanguage . defaultSubmitLabel ,
87
53
)
88
- await userEvent . click ( submitButton )
54
+ await user . click ( submitButton )
89
55
}
90
56
91
57
describe ( "TemplateSchedulePage" , ( ) => {
92
- it ( "renders" , async ( ) => {
93
- const { t } = i18next
94
- const pageTitle = t ( "title" , {
95
- ns : "TemplateSchedulePage" ,
96
- } )
97
- await renderTemplateSchedulePage ( )
98
- const element = await screen . findByText ( pageTitle )
99
- expect ( element ) . toBeDefined ( )
58
+ beforeEach ( ( ) => {
59
+ jest
60
+ . spyOn ( API , "getEntitlements" )
61
+ . mockResolvedValue ( MockEntitlementsWithScheduling )
100
62
} )
101
63
102
64
it ( "succeeds" , async ( ) => {
103
65
await renderTemplateSchedulePage ( )
104
-
105
66
jest . spyOn ( API , "updateTemplateMeta" ) . mockResolvedValueOnce ( {
106
67
...MockTemplate ,
107
68
...validFormValues ,
108
69
} )
109
70
await fillAndSubmitForm ( validFormValues )
110
-
111
71
await waitFor ( ( ) => expect ( API . updateTemplateMeta ) . toBeCalledTimes ( 1 ) )
112
72
} )
113
73
@@ -125,11 +85,8 @@ describe("TemplateSchedulePage", () => {
125
85
expect ( API . updateTemplateMeta ) . toBeCalledWith (
126
86
"test-template" ,
127
87
expect . objectContaining ( {
128
- ...validFormValues ,
129
- // convert from the display value (hours) to ms
130
88
default_ttl_ms : validFormValues . default_ttl_ms * 3600000 ,
131
- // this value is undefined if not entitled
132
- max_ttl_ms : undefined ,
89
+ max_ttl_ms : validFormValues . max_ttl_ms * 3600000 ,
133
90
} ) ,
134
91
) ,
135
92
)
@@ -160,29 +117,7 @@ describe("TemplateSchedulePage", () => {
160
117
}
161
118
const validate = ( ) => getValidationSchema ( ) . validateSync ( values )
162
119
expect ( validate ) . toThrowError (
163
- t ( "defaultTTLMaxError" , { ns : "TemplateSchedulePage" } ) ,
164
- )
165
- } )
166
-
167
- it ( "allows a description of 128 chars" , ( ) => {
168
- const values : UpdateTemplateMeta = {
169
- ...validFormValues ,
170
- description :
171
- "Nam quis nulla. Integer malesuada. In in enim a arcu imperdiet malesuada. Sed vel lectus. Donec odio urna, tempus molestie, port" ,
172
- }
173
- const validate = ( ) => getValidationSchema ( ) . validateSync ( values )
174
- expect ( validate ) . not . toThrowError ( )
175
- } )
176
-
177
- it ( "disallows a description of 128 + 1 chars" , ( ) => {
178
- const values : UpdateTemplateMeta = {
179
- ...validFormValues ,
180
- description :
181
- "Nam quis nulla. Integer malesuada. In in enim a arcu imperdiet malesuada. Sed vel lectus. Donec odio urna, tempus molestie, port a" ,
182
- }
183
- const validate = ( ) => getValidationSchema ( ) . validateSync ( values )
184
- expect ( validate ) . toThrowError (
185
- t ( "descriptionMaxError" , { ns : "TemplateSchedulePage" } ) ,
120
+ t ( "defaultTTLMaxError" , { ns : "templateSettingsPage" } ) ,
186
121
)
187
122
} )
188
123
} )
0 commit comments