gitlab/api/projects/pipeline_schedules/
create.rs

1// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
2// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
4// option. This file may not be copied, modified, or distributed
5// except according to those terms.
6
7use std::str::FromStr;
8
9use derive_builder::Builder;
10use thiserror::Error;
11
12use crate::api::common::NameOrId;
13use crate::api::endpoint_prelude::*;
14use crate::api::ParamValue;
15
16/// Errors when parsing cron sequences.
17#[derive(Debug, Error)]
18#[non_exhaustive]
19pub enum PipelineScheduleCronError {
20    /// Failure to parse a cron expression.
21    #[error("parse error: {}", reason)]
22    ParseError {
23        /// The reason for the parse error.
24        reason: String,
25    },
26}
27
28/// A cron schedule for a pipeline.
29#[derive(Debug, Clone, PartialEq, Eq)]
30pub struct PipelineScheduleCron {
31    cron: String,
32}
33
34impl PipelineScheduleCron {
35    /// Create a cron expression from a string.
36    pub fn new<E>(expression: E) -> Result<Self, PipelineScheduleCronError>
37    where
38        E: AsRef<str>,
39    {
40        Self::new_impl(expression.as_ref())
41    }
42
43    fn new_impl(expression: &str) -> Result<Self, PipelineScheduleCronError> {
44        if cron::Schedule::from_str(expression).is_err() {
45            // Not needed if seconds ever become optional. https://github.com/zslayton/cron/issues/13
46            let compat_expression = format!("* {}", expression);
47            let _ = cron::Schedule::from_str(&compat_expression).map_err(|err| {
48                PipelineScheduleCronError::ParseError {
49                    reason: err.to_string(),
50                }
51            })?;
52        };
53
54        Ok(Self {
55            cron: expression.into(),
56        })
57    }
58}
59
60impl<'a> ParamValue<'a> for &'a PipelineScheduleCron {
61    fn as_value(&self) -> Cow<'a, str> {
62        self.cron.as_str().into()
63    }
64}
65
66/// Timezone selection for a pipeline schedule.
67///
68/// GitLab uses [ActiveRecord's TimeZone names][activerecord-timezone] to map to official
69/// timezones.
70///
71/// https://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html
72#[derive(Debug, Clone, PartialEq, Eq)]
73#[non_exhaustive]
74pub enum PipelineScheduleTimeZone<'a> {
75    /// Etc/GMT+12
76    InternationalDateLineWest,
77    /// Pacific/Pago_Pago
78    AmericanSamoa,
79    /// Pacific/Midway
80    MidwayIsland,
81    /// Pacific/Honolulu
82    Hawaii,
83    /// America/Juneau
84    Alaska,
85    /// America/Los_Angeles
86    PacificTimeUSCanada,
87    /// America/Tijuana
88    Tijuana,
89    /// America/Phoenix
90    Arizona,
91    /// America/Mazatlan
92    Mazatlan,
93    /// America/Denver
94    MountainTimeUSCanada,
95    /// America/Guatemala
96    CentralAmerica,
97    /// America/Chicago
98    CentralTimeUSCanada,
99    /// America/Chihuahua
100    Chihuahua,
101    /// America/Mexico_City
102    Guadalajara,
103    /// America/Mexico_City
104    MexicoCity,
105    /// America/Monterrey
106    Monterrey,
107    /// America/Regina
108    Saskatchewan,
109    /// America/Bogota
110    Bogota,
111    /// America/New_York
112    EasternTimeUSCanada,
113    /// America/Indiana/Indianapolis
114    IndianaEast,
115    /// America/Lima
116    Lima,
117    /// America/Lima
118    Quito,
119    /// America/Halifax
120    AtlanticTimeCanada,
121    /// America/Caracas
122    Caracas,
123    /// America/Guyana
124    Georgetown,
125    /// America/La_Paz
126    LaPaz,
127    /// America/Puerto_Rico
128    PuertoRico,
129    /// America/Santiago
130    Santiago,
131    /// America/St_Johns
132    Newfoundland,
133    /// America/Sao_Paulo
134    Brasilia,
135    /// America/Argentina/Buenos_Aires
136    BuenosAires,
137    /// America/Godthab
138    Greenland,
139    /// America/Montevideo
140    Montevideo,
141    /// Atlantic/South_Georgia
142    MidAtlantic,
143    /// Atlantic/Azores
144    Azores,
145    /// Atlantic/Cape_Verde
146    CapeVerdeIslands,
147    /// Europe/London
148    Edinburgh,
149    /// Europe/Lisbon
150    Lisbon,
151    /// Europe/London
152    London,
153    /// Africa/Monrovia
154    Monrovia,
155    /// Etc/UTC
156    UTC,
157    /// Europe/Amsterdam
158    Amsterdam,
159    /// Europe/Belgrade
160    Belgrade,
161    /// Europe/Berlin
162    Berlin,
163    /// Europe/Zurich
164    Bern,
165    /// Europe/Bratislava
166    Bratislava,
167    /// Europe/Brussels
168    Brussels,
169    /// Europe/Budapest
170    Budapest,
171    /// Africa/Casablanca
172    Casablanca,
173    /// Europe/Copenhagen
174    Copenhagen,
175    /// Europe/Dublin
176    Dublin,
177    /// Europe/Ljubljana
178    Ljubljana,
179    /// Europe/Madrid
180    Madrid,
181    /// Europe/Paris
182    Paris,
183    /// Europe/Prague
184    Prague,
185    /// Europe/Rome
186    Rome,
187    /// Europe/Sarajevo
188    Sarajevo,
189    /// Europe/Skopje
190    Skopje,
191    /// Europe/Stockholm
192    Stockholm,
193    /// Europe/Vienna
194    Vienna,
195    /// Europe/Warsaw
196    Warsaw,
197    /// Africa/Algiers
198    WestCentralAfrica,
199    /// Europe/Zagreb
200    Zagreb,
201    /// Europe/Zurich
202    Zurich,
203    /// Europe/Athens
204    Athens,
205    /// Europe/Bucharest
206    Bucharest,
207    /// Africa/Cairo
208    Cairo,
209    /// Africa/Harare
210    Harare,
211    /// Europe/Helsinki
212    Helsinki,
213    /// Asia/Jerusalem
214    Jerusalem,
215    /// Asia/Kaliningrad
216    Kaliningrad,
217    /// Europe/Kiev
218    Kyiv,
219    /// Africa/Johannesburg
220    Pretoria,
221    /// Europe/Eiga
222    Riga,
223    /// Europe/Sofia
224    Sofia,
225    /// Europe/Tallinn
226    Tallinn,
227    /// Europe/Vilnius
228    Vilnius,
229    /// Asia/Baghdad
230    Baghdad,
231    /// Europe/Istanbul
232    Istanbul,
233    /// Asia/Kuwait
234    Kuwait,
235    /// Europe/Minsk
236    Minsk,
237    /// Europe/Moscow
238    Moscow,
239    /// Asia/Nairobi
240    Nairobi,
241    /// Asia/Riyadh
242    Riyadh,
243    /// Europe/Moscow
244    StPetersburg,
245    /// Europe/Volgograd
246    Volgograd,
247    /// Asia/Tehran
248    Tehran,
249    /// Asia/Muscat
250    AbuDhabi,
251    /// Asia/Baku
252    Baku,
253    /// Asia/Muscat
254    Muscat,
255    /// Europe/Samara
256    Samara,
257    /// Asia/Tbilisi
258    Tbilisi,
259    /// Asia/Yerevan
260    Yerevan,
261    /// Asia/Kabul
262    Kabul,
263    /// Asia/Yekaterinburg
264    Ekaterinburg,
265    /// Asia/Karachi
266    Islamabad,
267    /// Asia/Karachi
268    Karachi,
269    /// Asia/Tashkent
270    Tashkent,
271    /// Asia/Kolkata
272    Chennai,
273    /// Asia/Kolkata
274    Kolkata,
275    /// Asia/Kolkata
276    Mumbai,
277    /// Asia/Kolkata
278    NewDelhi,
279    /// Asia/Colombo
280    SriJayawardenepura,
281    /// Asia/Kathmandu
282    Kathmandu,
283    /// Asia/Almaty
284    Almaty,
285    /// Asia/Dhaka
286    Astana,
287    /// Asia/Dhaka
288    Dhaka,
289    /// Asia/Urumqi
290    Urumqi,
291    /// Asia/Rangoon
292    Rangoon,
293    /// Asia/Bangkok
294    Bangkok,
295    /// Asia/Bangkok
296    Hanoi,
297    /// Asia/Jakarta
298    Jakarta,
299    /// Asia/Krasnoyarsk
300    Krasnoyarsk,
301    /// Asia/Novosibirsk
302    Novosibirsk,
303    /// Asia/Shanghai
304    Beijing,
305    /// Asia/Chongqing
306    Chongqing,
307    /// Asia/Hong_Kong
308    HongKong,
309    /// Asia/Irkutsk
310    Irkutsk,
311    /// Asia/Kuala_Lumpur
312    KualaLumpur,
313    /// Australia/Perth
314    Perth,
315    /// Asia/Singapore
316    Singapore,
317    /// Asia/Taipei
318    Taipei,
319    /// Asia/Ulaanbaatar
320    Ulaanbaatar,
321    /// Asia/Tokyo
322    Osaka,
323    /// Asia/Tokyo
324    Sapporo,
325    /// Asia/Seoul
326    Seoul,
327    /// Asia/Tokyo
328    Tokyo,
329    /// Asia/Yakutsk
330    Yakutsk,
331    ///Australia/Adelaide
332    Adelaide,
333    ///Australia/Darwin
334    Darwin,
335    ///Australia/Brisbane
336    Brisbane,
337    ///Australia/Melbourne
338    Canberra,
339    /// Pacific/Guam
340    Guam,
341    /// Australia/Hobart
342    Hobart,
343    ///Australia/Melbourne
344    Melbourne,
345    /// Pacific/Port_Moresby
346    PortMoresby,
347    /// Australia/Sydney
348    Sydney,
349    /// Asia/Vladivostok
350    Vladivostok,
351    /// Asia/Magadan
352    Magadan,
353    /// Pacific/Noumea
354    NewCaledonia,
355    /// Pacific/Guadalcanal
356    SolomonIslands,
357    /// Asia/Srednekolymsk
358    Srednekolymsk,
359    /// Pacific/Auckland
360    Auckland,
361    /// Pacific/Fiji
362    Fiji,
363    /// Asia/Kamchatka
364    Kamchatka,
365    /// Pacific/Majuro
366    MarshallIslands,
367    /// Pacific/Auckland
368    Wellington,
369    /// Pacific/Chatham
370    ChathamIslands,
371    /// Pacific/Tongatapu
372    Nukualofa,
373    /// Pacific/Apia
374    Samoa,
375    /// Pacific/Fakaofo
376    TokelauIslands,
377    /// Coverage of any unhandled time zone.
378    Custom(Cow<'a, str>),
379}
380
381impl PipelineScheduleTimeZone<'_> {
382    fn as_str(&self) -> &str {
383        match *self {
384            Self::InternationalDateLineWest => "International Date Line West",
385            Self::AmericanSamoa => "American Samoa",
386            Self::MidwayIsland => "Midway Island",
387            Self::Hawaii => "Hawaii",
388            Self::Alaska => "Alaska",
389            Self::PacificTimeUSCanada => "Pacific Time (US & Canada)",
390            Self::Tijuana => "Tijuana",
391            Self::Arizona => "Arizona",
392            Self::Mazatlan => "Mazatlan",
393            Self::MountainTimeUSCanada => "Mountain Time (US & Canada)",
394            Self::CentralAmerica => "Central America",
395            Self::CentralTimeUSCanada => "Central Time (US & Canada)",
396            Self::Chihuahua => "Chihuahua",
397            Self::Guadalajara => "Guadalajara",
398            Self::MexicoCity => "Mexico City",
399            Self::Monterrey => "Monterrey",
400            Self::Saskatchewan => "Saskatchewan",
401            Self::Bogota => "Bogota",
402            Self::EasternTimeUSCanada => "Eastern Time (US & Canada)",
403            Self::IndianaEast => "Indiana (East)",
404            Self::Lima => "Lima",
405            Self::Quito => "Quito",
406            Self::AtlanticTimeCanada => "Atlantic Time (Canada)",
407            Self::Caracas => "Caracas",
408            Self::Georgetown => "Georgetown",
409            Self::LaPaz => "La Paz",
410            Self::PuertoRico => "Puerto Rico",
411            Self::Santiago => "Santiago",
412            Self::Newfoundland => "Newfoundland",
413            Self::Brasilia => "Brasilia",
414            Self::BuenosAires => "Buenos Aires",
415            Self::Greenland => "Greenland",
416            Self::Montevideo => "Montevideo",
417            Self::MidAtlantic => "Mid-Atlantic",
418            Self::Azores => "Azores",
419            Self::CapeVerdeIslands => "Cape Verde Is.",
420            Self::Edinburgh => "Edinburgh",
421            Self::Lisbon => "Lisbon",
422            Self::London => "London",
423            Self::Monrovia => "Monrovia",
424            Self::UTC => "UTC",
425            Self::Amsterdam => "Amsterdam",
426            Self::Belgrade => "Belgrade",
427            Self::Berlin => "Berlin",
428            Self::Bern => "Bern",
429            Self::Bratislava => "Bratislava",
430            Self::Brussels => "Brussels",
431            Self::Budapest => "Budapest",
432            Self::Casablanca => "Casablanca",
433            Self::Copenhagen => "Copenhagen",
434            Self::Dublin => "Dublin",
435            Self::Ljubljana => "Ljubljana",
436            Self::Madrid => "Madrid",
437            Self::Paris => "Paris",
438            Self::Prague => "Prague",
439            Self::Rome => "Rome",
440            Self::Sarajevo => "Sarajevo",
441            Self::Skopje => "Skopje",
442            Self::Stockholm => "Stockholm",
443            Self::Vienna => "Vienna",
444            Self::Warsaw => "Warsaw",
445            Self::WestCentralAfrica => "West Central Africa",
446            Self::Zagreb => "Zagreb",
447            Self::Zurich => "Zurich",
448            Self::Athens => "Athens",
449            Self::Bucharest => "Bucharest",
450            Self::Cairo => "Cairo",
451            Self::Harare => "Harare",
452            Self::Helsinki => "Helsinki",
453            Self::Jerusalem => "Jerusalem",
454            Self::Kaliningrad => "Kaliningrad",
455            Self::Kyiv => "Kyiv",
456            Self::Pretoria => "Pretoria",
457            Self::Riga => "Riga",
458            Self::Sofia => "Sofia",
459            Self::Tallinn => "Tallinn",
460            Self::Vilnius => "Vilnius",
461            Self::Baghdad => "Baghdad",
462            Self::Istanbul => "Istanbul",
463            Self::Kuwait => "Kuwait",
464            Self::Minsk => "Minsk",
465            Self::Moscow => "Moscow",
466            Self::Nairobi => "Nairobi",
467            Self::Riyadh => "Riyadh",
468            Self::StPetersburg => "St. Petersburg",
469            Self::Volgograd => "Volgograd",
470            Self::Tehran => "Tehran",
471            Self::AbuDhabi => "Abu Dhabi",
472            Self::Baku => "Baku",
473            Self::Muscat => "Muscat",
474            Self::Samara => "Samara",
475            Self::Tbilisi => "Tbilisi",
476            Self::Yerevan => "Yerevan",
477            Self::Kabul => "Kabul",
478            Self::Ekaterinburg => "Ekaterinburg",
479            Self::Islamabad => "Islamabad",
480            Self::Karachi => "Karachi",
481            Self::Tashkent => "Tashkent",
482            Self::Chennai => "Chennai",
483            Self::Kolkata => "Kolkata",
484            Self::Mumbai => "Mumbai",
485            Self::NewDelhi => "New Delhi",
486            Self::SriJayawardenepura => "Sri Jayawardenepura",
487            Self::Kathmandu => "Kathmandu",
488            Self::Almaty => "Almaty",
489            Self::Astana => "Astana",
490            Self::Dhaka => "Dhaka",
491            Self::Urumqi => "Urumqi",
492            Self::Rangoon => "Rangoon",
493            Self::Bangkok => "Bangkok",
494            Self::Hanoi => "Hanoi",
495            Self::Jakarta => "Jakarta",
496            Self::Krasnoyarsk => "Krasnoyarsk",
497            Self::Novosibirsk => "Novosibirsk",
498            Self::Beijing => "Beijing",
499            Self::Chongqing => "Chongqing",
500            Self::HongKong => "Hong Kong",
501            Self::Irkutsk => "Irkutsk",
502            Self::KualaLumpur => "Kuala Lumpur",
503            Self::Perth => "Perth",
504            Self::Singapore => "Singapore",
505            Self::Taipei => "Taipei",
506            Self::Ulaanbaatar => "Ulaanbaatar",
507            Self::Osaka => "Osaka",
508            Self::Sapporo => "Sapporo",
509            Self::Seoul => "Seoul",
510            Self::Tokyo => "Tokyo",
511            Self::Yakutsk => "Yakutsk",
512            Self::Adelaide => "Adelaide",
513            Self::Darwin => "Darwin",
514            Self::Brisbane => "Brisbane",
515            Self::Canberra => "Canberra",
516            Self::Guam => "Guam",
517            Self::Hobart => "Hobart",
518            Self::Melbourne => "Melbourne",
519            Self::PortMoresby => "Port Moresby",
520            Self::Sydney => "Sydney",
521            Self::Vladivostok => "Vladivostok",
522            Self::Magadan => "Magadan",
523            Self::NewCaledonia => "New Caledonia",
524            Self::SolomonIslands => "Solomon Is.",
525            Self::Srednekolymsk => "Srednekolymsk",
526            Self::Auckland => "Auckland",
527            Self::Fiji => "Fiji",
528            Self::Kamchatka => "Kamchatka",
529            Self::MarshallIslands => "Marshall Is.",
530            Self::Wellington => "Wellington",
531            Self::ChathamIslands => "Chatham Is.",
532            Self::Nukualofa => "Nuku'alofa",
533            Self::Samoa => "Samoa",
534            Self::TokelauIslands => "Tokelau Is.",
535            Self::Custom(ref s) => s.as_ref(),
536        }
537    }
538}
539
540impl<'a> ParamValue<'a> for &'a PipelineScheduleTimeZone<'a> {
541    fn as_value(&self) -> Cow<'a, str> {
542        self.as_str().into()
543    }
544}
545
546/// Create a new pipeline schedule on a project.
547#[derive(Debug, Builder, Clone)]
548#[builder(setter(strip_option))]
549pub struct CreatePipelineSchedule<'a> {
550    /// The project to create the pipeline schedule within.
551    #[builder(setter(into))]
552    project: NameOrId<'a>,
553    /// The description of the pipeline schedule.
554    #[builder(setter(into))]
555    description: Cow<'a, str>,
556    /// The ref to create the pipeline schedule for.
557    #[builder(setter(into))]
558    ref_: Cow<'a, str>,
559    /// The `cron` schedule.
560    cron: PipelineScheduleCron,
561
562    /// The timezone to use.
563    ///
564    /// Defaults to `UTC`.
565    #[builder(default)]
566    cron_timezone: Option<PipelineScheduleTimeZone<'a>>,
567    /// Whether the pipeline is active or not.
568    #[builder(default)]
569    active: Option<bool>,
570}
571
572impl<'a> CreatePipelineSchedule<'a> {
573    /// Create a builder for the endpoint.
574    pub fn builder() -> CreatePipelineScheduleBuilder<'a> {
575        CreatePipelineScheduleBuilder::default()
576    }
577}
578
579impl Endpoint for CreatePipelineSchedule<'_> {
580    fn method(&self) -> Method {
581        Method::POST
582    }
583
584    fn endpoint(&self) -> Cow<'static, str> {
585        format!("projects/{}/pipeline_schedules", self.project).into()
586    }
587
588    fn body(&self) -> Result<Option<(&'static str, Vec<u8>)>, BodyError> {
589        let mut params = FormParams::default();
590
591        params
592            .push("description", &self.description)
593            .push("ref", &self.ref_)
594            .push("cron", &self.cron)
595            .push_opt("cron_timezone", self.cron_timezone.as_ref())
596            .push_opt("active", self.active);
597
598        params.into_body()
599    }
600}
601
602#[cfg(test)]
603mod tests {
604    use http::Method;
605
606    use crate::api::projects::pipeline_schedules::{
607        CreatePipelineSchedule, CreatePipelineScheduleBuilderError, PipelineScheduleCron,
608        PipelineScheduleCronError, PipelineScheduleTimeZone,
609    };
610    use crate::api::{self, ParamValue, Query};
611    use crate::test::client::{ExpectedUrl, SingleTestClient};
612
613    #[test]
614    fn pipeline_schedule_cron_parse() {
615        PipelineScheduleCron::new("0 1 * * *").unwrap();
616        let PipelineScheduleCronError::ParseError {
617            reason,
618        } = PipelineScheduleCron::new("").unwrap_err();
619        assert!(!reason.is_empty());
620    }
621
622    #[test]
623    fn pipeline_schedule_cron_as_param() {
624        let items = &[("0 1 * * *", "0 1 * * *"), ("* 4,5 * * *", "* 4,5 * * *")];
625
626        for (i, s) in items {
627            let cron = PipelineScheduleCron::new(i).unwrap();
628            assert_eq!((&cron).as_value(), *s);
629        }
630    }
631
632    #[test]
633    fn pipeline_timezone_as_str() {
634        let items = &[
635            (
636                PipelineScheduleTimeZone::InternationalDateLineWest,
637                "International Date Line West",
638            ),
639            (PipelineScheduleTimeZone::AmericanSamoa, "American Samoa"),
640            (PipelineScheduleTimeZone::MidwayIsland, "Midway Island"),
641            (PipelineScheduleTimeZone::Hawaii, "Hawaii"),
642            (PipelineScheduleTimeZone::Alaska, "Alaska"),
643            (
644                PipelineScheduleTimeZone::PacificTimeUSCanada,
645                "Pacific Time (US & Canada)",
646            ),
647            (PipelineScheduleTimeZone::Tijuana, "Tijuana"),
648            (PipelineScheduleTimeZone::Arizona, "Arizona"),
649            (PipelineScheduleTimeZone::Mazatlan, "Mazatlan"),
650            (
651                PipelineScheduleTimeZone::MountainTimeUSCanada,
652                "Mountain Time (US & Canada)",
653            ),
654            (PipelineScheduleTimeZone::CentralAmerica, "Central America"),
655            (
656                PipelineScheduleTimeZone::CentralTimeUSCanada,
657                "Central Time (US & Canada)",
658            ),
659            (PipelineScheduleTimeZone::Chihuahua, "Chihuahua"),
660            (PipelineScheduleTimeZone::Guadalajara, "Guadalajara"),
661            (PipelineScheduleTimeZone::MexicoCity, "Mexico City"),
662            (PipelineScheduleTimeZone::Monterrey, "Monterrey"),
663            (PipelineScheduleTimeZone::Saskatchewan, "Saskatchewan"),
664            (PipelineScheduleTimeZone::Bogota, "Bogota"),
665            (
666                PipelineScheduleTimeZone::EasternTimeUSCanada,
667                "Eastern Time (US & Canada)",
668            ),
669            (PipelineScheduleTimeZone::IndianaEast, "Indiana (East)"),
670            (PipelineScheduleTimeZone::Lima, "Lima"),
671            (PipelineScheduleTimeZone::Quito, "Quito"),
672            (
673                PipelineScheduleTimeZone::AtlanticTimeCanada,
674                "Atlantic Time (Canada)",
675            ),
676            (PipelineScheduleTimeZone::Caracas, "Caracas"),
677            (PipelineScheduleTimeZone::Georgetown, "Georgetown"),
678            (PipelineScheduleTimeZone::LaPaz, "La Paz"),
679            (PipelineScheduleTimeZone::PuertoRico, "Puerto Rico"),
680            (PipelineScheduleTimeZone::Santiago, "Santiago"),
681            (PipelineScheduleTimeZone::Newfoundland, "Newfoundland"),
682            (PipelineScheduleTimeZone::Brasilia, "Brasilia"),
683            (PipelineScheduleTimeZone::BuenosAires, "Buenos Aires"),
684            (PipelineScheduleTimeZone::Greenland, "Greenland"),
685            (PipelineScheduleTimeZone::Montevideo, "Montevideo"),
686            (PipelineScheduleTimeZone::MidAtlantic, "Mid-Atlantic"),
687            (PipelineScheduleTimeZone::Azores, "Azores"),
688            (PipelineScheduleTimeZone::CapeVerdeIslands, "Cape Verde Is."),
689            (PipelineScheduleTimeZone::Edinburgh, "Edinburgh"),
690            (PipelineScheduleTimeZone::Lisbon, "Lisbon"),
691            (PipelineScheduleTimeZone::London, "London"),
692            (PipelineScheduleTimeZone::Monrovia, "Monrovia"),
693            (PipelineScheduleTimeZone::UTC, "UTC"),
694            (PipelineScheduleTimeZone::Amsterdam, "Amsterdam"),
695            (PipelineScheduleTimeZone::Belgrade, "Belgrade"),
696            (PipelineScheduleTimeZone::Berlin, "Berlin"),
697            (PipelineScheduleTimeZone::Bern, "Bern"),
698            (PipelineScheduleTimeZone::Bratislava, "Bratislava"),
699            (PipelineScheduleTimeZone::Brussels, "Brussels"),
700            (PipelineScheduleTimeZone::Budapest, "Budapest"),
701            (PipelineScheduleTimeZone::Casablanca, "Casablanca"),
702            (PipelineScheduleTimeZone::Copenhagen, "Copenhagen"),
703            (PipelineScheduleTimeZone::Dublin, "Dublin"),
704            (PipelineScheduleTimeZone::Ljubljana, "Ljubljana"),
705            (PipelineScheduleTimeZone::Madrid, "Madrid"),
706            (PipelineScheduleTimeZone::Paris, "Paris"),
707            (PipelineScheduleTimeZone::Prague, "Prague"),
708            (PipelineScheduleTimeZone::Rome, "Rome"),
709            (PipelineScheduleTimeZone::Sarajevo, "Sarajevo"),
710            (PipelineScheduleTimeZone::Skopje, "Skopje"),
711            (PipelineScheduleTimeZone::Stockholm, "Stockholm"),
712            (PipelineScheduleTimeZone::Vienna, "Vienna"),
713            (PipelineScheduleTimeZone::Warsaw, "Warsaw"),
714            (
715                PipelineScheduleTimeZone::WestCentralAfrica,
716                "West Central Africa",
717            ),
718            (PipelineScheduleTimeZone::Zagreb, "Zagreb"),
719            (PipelineScheduleTimeZone::Zurich, "Zurich"),
720            (PipelineScheduleTimeZone::Athens, "Athens"),
721            (PipelineScheduleTimeZone::Bucharest, "Bucharest"),
722            (PipelineScheduleTimeZone::Cairo, "Cairo"),
723            (PipelineScheduleTimeZone::Harare, "Harare"),
724            (PipelineScheduleTimeZone::Helsinki, "Helsinki"),
725            (PipelineScheduleTimeZone::Jerusalem, "Jerusalem"),
726            (PipelineScheduleTimeZone::Kaliningrad, "Kaliningrad"),
727            (PipelineScheduleTimeZone::Kyiv, "Kyiv"),
728            (PipelineScheduleTimeZone::Pretoria, "Pretoria"),
729            (PipelineScheduleTimeZone::Riga, "Riga"),
730            (PipelineScheduleTimeZone::Sofia, "Sofia"),
731            (PipelineScheduleTimeZone::Tallinn, "Tallinn"),
732            (PipelineScheduleTimeZone::Vilnius, "Vilnius"),
733            (PipelineScheduleTimeZone::Baghdad, "Baghdad"),
734            (PipelineScheduleTimeZone::Istanbul, "Istanbul"),
735            (PipelineScheduleTimeZone::Kuwait, "Kuwait"),
736            (PipelineScheduleTimeZone::Minsk, "Minsk"),
737            (PipelineScheduleTimeZone::Moscow, "Moscow"),
738            (PipelineScheduleTimeZone::Nairobi, "Nairobi"),
739            (PipelineScheduleTimeZone::Riyadh, "Riyadh"),
740            (PipelineScheduleTimeZone::StPetersburg, "St. Petersburg"),
741            (PipelineScheduleTimeZone::Volgograd, "Volgograd"),
742            (PipelineScheduleTimeZone::Tehran, "Tehran"),
743            (PipelineScheduleTimeZone::AbuDhabi, "Abu Dhabi"),
744            (PipelineScheduleTimeZone::Baku, "Baku"),
745            (PipelineScheduleTimeZone::Muscat, "Muscat"),
746            (PipelineScheduleTimeZone::Samara, "Samara"),
747            (PipelineScheduleTimeZone::Tbilisi, "Tbilisi"),
748            (PipelineScheduleTimeZone::Yerevan, "Yerevan"),
749            (PipelineScheduleTimeZone::Kabul, "Kabul"),
750            (PipelineScheduleTimeZone::Ekaterinburg, "Ekaterinburg"),
751            (PipelineScheduleTimeZone::Islamabad, "Islamabad"),
752            (PipelineScheduleTimeZone::Karachi, "Karachi"),
753            (PipelineScheduleTimeZone::Tashkent, "Tashkent"),
754            (PipelineScheduleTimeZone::Chennai, "Chennai"),
755            (PipelineScheduleTimeZone::Kolkata, "Kolkata"),
756            (PipelineScheduleTimeZone::Mumbai, "Mumbai"),
757            (PipelineScheduleTimeZone::NewDelhi, "New Delhi"),
758            (
759                PipelineScheduleTimeZone::SriJayawardenepura,
760                "Sri Jayawardenepura",
761            ),
762            (PipelineScheduleTimeZone::Kathmandu, "Kathmandu"),
763            (PipelineScheduleTimeZone::Almaty, "Almaty"),
764            (PipelineScheduleTimeZone::Astana, "Astana"),
765            (PipelineScheduleTimeZone::Dhaka, "Dhaka"),
766            (PipelineScheduleTimeZone::Urumqi, "Urumqi"),
767            (PipelineScheduleTimeZone::Rangoon, "Rangoon"),
768            (PipelineScheduleTimeZone::Bangkok, "Bangkok"),
769            (PipelineScheduleTimeZone::Hanoi, "Hanoi"),
770            (PipelineScheduleTimeZone::Jakarta, "Jakarta"),
771            (PipelineScheduleTimeZone::Krasnoyarsk, "Krasnoyarsk"),
772            (PipelineScheduleTimeZone::Novosibirsk, "Novosibirsk"),
773            (PipelineScheduleTimeZone::Beijing, "Beijing"),
774            (PipelineScheduleTimeZone::Chongqing, "Chongqing"),
775            (PipelineScheduleTimeZone::HongKong, "Hong Kong"),
776            (PipelineScheduleTimeZone::Irkutsk, "Irkutsk"),
777            (PipelineScheduleTimeZone::KualaLumpur, "Kuala Lumpur"),
778            (PipelineScheduleTimeZone::Perth, "Perth"),
779            (PipelineScheduleTimeZone::Singapore, "Singapore"),
780            (PipelineScheduleTimeZone::Taipei, "Taipei"),
781            (PipelineScheduleTimeZone::Ulaanbaatar, "Ulaanbaatar"),
782            (PipelineScheduleTimeZone::Osaka, "Osaka"),
783            (PipelineScheduleTimeZone::Sapporo, "Sapporo"),
784            (PipelineScheduleTimeZone::Seoul, "Seoul"),
785            (PipelineScheduleTimeZone::Tokyo, "Tokyo"),
786            (PipelineScheduleTimeZone::Yakutsk, "Yakutsk"),
787            (PipelineScheduleTimeZone::Adelaide, "Adelaide"),
788            (PipelineScheduleTimeZone::Darwin, "Darwin"),
789            (PipelineScheduleTimeZone::Brisbane, "Brisbane"),
790            (PipelineScheduleTimeZone::Canberra, "Canberra"),
791            (PipelineScheduleTimeZone::Guam, "Guam"),
792            (PipelineScheduleTimeZone::Hobart, "Hobart"),
793            (PipelineScheduleTimeZone::Melbourne, "Melbourne"),
794            (PipelineScheduleTimeZone::PortMoresby, "Port Moresby"),
795            (PipelineScheduleTimeZone::Sydney, "Sydney"),
796            (PipelineScheduleTimeZone::Vladivostok, "Vladivostok"),
797            (PipelineScheduleTimeZone::Magadan, "Magadan"),
798            (PipelineScheduleTimeZone::NewCaledonia, "New Caledonia"),
799            (PipelineScheduleTimeZone::SolomonIslands, "Solomon Is."),
800            (PipelineScheduleTimeZone::Srednekolymsk, "Srednekolymsk"),
801            (PipelineScheduleTimeZone::Auckland, "Auckland"),
802            (PipelineScheduleTimeZone::Fiji, "Fiji"),
803            (PipelineScheduleTimeZone::Kamchatka, "Kamchatka"),
804            (PipelineScheduleTimeZone::MarshallIslands, "Marshall Is."),
805            (PipelineScheduleTimeZone::Wellington, "Wellington"),
806            (PipelineScheduleTimeZone::ChathamIslands, "Chatham Is."),
807            (PipelineScheduleTimeZone::Nukualofa, "Nuku'alofa"),
808            (PipelineScheduleTimeZone::Samoa, "Samoa"),
809            (PipelineScheduleTimeZone::TokelauIslands, "Tokelau Is."),
810            (PipelineScheduleTimeZone::Custom("custom".into()), "custom"),
811        ];
812
813        for (i, s) in items {
814            assert_eq!(i.as_str(), *s);
815        }
816    }
817
818    #[test]
819    fn all_required_params_are_necessary() {
820        let err = CreatePipelineSchedule::builder().build().unwrap_err();
821        crate::test::assert_missing_field!(err, CreatePipelineScheduleBuilderError, "project");
822    }
823
824    #[test]
825    fn project_is_necessary() {
826        let err = CreatePipelineSchedule::builder()
827            .description("desc")
828            .ref_("master")
829            .cron(PipelineScheduleCron::new("0 1 * * *").unwrap())
830            .build()
831            .unwrap_err();
832        crate::test::assert_missing_field!(err, CreatePipelineScheduleBuilderError, "project");
833    }
834
835    #[test]
836    fn description_is_necessary() {
837        let err = CreatePipelineSchedule::builder()
838            .project(1)
839            .ref_("master")
840            .cron(PipelineScheduleCron::new("0 1 * * *").unwrap())
841            .build()
842            .unwrap_err();
843        crate::test::assert_missing_field!(err, CreatePipelineScheduleBuilderError, "description");
844    }
845
846    #[test]
847    fn ref_is_necessary() {
848        let err = CreatePipelineSchedule::builder()
849            .project(1)
850            .description("desc")
851            .cron(PipelineScheduleCron::new("0 1 * * *").unwrap())
852            .build()
853            .unwrap_err();
854        crate::test::assert_missing_field!(err, CreatePipelineScheduleBuilderError, "ref_");
855    }
856
857    #[test]
858    fn cron_is_necessary() {
859        let err = CreatePipelineSchedule::builder()
860            .project(1)
861            .description("desc")
862            .ref_("master")
863            .build()
864            .unwrap_err();
865        crate::test::assert_missing_field!(err, CreatePipelineScheduleBuilderError, "cron");
866    }
867
868    #[test]
869    fn all_required_parameters() {
870        CreatePipelineSchedule::builder()
871            .project(1)
872            .description("desc")
873            .ref_("master")
874            .cron(PipelineScheduleCron::new("0 1 * * *").unwrap())
875            .build()
876            .unwrap();
877    }
878
879    #[test]
880    fn endpoint() {
881        let endpoint = ExpectedUrl::builder()
882            .method(Method::POST)
883            .endpoint("projects/simple%2Fproject/pipeline_schedules")
884            .content_type("application/x-www-form-urlencoded")
885            .body_str(concat!(
886                "description=desc",
887                "&ref=master",
888                "&cron=0+1+*+*+*",
889            ))
890            .build()
891            .unwrap();
892        let client = SingleTestClient::new_raw(endpoint, "");
893
894        let endpoint = CreatePipelineSchedule::builder()
895            .project("simple/project")
896            .description("desc")
897            .ref_("master")
898            .cron(PipelineScheduleCron::new("0 1 * * *").unwrap())
899            .build()
900            .unwrap();
901        api::ignore(endpoint).query(&client).unwrap();
902    }
903
904    #[test]
905    fn endpoint_cron_timezone() {
906        let endpoint = ExpectedUrl::builder()
907            .method(Method::POST)
908            .endpoint("projects/simple%2Fproject/pipeline_schedules")
909            .content_type("application/x-www-form-urlencoded")
910            .body_str(concat!(
911                "description=desc",
912                "&ref=master",
913                "&cron=0+1+*+*+*",
914                "&cron_timezone=Newfoundland",
915            ))
916            .build()
917            .unwrap();
918        let client = SingleTestClient::new_raw(endpoint, "");
919
920        let endpoint = CreatePipelineSchedule::builder()
921            .project("simple/project")
922            .description("desc")
923            .ref_("master")
924            .cron(PipelineScheduleCron::new("0 1 * * *").unwrap())
925            .cron_timezone(PipelineScheduleTimeZone::Newfoundland)
926            .build()
927            .unwrap();
928        api::ignore(endpoint).query(&client).unwrap();
929    }
930
931    #[test]
932    fn endpoint_active() {
933        let endpoint = ExpectedUrl::builder()
934            .method(Method::POST)
935            .endpoint("projects/simple%2Fproject/pipeline_schedules")
936            .content_type("application/x-www-form-urlencoded")
937            .body_str(concat!(
938                "description=desc",
939                "&ref=master",
940                "&cron=0+1+*+*+*",
941                "&active=false",
942            ))
943            .build()
944            .unwrap();
945        let client = SingleTestClient::new_raw(endpoint, "");
946
947        let endpoint = CreatePipelineSchedule::builder()
948            .project("simple/project")
949            .description("desc")
950            .ref_("master")
951            .cron(PipelineScheduleCron::new("0 1 * * *").unwrap())
952            .active(false)
953            .build()
954            .unwrap();
955        api::ignore(endpoint).query(&client).unwrap();
956    }
957}