1
1
package coderd_test
2
2
3
3
import (
4
+ "net/http"
4
5
"testing"
5
6
"time"
6
7
@@ -17,112 +18,200 @@ import (
17
18
func TestUserQuietHours (t * testing.T ) {
18
19
t .Parallel ()
19
20
20
- defaultQuietHoursSchedule := "CRON_TZ=America/Chicago 0 0 * * *"
21
- defaultScheduleParsed , err := schedule .Daily (defaultQuietHoursSchedule )
22
- require .NoError (t , err )
23
- nextTime := defaultScheduleParsed .Next (time .Now ().In (defaultScheduleParsed .Location ()))
24
- if time .Until (nextTime ) < time .Hour {
25
- // Use a different default schedule instead, because we want to avoid
26
- // the schedule "ticking over" during this test run.
27
- defaultQuietHoursSchedule = "CRON_TZ=America/Chicago 0 12 * * *"
28
- defaultScheduleParsed , err = schedule .Daily (defaultQuietHoursSchedule )
21
+ t .Run ("OK" , func (t * testing.T ) {
22
+ t .Parallel ()
23
+
24
+ defaultQuietHoursSchedule := "CRON_TZ=America/Chicago 0 0 * * *"
25
+ defaultScheduleParsed , err := schedule .Daily (defaultQuietHoursSchedule )
29
26
require .NoError (t , err )
30
- }
31
-
32
- dv := coderdtest .DeploymentValues (t )
33
- dv .UserQuietHoursSchedule .DefaultSchedule .Set (defaultQuietHoursSchedule )
34
- dv .UserQuietHoursSchedule .WindowDuration .Set ("8h" ) // default is 4h
35
-
36
- client , user := coderdenttest .New (t , & coderdenttest.Options {
37
- Options : & coderdtest.Options {
38
- DeploymentValues : dv ,
39
- },
40
- LicenseOptions : & coderdenttest.LicenseOptions {
41
- Features : license.Features {
42
- codersdk .FeatureAdvancedTemplateScheduling : 1 ,
43
- codersdk .FeatureTemplateRestartRequirement : 1 ,
27
+ nextTime := defaultScheduleParsed .Next (time .Now ().In (defaultScheduleParsed .Location ()))
28
+ if time .Until (nextTime ) < time .Hour {
29
+ // Use a different default schedule instead, because we want to avoid
30
+ // the schedule "ticking over" during this test run.
31
+ defaultQuietHoursSchedule = "CRON_TZ=America/Chicago 0 12 * * *"
32
+ defaultScheduleParsed , err = schedule .Daily (defaultQuietHoursSchedule )
33
+ require .NoError (t , err )
34
+ }
35
+
36
+ dv := coderdtest .DeploymentValues (t )
37
+ dv .UserQuietHoursSchedule .DefaultSchedule .Set (defaultQuietHoursSchedule )
38
+ dv .UserQuietHoursSchedule .WindowDuration .Set ("8h" ) // default is 4h
39
+ dv .Experiments .Set (string (codersdk .ExperimentTemplateRestartRequirement ))
40
+
41
+ client , user := coderdenttest .New (t , & coderdenttest.Options {
42
+ Options : & coderdtest.Options {
43
+ DeploymentValues : dv ,
44
44
},
45
- },
46
- })
45
+ LicenseOptions : & coderdenttest.LicenseOptions {
46
+ Features : license.Features {
47
+ codersdk .FeatureAdvancedTemplateScheduling : 1 ,
48
+ codersdk .FeatureTemplateRestartRequirement : 1 ,
49
+ },
50
+ },
51
+ })
47
52
48
- // Get quiet hours for a user that doesn't have them set.
49
- ctx := testutil .Context (t , testutil .WaitLong )
50
- sched1 , err := client .UserQuietHoursSchedule (ctx , codersdk .Me )
51
- require .NoError (t , err )
52
- require .Equal (t , defaultScheduleParsed .String (), sched1 .RawSchedule )
53
- require .False (t , sched1 .UserSet )
54
- require .Equal (t , defaultScheduleParsed .Time (), sched1 .Time )
55
- require .Equal (t , defaultScheduleParsed .Location ().String (), sched1 .Timezone )
56
- require .Equal (t , dv .UserQuietHoursSchedule .WindowDuration .Value (), sched1 .Duration )
57
- require .WithinDuration (t , defaultScheduleParsed .Next (time .Now ()), sched1 .Next , 15 * time .Second )
58
-
59
- // Set their quiet hours.
60
- customQuietHoursSchedule := "CRON_TZ=Australia/Sydney 0 0 * * *"
61
- customScheduleParsed , err := schedule .Daily (customQuietHoursSchedule )
62
- require .NoError (t , err )
63
- nextTime = customScheduleParsed .Next (time .Now ().In (customScheduleParsed .Location ()))
64
- if time .Until (nextTime ) < time .Hour {
65
- // Use a different default schedule instead, because we want to avoid
66
- // the schedule "ticking over" during this test run.
67
- customQuietHoursSchedule = "CRON_TZ=Australia/Sydney 0 12 * * *"
68
- customScheduleParsed , err = schedule .Daily (customQuietHoursSchedule )
53
+ // Get quiet hours for a user that doesn't have them set.
54
+ ctx := testutil .Context (t , testutil .WaitLong )
55
+ sched1 , err := client .UserQuietHoursSchedule (ctx , codersdk .Me )
69
56
require .NoError (t , err )
70
- }
71
-
72
- sched2 , err := client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
73
- Schedule : customQuietHoursSchedule ,
74
- })
75
- require .NoError (t , err )
76
- require .Equal (t , customScheduleParsed .String (), sched2 .RawSchedule )
77
- require .True (t , sched2 .UserSet )
78
- require .Equal (t , customScheduleParsed .Time (), sched2 .Time )
79
- require .Equal (t , customScheduleParsed .Location ().String (), sched2 .Timezone )
80
- require .Equal (t , dv .UserQuietHoursSchedule .WindowDuration .Value (), sched2 .Duration )
81
- require .WithinDuration (t , customScheduleParsed .Next (time .Now ()), sched2 .Next , 15 * time .Second )
82
-
83
- // Get quiet hours for a user that has them set.
84
- sched3 , err := client .UserQuietHoursSchedule (ctx , user .UserID .String ())
85
- require .NoError (t , err )
86
- require .Equal (t , customScheduleParsed .String (), sched3 .RawSchedule )
87
- require .True (t , sched3 .UserSet )
88
- require .Equal (t , customScheduleParsed .Time (), sched3 .Time )
89
- require .Equal (t , customScheduleParsed .Location ().String (), sched3 .Timezone )
90
- require .Equal (t , dv .UserQuietHoursSchedule .WindowDuration .Value (), sched3 .Duration )
91
- require .WithinDuration (t , customScheduleParsed .Next (time .Now ()), sched3 .Next , 15 * time .Second )
92
-
93
- // Try setting a garbage schedule.
94
- _ , err = client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
95
- Schedule : "garbage" ,
57
+ require .Equal (t , defaultScheduleParsed .String (), sched1 .RawSchedule )
58
+ require .False (t , sched1 .UserSet )
59
+ require .Equal (t , defaultScheduleParsed .Time (), sched1 .Time )
60
+ require .Equal (t , defaultScheduleParsed .Location ().String (), sched1 .Timezone )
61
+ require .Equal (t , dv .UserQuietHoursSchedule .WindowDuration .Value (), sched1 .Duration )
62
+ require .WithinDuration (t , defaultScheduleParsed .Next (time .Now ()), sched1 .Next , 15 * time .Second )
63
+
64
+ // Set their quiet hours.
65
+ customQuietHoursSchedule := "CRON_TZ=Australia/Sydney 0 0 * * *"
66
+ customScheduleParsed , err := schedule .Daily (customQuietHoursSchedule )
67
+ require .NoError (t , err )
68
+ nextTime = customScheduleParsed .Next (time .Now ().In (customScheduleParsed .Location ()))
69
+ if time .Until (nextTime ) < time .Hour {
70
+ // Use a different default schedule instead, because we want to avoid
71
+ // the schedule "ticking over" during this test run.
72
+ customQuietHoursSchedule = "CRON_TZ=Australia/Sydney 0 12 * * *"
73
+ customScheduleParsed , err = schedule .Daily (customQuietHoursSchedule )
74
+ require .NoError (t , err )
75
+ }
76
+
77
+ sched2 , err := client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
78
+ Schedule : customQuietHoursSchedule ,
79
+ })
80
+ require .NoError (t , err )
81
+ require .Equal (t , customScheduleParsed .String (), sched2 .RawSchedule )
82
+ require .True (t , sched2 .UserSet )
83
+ require .Equal (t , customScheduleParsed .Time (), sched2 .Time )
84
+ require .Equal (t , customScheduleParsed .Location ().String (), sched2 .Timezone )
85
+ require .Equal (t , dv .UserQuietHoursSchedule .WindowDuration .Value (), sched2 .Duration )
86
+ require .WithinDuration (t , customScheduleParsed .Next (time .Now ()), sched2 .Next , 15 * time .Second )
87
+
88
+ // Get quiet hours for a user that has them set.
89
+ sched3 , err := client .UserQuietHoursSchedule (ctx , user .UserID .String ())
90
+ require .NoError (t , err )
91
+ require .Equal (t , customScheduleParsed .String (), sched3 .RawSchedule )
92
+ require .True (t , sched3 .UserSet )
93
+ require .Equal (t , customScheduleParsed .Time (), sched3 .Time )
94
+ require .Equal (t , customScheduleParsed .Location ().String (), sched3 .Timezone )
95
+ require .Equal (t , dv .UserQuietHoursSchedule .WindowDuration .Value (), sched3 .Duration )
96
+ require .WithinDuration (t , customScheduleParsed .Next (time .Now ()), sched3 .Next , 15 * time .Second )
97
+
98
+ // Try setting a garbage schedule.
99
+ _ , err = client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
100
+ Schedule : "garbage" ,
101
+ })
102
+ require .Error (t , err )
103
+ require .ErrorContains (t , err , "parse daily schedule" )
104
+
105
+ // Try setting a non-daily schedule.
106
+ _ , err = client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
107
+ Schedule : "CRON_TZ=America/Chicago 0 0 * * 1" ,
108
+ })
109
+ require .Error (t , err )
110
+ require .ErrorContains (t , err , "parse daily schedule" )
111
+
112
+ // Try setting a schedule with a timezone that doesn't exist.
113
+ _ , err = client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
114
+ Schedule : "CRON_TZ=Deans/House 0 0 * * *" ,
115
+ })
116
+ require .Error (t , err )
117
+ require .ErrorContains (t , err , "parse daily schedule" )
118
+
119
+ // Try setting a schedule with more than one time.
120
+ _ , err = client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
121
+ Schedule : "CRON_TZ=America/Chicago 0 0,12 * * *" ,
122
+ })
123
+ require .Error (t , err )
124
+ require .ErrorContains (t , err , "more than one time" )
125
+ _ , err = client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
126
+ Schedule : "CRON_TZ=America/Chicago 0-30 0 * * *" ,
127
+ })
128
+ require .Error (t , err )
129
+ require .ErrorContains (t , err , "more than one time" )
130
+
131
+ // We don't allow unsetting the custom schedule so we don't need to worry
132
+ // about it in this test.
96
133
})
97
- require .Error (t , err )
98
- require .ErrorContains (t , err , "parse daily schedule" )
99
134
100
- // Try setting a non-daily schedule.
101
- _ , err = client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
102
- Schedule : "CRON_TZ=America/Chicago 0 0 * * 1" ,
103
- })
104
- require .Error (t , err )
105
- require .ErrorContains (t , err , "parse daily schedule" )
135
+ t .Run ("NotEntitled" , func (t * testing.T ) {
136
+ t .Parallel ()
106
137
107
- // Try setting a schedule with a timezone that doesn't exist.
108
- _ , err = client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
109
- Schedule : "CRON_TZ=Deans/House 0 0 * * *" ,
110
- })
111
- require .Error (t , err )
112
- require .ErrorContains (t , err , "parse daily schedule" )
138
+ dv := coderdtest .DeploymentValues (t )
139
+ dv .UserQuietHoursSchedule .DefaultSchedule .Set ("CRON_TZ=America/Chicago 0 0 * * *" )
140
+ dv .Experiments .Set (string (codersdk .ExperimentTemplateRestartRequirement ))
113
141
114
- // Try setting a schedule with more than one time.
115
- _ , err = client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
116
- Schedule : "CRON_TZ=America/Chicago 0 0,12 * * *" ,
142
+ client , user := coderdenttest .New (t , & coderdenttest.Options {
143
+ Options : & coderdtest.Options {
144
+ DeploymentValues : dv ,
145
+ },
146
+ LicenseOptions : & coderdenttest.LicenseOptions {
147
+ Features : license.Features {
148
+ codersdk .FeatureAdvancedTemplateScheduling : 1 ,
149
+ // Not entitled.
150
+ // codersdk.FeatureTemplateRestartRequirement: 1,
151
+ },
152
+ },
153
+ })
154
+
155
+ ctx := testutil .Context (t , testutil .WaitLong )
156
+ _ , err := client .UserQuietHoursSchedule (ctx , user .UserID .String ())
157
+ require .Error (t , err )
158
+ var sdkErr * codersdk.Error
159
+ require .ErrorAs (t , err , & sdkErr )
160
+ require .Equal (t , http .StatusForbidden , sdkErr .StatusCode ())
117
161
})
118
- require .Error (t , err )
119
- require .ErrorContains (t , err , "more than one time" )
120
- _ , err = client .UpdateUserQuietHoursSchedule (ctx , user .UserID .String (), codersdk.UpdateUserQuietHoursScheduleRequest {
121
- Schedule : "CRON_TZ=America/Chicago 0-30 0 * * *" ,
162
+
163
+ t .Run ("NotEnabled" , func (t * testing.T ) {
164
+ t .Parallel ()
165
+
166
+ dv := coderdtest .DeploymentValues (t )
167
+ dv .UserQuietHoursSchedule .DefaultSchedule .Set ("" )
168
+ dv .Experiments .Set (string (codersdk .ExperimentTemplateRestartRequirement ))
169
+
170
+ client , user := coderdenttest .New (t , & coderdenttest.Options {
171
+ NoDefaultQuietHoursSchedule : true ,
172
+ Options : & coderdtest.Options {
173
+ DeploymentValues : dv ,
174
+ },
175
+ LicenseOptions : & coderdenttest.LicenseOptions {
176
+ Features : license.Features {
177
+ codersdk .FeatureAdvancedTemplateScheduling : 1 ,
178
+ codersdk .FeatureTemplateRestartRequirement : 1 ,
179
+ },
180
+ },
181
+ })
182
+
183
+ ctx := testutil .Context (t , testutil .WaitLong )
184
+ _ , err := client .UserQuietHoursSchedule (ctx , user .UserID .String ())
185
+ require .Error (t , err )
186
+ var sdkErr * codersdk.Error
187
+ require .ErrorAs (t , err , & sdkErr )
188
+ require .Equal (t , http .StatusForbidden , sdkErr .StatusCode ())
122
189
})
123
- require .Error (t , err )
124
- require .ErrorContains (t , err , "more than one time" )
125
190
126
- // We don't allow unsetting the custom schedule so we don't need to worry
127
- // about it in this test.
191
+ t .Run ("NoFeatureFlag" , func (t * testing.T ) {
192
+ t .Parallel ()
193
+
194
+ dv := coderdtest .DeploymentValues (t )
195
+ dv .UserQuietHoursSchedule .DefaultSchedule .Set ("CRON_TZ=America/Chicago 0 0 * * *" )
196
+ dv .UserQuietHoursSchedule .DefaultSchedule .Set ("" )
197
+
198
+ client , user := coderdenttest .New (t , & coderdenttest.Options {
199
+ Options : & coderdtest.Options {
200
+ DeploymentValues : dv ,
201
+ },
202
+ LicenseOptions : & coderdenttest.LicenseOptions {
203
+ Features : license.Features {
204
+ codersdk .FeatureAdvancedTemplateScheduling : 1 ,
205
+ codersdk .FeatureTemplateRestartRequirement : 1 ,
206
+ },
207
+ },
208
+ })
209
+
210
+ ctx := testutil .Context (t , testutil .WaitLong )
211
+ _ , err := client .UserQuietHoursSchedule (ctx , user .UserID .String ())
212
+ require .Error (t , err )
213
+ var sdkErr * codersdk.Error
214
+ require .ErrorAs (t , err , & sdkErr )
215
+ require .Equal (t , http .StatusNotFound , sdkErr .StatusCode ())
216
+ })
128
217
}
0 commit comments