github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/web/elm/tests/StepTreeTests.elm (about)

     1  module StepTreeTests exposing
     2      ( all
     3      , initAggregate
     4      , initAggregateNested
     5      , initEnsure
     6      , initGet
     7      , initInParallel
     8      , initInParallelNested
     9      , initOnFailure
    10      , initOnSuccess
    11      , initPut
    12      , initTask
    13      , initTimeout
    14      , initTry
    15      )
    16  
    17  import Ansi.Log
    18  import Array
    19  import Build.StepTree.Models as Models
    20  import Build.StepTree.StepTree as StepTree
    21  import Concourse exposing (BuildStep(..), HookedPlan, JsonValue(..))
    22  import Dict exposing (Dict)
    23  import Expect exposing (..)
    24  import Routes
    25  import Test exposing (..)
    26  
    27  
    28  all : Test
    29  all =
    30      describe "StepTree"
    31          [ initTask
    32          , initSetPipeline
    33          , initLoadVar
    34          , initCheck
    35          , initGet
    36          , initPut
    37          , initAggregate
    38          , initAggregateNested
    39          , initAcross
    40          , initAcrossNested
    41          , initAcrossWithDo
    42          , initInParallel
    43          , initInParallelNested
    44          , initOnSuccess
    45          , initOnFailure
    46          , initEnsure
    47          , initTry
    48          , initTimeout
    49          ]
    50  
    51  
    52  someStep : Routes.StepID -> Models.StepName -> Models.StepState -> Models.Step
    53  someStep =
    54      someVersionedStep Nothing
    55  
    56  
    57  someVersionedStep : Maybe Models.Version -> Routes.StepID -> Models.StepName -> Models.StepState -> Models.Step
    58  someVersionedStep version id name state =
    59      { id = id
    60      , name = name
    61      , state = state
    62      , log = cookedLog
    63      , error = Nothing
    64      , expanded = False
    65      , version = version
    66      , metadata = []
    67      , changed = False
    68      , timestamps = Dict.empty
    69      , initialize = Nothing
    70      , start = Nothing
    71      , finish = Nothing
    72      , tabFocus = Models.Auto
    73      , expandedHeaders = Dict.empty
    74      , initializationExpanded = False
    75      , imageCheck = Nothing
    76      , imageGet = Nothing
    77      }
    78  
    79  
    80  someExpandedStep : Routes.StepID -> Models.StepName -> Models.StepState -> Models.Step
    81  someExpandedStep id name state =
    82      someStep id name state |> (\s -> { s | expanded = True })
    83  
    84  
    85  emptyResources : Concourse.BuildResources
    86  emptyResources =
    87      { inputs = [], outputs = [] }
    88  
    89  
    90  initTask : Test
    91  initTask =
    92      let
    93          { tree, steps } =
    94              StepTree.init Routes.HighlightNothing
    95                  emptyResources
    96                  { id = "some-id"
    97                  , step = BuildStepTask "some-name"
    98                  }
    99      in
   100      describe "init with Task"
   101          [ test "the tree" <|
   102              \_ ->
   103                  Expect.equal (Models.Task "some-id") tree
   104          , test "the step" <|
   105              \_ ->
   106                  assertSteps
   107                      [ ( "some-id", someStep "some-id" "some-name" Models.StepStatePending ) ]
   108                      steps
   109          ]
   110  
   111  
   112  initSetPipeline : Test
   113  initSetPipeline =
   114      let
   115          { tree, steps } =
   116              StepTree.init Routes.HighlightNothing
   117                  emptyResources
   118                  { id = "some-id"
   119                  , step = BuildStepSetPipeline "some-name"
   120                  }
   121      in
   122      describe "init with SetPipeline"
   123          [ test "the tree" <|
   124              \_ ->
   125                  Expect.equal (Models.SetPipeline "some-id") tree
   126          , test "the steps" <|
   127              \_ ->
   128                  assertSteps [ ( "some-id", someStep "some-id" "some-name" Models.StepStatePending ) ] steps
   129          ]
   130  
   131  
   132  initLoadVar : Test
   133  initLoadVar =
   134      let
   135          { tree, steps } =
   136              StepTree.init Routes.HighlightNothing
   137                  emptyResources
   138                  { id = "some-id"
   139                  , step = BuildStepLoadVar "some-name"
   140                  }
   141      in
   142      describe "init with LoadVar"
   143          [ test "the tree" <|
   144              \_ ->
   145                  Expect.equal (Models.LoadVar "some-id") tree
   146          , test "the step" <|
   147              \_ ->
   148                  assertSteps [ ( "some-id", someStep "some-id" "some-name" Models.StepStatePending ) ] steps
   149          ]
   150  
   151  
   152  initCheck : Test
   153  initCheck =
   154      let
   155          { tree, steps } =
   156              StepTree.init Routes.HighlightNothing
   157                  emptyResources
   158                  { id = "some-id"
   159                  , step = BuildStepCheck "some-name"
   160                  }
   161      in
   162      describe "init with Check"
   163          [ test "the tree" <|
   164              \_ ->
   165                  Expect.equal (Models.Check "some-id") tree
   166          , test "the step" <|
   167              \_ ->
   168                  assertSteps [ ( "some-id", someStep "some-id" "some-name" Models.StepStatePending ) ] steps
   169          ]
   170  
   171  
   172  initGet : Test
   173  initGet =
   174      let
   175          version =
   176              Dict.fromList [ ( "some", "version" ) ]
   177  
   178          { tree, steps } =
   179              StepTree.init Routes.HighlightNothing
   180                  emptyResources
   181                  { id = "some-id"
   182                  , step = BuildStepGet "some-name" (Just version)
   183                  }
   184      in
   185      describe "init with Get"
   186          [ test "the tree" <|
   187              \_ ->
   188                  Expect.equal (Models.Get "some-id") tree
   189          , test "the step" <|
   190              \_ ->
   191                  assertSteps [ ( "some-id", someVersionedStep (Just version) "some-id" "some-name" Models.StepStatePending ) ] steps
   192          ]
   193  
   194  
   195  initPut : Test
   196  initPut =
   197      let
   198          { tree, steps } =
   199              StepTree.init Routes.HighlightNothing
   200                  emptyResources
   201                  { id = "some-id"
   202                  , step = BuildStepPut "some-name"
   203                  }
   204      in
   205      describe "init with Put"
   206          [ test "the tree" <|
   207              \_ ->
   208                  Expect.equal (Models.Put "some-id") tree
   209          , test "the step" <|
   210              \_ ->
   211                  assertSteps [ ( "some-id", someStep "some-id" "some-name" Models.StepStatePending ) ] steps
   212          ]
   213  
   214  
   215  initAggregate : Test
   216  initAggregate =
   217      let
   218          { tree, steps } =
   219              StepTree.init Routes.HighlightNothing
   220                  emptyResources
   221                  { id = "aggregate-id"
   222                  , step =
   223                      BuildStepAggregate
   224                          << Array.fromList
   225                      <|
   226                          [ { id = "task-a-id", step = BuildStepTask "task-a" }
   227                          , { id = "task-b-id", step = BuildStepTask "task-b" }
   228                          ]
   229                  }
   230      in
   231      describe "init with Aggregate"
   232          [ test "the tree" <|
   233              \_ ->
   234                  Expect.equal
   235                      (Models.Aggregate
   236                          << Array.fromList
   237                       <|
   238                          [ Models.Task "task-a-id"
   239                          , Models.Task "task-b-id"
   240                          ]
   241                      )
   242                      tree
   243          , test "the steps" <|
   244              \_ ->
   245                  assertSteps
   246                      [ ( "task-a-id", someStep "task-a-id" "task-a" Models.StepStatePending )
   247                      , ( "task-b-id", someStep "task-b-id" "task-b" Models.StepStatePending )
   248                      ]
   249                      steps
   250          ]
   251  
   252  
   253  initAggregateNested : Test
   254  initAggregateNested =
   255      let
   256          { tree, steps } =
   257              StepTree.init Routes.HighlightNothing
   258                  emptyResources
   259                  { id = "aggregate-id"
   260                  , step =
   261                      BuildStepAggregate
   262                          << Array.fromList
   263                      <|
   264                          [ { id = "task-a-id", step = BuildStepTask "task-a" }
   265                          , { id = "task-b-id", step = BuildStepTask "task-b" }
   266                          , { id = "nested-aggregate-id"
   267                            , step =
   268                                  BuildStepAggregate
   269                                      << Array.fromList
   270                                  <|
   271                                      [ { id = "task-c-id", step = BuildStepTask "task-c" }
   272                                      , { id = "task-d-id", step = BuildStepTask "task-d" }
   273                                      ]
   274                            }
   275                          ]
   276                  }
   277      in
   278      describe "init with Aggregate nested"
   279          [ test "the tree" <|
   280              \_ ->
   281                  Expect.equal
   282                      (Models.Aggregate
   283                          << Array.fromList
   284                       <|
   285                          [ Models.Task "task-a-id"
   286                          , Models.Task "task-b-id"
   287                          , Models.Aggregate
   288                              << Array.fromList
   289                            <|
   290                              [ Models.Task "task-c-id"
   291                              , Models.Task "task-d-id"
   292                              ]
   293                          ]
   294                      )
   295                      tree
   296          , test "the steps" <|
   297              \_ ->
   298                  assertSteps
   299                      [ ( "task-a-id", someStep "task-a-id" "task-a" Models.StepStatePending )
   300                      , ( "task-b-id", someStep "task-b-id" "task-b" Models.StepStatePending )
   301                      , ( "task-c-id", someStep "task-c-id" "task-c" Models.StepStatePending )
   302                      , ( "task-d-id", someStep "task-d-id" "task-d" Models.StepStatePending )
   303                      ]
   304                      steps
   305          ]
   306  
   307  
   308  initAcross : Test
   309  initAcross =
   310      let
   311          { tree, steps } =
   312              StepTree.init Routes.HighlightNothing
   313                  emptyResources
   314                  { id = "across-id"
   315                  , step =
   316                      BuildStepAcross
   317                          { vars = [ "var" ]
   318                          , steps =
   319                              [ ( [ JsonString "v1" ]
   320                                , { id = "task-a-id", step = BuildStepTask "task-a" }
   321                                )
   322                              , ( [ JsonString "v2" ]
   323                                , { id = "task-b-id", step = BuildStepTask "task-b" }
   324                                )
   325                              ]
   326                          }
   327                  }
   328      in
   329      describe "init with Across"
   330          [ test "the tree" <|
   331              \_ ->
   332                  Expect.equal
   333                      (Models.Across "across-id"
   334                          [ "var" ]
   335                          [ [ JsonString "v1" ], [ JsonString "v2" ] ]
   336                          << Array.fromList
   337                       <|
   338                          [ Models.Task "task-a-id"
   339                          , Models.Task "task-b-id"
   340                          ]
   341                      )
   342                      tree
   343          , test "the steps" <|
   344              \_ ->
   345                  assertSteps
   346                      [ ( "across-id", someStep "across-id" "var" Models.StepStatePending )
   347                      , ( "task-a-id", someExpandedStep "task-a-id" "task-a" Models.StepStatePending )
   348                      , ( "task-b-id", someExpandedStep "task-b-id" "task-b" Models.StepStatePending )
   349                      ]
   350                      steps
   351          ]
   352  
   353  
   354  initAcrossNested : Test
   355  initAcrossNested =
   356      let
   357          { tree, steps } =
   358              StepTree.init Routes.HighlightNothing
   359                  emptyResources
   360                  { id = "across-id"
   361                  , step =
   362                      BuildStepAcross
   363                          { vars = [ "var1" ]
   364                          , steps =
   365                              [ ( [ JsonString "a1" ]
   366                                , { id = "nested-across-id"
   367                                  , step =
   368                                      BuildStepAcross
   369                                          { vars = [ "var2" ]
   370                                          , steps =
   371                                              [ ( [ JsonString "b1" ]
   372                                                , { id = "task-a-id", step = BuildStepTask "task-a" }
   373                                                )
   374                                              , ( [ JsonString "b2" ]
   375                                                , { id = "task-b-id", step = BuildStepTask "task-b" }
   376                                                )
   377                                              ]
   378                                          }
   379                                  }
   380                                )
   381                              ]
   382                          }
   383                  }
   384      in
   385      describe "init with nested Across"
   386          [ test "the tree" <|
   387              \_ ->
   388                  Expect.equal
   389                      (Models.Across "across-id"
   390                          [ "var1" ]
   391                          [ [ JsonString "a1" ] ]
   392                          << Array.fromList
   393                       <|
   394                          [ Models.Across "nested-across-id"
   395                              [ "var2" ]
   396                              [ [ JsonString "b1" ], [ JsonString "b2" ] ]
   397                              << Array.fromList
   398                            <|
   399                              [ Models.Task "task-a-id"
   400                              , Models.Task "task-b-id"
   401                              ]
   402                          ]
   403                      )
   404                      tree
   405          , test "the steps" <|
   406              \_ ->
   407                  assertSteps
   408                      [ ( "across-id", someStep "across-id" "var1" Models.StepStatePending )
   409                      , ( "nested-across-id", someExpandedStep "nested-across-id" "var2" Models.StepStatePending )
   410                      , ( "task-a-id", someExpandedStep "task-a-id" "task-a" Models.StepStatePending )
   411                      , ( "task-b-id", someExpandedStep "task-b-id" "task-b" Models.StepStatePending )
   412                      ]
   413                      steps
   414          ]
   415  
   416  
   417  initAcrossWithDo : Test
   418  initAcrossWithDo =
   419      let
   420          { tree, steps } =
   421              StepTree.init Routes.HighlightNothing
   422                  emptyResources
   423                  { id = "across-id"
   424                  , step =
   425                      BuildStepAcross
   426                          { vars = [ "var" ]
   427                          , steps =
   428                              [ ( [ JsonString "v1" ]
   429                                , { id = "do-id"
   430                                  , step =
   431                                      BuildStepDo <|
   432                                          Array.fromList
   433                                              [ { id = "task-a-id", step = BuildStepTask "task-a" }
   434                                              , { id = "task-b-id", step = BuildStepTask "task-b" }
   435                                              ]
   436                                  }
   437                                )
   438                              ]
   439                          }
   440                  }
   441      in
   442      describe "init Across with Do substep"
   443          [ test "does not expand substeps" <|
   444              \_ ->
   445                  Expect.equal
   446                      (Models.Across "across-id"
   447                          [ "var" ]
   448                          [ [ JsonString "v1" ] ]
   449                          << Array.fromList
   450                       <|
   451                          [ Models.Do <|
   452                              Array.fromList
   453                                  [ Models.Task "task-a-id"
   454                                  , Models.Task "task-b-id"
   455                                  ]
   456                          ]
   457                      )
   458                      tree
   459          , test "the steps" <|
   460              \_ ->
   461                  assertSteps
   462                      [ ( "across-id", someStep "across-id" "var" Models.StepStatePending )
   463                      , ( "task-a-id", someStep "task-a-id" "task-a" Models.StepStatePending )
   464                      , ( "task-b-id", someStep "task-b-id" "task-b" Models.StepStatePending )
   465                      ]
   466                      steps
   467          ]
   468  
   469  
   470  initInParallel : Test
   471  initInParallel =
   472      let
   473          { tree, steps } =
   474              StepTree.init Routes.HighlightNothing
   475                  emptyResources
   476                  { id = "parallel-id"
   477                  , step =
   478                      BuildStepInParallel
   479                          << Array.fromList
   480                      <|
   481                          [ { id = "task-a-id", step = BuildStepTask "task-a" }
   482                          , { id = "task-b-id", step = BuildStepTask "task-b" }
   483                          ]
   484                  }
   485      in
   486      describe "init with Parallel"
   487          [ test "the tree" <|
   488              \_ ->
   489                  Expect.equal
   490                      (Models.InParallel
   491                          << Array.fromList
   492                       <|
   493                          [ Models.Task "task-a-id"
   494                          , Models.Task "task-b-id"
   495                          ]
   496                      )
   497                      tree
   498          , test "the steps" <|
   499              \_ ->
   500                  assertSteps
   501                      [ ( "task-a-id", someStep "task-a-id" "task-a" Models.StepStatePending )
   502                      , ( "task-b-id", someStep "task-b-id" "task-b" Models.StepStatePending )
   503                      ]
   504                      steps
   505          ]
   506  
   507  
   508  initInParallelNested : Test
   509  initInParallelNested =
   510      let
   511          { tree, steps } =
   512              StepTree.init Routes.HighlightNothing
   513                  emptyResources
   514                  { id = "parallel-id"
   515                  , step =
   516                      BuildStepInParallel
   517                          << Array.fromList
   518                      <|
   519                          [ { id = "task-a-id", step = BuildStepTask "task-a" }
   520                          , { id = "task-b-id", step = BuildStepTask "task-b" }
   521                          , { id = "nested-parallel-id"
   522                            , step =
   523                                  BuildStepInParallel
   524                                      << Array.fromList
   525                                  <|
   526                                      [ { id = "task-c-id", step = BuildStepTask "task-c" }
   527                                      , { id = "task-d-id", step = BuildStepTask "task-d" }
   528                                      ]
   529                            }
   530                          ]
   531                  }
   532      in
   533      describe "init with Parallel nested"
   534          [ test "the tree" <|
   535              \_ ->
   536                  Expect.equal
   537                      (Models.InParallel
   538                          << Array.fromList
   539                       <|
   540                          [ Models.Task "task-a-id"
   541                          , Models.Task "task-b-id"
   542                          , Models.InParallel
   543                              << Array.fromList
   544                            <|
   545                              [ Models.Task "task-c-id"
   546                              , Models.Task "task-d-id"
   547                              ]
   548                          ]
   549                      )
   550                      tree
   551          , test "the steps" <|
   552              \_ ->
   553                  assertSteps
   554                      [ ( "task-a-id", someStep "task-a-id" "task-a" Models.StepStatePending )
   555                      , ( "task-b-id", someStep "task-b-id" "task-b" Models.StepStatePending )
   556                      , ( "task-c-id", someStep "task-c-id" "task-c" Models.StepStatePending )
   557                      , ( "task-d-id", someStep "task-d-id" "task-d" Models.StepStatePending )
   558                      ]
   559                      steps
   560          ]
   561  
   562  
   563  initOnSuccess : Test
   564  initOnSuccess =
   565      let
   566          { tree, steps } =
   567              StepTree.init Routes.HighlightNothing
   568                  emptyResources
   569                  { id = "on-success-id"
   570                  , step =
   571                      BuildStepOnSuccess <|
   572                          HookedPlan
   573                              { id = "task-a-id", step = BuildStepTask "task-a" }
   574                              { id = "task-b-id", step = BuildStepTask "task-b" }
   575                  }
   576      in
   577      describe "init with OnSuccess"
   578          [ test "the tree" <|
   579              \_ ->
   580                  Expect.equal
   581                      (Models.OnSuccess <|
   582                          Models.HookedStep
   583                              (Models.Task "task-a-id")
   584                              (Models.Task "task-b-id")
   585                      )
   586                      tree
   587          , test "the steps" <|
   588              \_ ->
   589                  assertSteps
   590                      [ ( "task-a-id", someStep "task-a-id" "task-a" Models.StepStatePending )
   591                      , ( "task-b-id", someStep "task-b-id" "task-b" Models.StepStatePending )
   592                      ]
   593                      steps
   594          ]
   595  
   596  
   597  initOnFailure : Test
   598  initOnFailure =
   599      let
   600          { tree, steps } =
   601              StepTree.init Routes.HighlightNothing
   602                  emptyResources
   603                  { id = "on-success-id"
   604                  , step =
   605                      BuildStepOnFailure <|
   606                          HookedPlan
   607                              { id = "task-a-id", step = BuildStepTask "task-a" }
   608                              { id = "task-b-id", step = BuildStepTask "task-b" }
   609                  }
   610      in
   611      describe "init with OnFailure"
   612          [ test "the tree" <|
   613              \_ ->
   614                  Expect.equal
   615                      (Models.OnFailure <|
   616                          Models.HookedStep
   617                              (Models.Task "task-a-id")
   618                              (Models.Task "task-b-id")
   619                      )
   620                      tree
   621          , test "the steps" <|
   622              \_ ->
   623                  assertSteps
   624                      [ ( "task-a-id", someStep "task-a-id" "task-a" Models.StepStatePending )
   625                      , ( "task-b-id", someStep "task-b-id" "task-b" Models.StepStatePending )
   626                      ]
   627                      steps
   628          ]
   629  
   630  
   631  initEnsure : Test
   632  initEnsure =
   633      let
   634          { tree, steps } =
   635              StepTree.init Routes.HighlightNothing
   636                  emptyResources
   637                  { id = "on-success-id"
   638                  , step =
   639                      BuildStepEnsure <|
   640                          HookedPlan
   641                              { id = "task-a-id", step = BuildStepTask "task-a" }
   642                              { id = "task-b-id", step = BuildStepTask "task-b" }
   643                  }
   644      in
   645      describe "init with Ensure"
   646          [ test "the tree" <|
   647              \_ ->
   648                  Expect.equal
   649                      (Models.Ensure <|
   650                          Models.HookedStep
   651                              (Models.Task "task-a-id")
   652                              (Models.Task "task-b-id")
   653                      )
   654                      tree
   655          , test "the steps" <|
   656              \_ ->
   657                  assertSteps
   658                      [ ( "task-a-id", someStep "task-a-id" "task-a" Models.StepStatePending )
   659                      , ( "task-b-id", someStep "task-b-id" "task-b" Models.StepStatePending )
   660                      ]
   661                      steps
   662          ]
   663  
   664  
   665  initTry : Test
   666  initTry =
   667      let
   668          { tree, steps } =
   669              StepTree.init Routes.HighlightNothing
   670                  emptyResources
   671                  { id = "on-success-id"
   672                  , step =
   673                      BuildStepTry { id = "task-a-id", step = BuildStepTask "task-a" }
   674                  }
   675      in
   676      describe "init with Try"
   677          [ test "the tree" <|
   678              \_ ->
   679                  Expect.equal
   680                      (Models.Try <|
   681                          Models.Task "task-a-id"
   682                      )
   683                      tree
   684          , test "the steps" <|
   685              \_ ->
   686                  assertSteps
   687                      [ ( "task-a-id", someStep "task-a-id" "task-a" Models.StepStatePending )
   688                      ]
   689                      steps
   690          ]
   691  
   692  
   693  initTimeout : Test
   694  initTimeout =
   695      let
   696          { tree, steps } =
   697              StepTree.init Routes.HighlightNothing
   698                  emptyResources
   699                  { id = "on-success-id"
   700                  , step =
   701                      BuildStepTimeout { id = "task-a-id", step = BuildStepTask "task-a" }
   702                  }
   703      in
   704      describe "init with Timeout"
   705          [ test "the tree" <|
   706              \_ ->
   707                  Expect.equal
   708                      (Models.Timeout <|
   709                          Models.Task "task-a-id"
   710                      )
   711                      tree
   712          , test "the steps" <|
   713              \_ ->
   714                  assertSteps
   715                      [ ( "task-a-id", someStep "task-a-id" "task-a" Models.StepStatePending )
   716                      ]
   717                      steps
   718          ]
   719  
   720  
   721  assertSteps : List ( Routes.StepID, Models.Step ) -> Dict Routes.StepID Models.Step -> Expectation
   722  assertSteps expected actual =
   723      Expect.equalDicts (Dict.fromList expected) actual
   724  
   725  
   726  cookedLog : Ansi.Log.Model
   727  cookedLog =
   728      Ansi.Log.init Ansi.Log.Cooked