# file      : tests/ci/ci-load.testscript
# copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
# license   : MIT; see accompanying LICENSE file

.include data.testscript

: args
{
  : none
  :
  $* 2>>~%EOE% != 0
  %\[.+\] \[brep:error\] \[ref \] \[brep-ci-load\]: usage: .+brep-ci-load \[--result-url <url>\] <loader-path> \[<loader-options>\] <dir>%
  EOE

  : no-dir
  :
  $* brep-load 2>>~%EOE% != 0
  %\[.+\] \[brep:error\] \[ref brep-load\] \[brep-ci-load\]: usage: .+brep-ci-load \[--result-url <url>\] <loader-path> \[<loader-options>\] <dir>%
  EOE

  : dir-not-exist
  :
  $* brep-load $~/dir 2>>~%EOE% != 0
    %\[.+\] \[brep:error\] \[ref dir\] \[brep-ci-load\]: '.+dir' does not exist or is not a directory%
    EOE

  : slash-stripped
  :
  : Test that the trailing slash is stripped from the data directory path.
  :
  $* brep-load $~/dir/ 2>>~%EOE% != 0
    %\[.+\] \[brep:error\] \[ref dir\] \[brep-ci-load\]: '.+dir' does not exist or is not a directory%
    EOE
}

: success
:
{
  : simulate
  :
  {
    $clone_root_data;

    echo 'simulate: success' >+$data_dir/request.manifest;

    $* ./brep-load $data_dir >>"EOO";
      : 1
      status: 200
      message: CI request is queued
      reference: $request_id
      EOO

    test -d $data_dir != 0
  }

  : for-real
  :
  {
    # Create the loader script that validates the arguments passed and prints
    # the loadtab, repositories manifest, and packages manifest files to
    # stderr.
    #
    loader=$~/brep-load

    +cat <<"EOI" >=$loader
      #!/usr/bin/env bash
      if [ "\$#" != 7 -o \
           "\$1" != "--db-host=localhost" -o \
           "\$2" != "--db-port=8432" -o \
           "\$3" != "--force" -o \
           "\$4" != "--shallow" -o \
           "\$5" != "--tenant" -o \
           -z "\$6" -o \
           "\$7" != "$data_dir/loadtab" ]; then
        exit 1
      fi
      cat \
      "$data_dir/loadtab" \
      "$data_dir/cache/repositories.manifest" \
      "$data_dir/cache/packages.manifest" >&2
      EOI

    +chmod 755 $loader

    : whole-repo
    :
    {
      $clone_root_data;

      $* $loader --db-host=localhost --db-port=8432 $data_dir >>"EOO" 2>>~"%EOE%"
        : 1
        status: 200
        message: CI request is queued
        reference: $request_id
        EOO
        $rep hello cache:cache
        : 1
        summary: hello project repository
        : 1
        name: libhello
        version: 0.1.0
        project: hello
        summary: hello library
        license: TODO
        url: https://example.org/hello
        email: user@example.org
        %depends: \\* build2 .+%
        %depends: \\* bpkg .+%
        location: libhello
        %fragment: .+%
        :
        name: hello
        version: 0.1.0
        summary: hello executable
        license: TODO
        url: https://example.org/hello
        email: user@example.org
        %depends: \\* build2 .+%
        %depends: \\* bpkg .+%
        location: hello
        %fragment: .+%
        EOE
    }

    : package
    :
    {
      $clone_root_data;

      cat <<EOI >+$data_dir/request.manifest;
        package: hello
        EOI

      $* $loader --db-host=localhost --db-port=8432 $data_dir >>"EOO" 2>>~"%EOE%"
        : 1
        status: 200
        message: CI request is queued
        reference: $request_id
        EOO
        $rep hello cache:cache
        : 1
        summary: hello project repository
        : 1
        name: hello
        version: 0.1.0
        summary: hello executable
        license: TODO
        url: https://example.org/hello
        email: user@example.org
        %depends: \\* build2 .+%
        %depends: \\* bpkg .+%
        location: hello
        %fragment: .+%
        EOE
    }

    : package-version
    :
    {
      $clone_root_data;

      cat <<EOI >+$data_dir/request.manifest;
        package: libhello/0.1.0
        EOI

      $* $loader --db-host=localhost --db-port=8432 $data_dir >>"EOO" 2>>~"%EOE%"
        : 1
        status: 200
        message: CI request is queued
        reference: $request_id
        EOO
        $rep hello cache:cache
        : 1
        summary: hello project repository
        : 1
        name: libhello
        version: 0.1.0
        project: hello
        summary: hello library
        license: TODO
        url: https://example.org/hello
        email: user@example.org
        %depends: \\* build2 .+%
        %depends: \\* bpkg .+%
        location: libhello
        %fragment: .+%
        EOE
    }

    : result-url
    :
    {
      $clone_root_data;

      $* --result-url "http://example.com/" \
         $loader --db-host=localhost --db-port=8432 \
         $data_dir >>~"%EOO%" 2>>~%EOE%
        : 1
        status: 200
        %message: CI request is queued: http://example.com/@.+%
        %.
        reference: $request_id
        EOO
	%.*:.*%+
	EOE
    }
  }
}

: failure
:
{
  test.arguments += ./brep-load $data_dir

  : bad-simulate
  :
  {
    $clone_root_data_clean;

    echo 'simulate: fly' >+$data_dir/request.manifest;

    $* >>"EOO"
      : 1
      status: 400
      message: unrecognized simulation outcome 'fly'
      reference: $request_id
      EOO
  }

  : unable-fetch-repo
  :
  {
    $clone_root_data_clean;

    sed -i -e "s%^\(repository:\) .+\$%\\1 http://example.com/repo.git%" \
	$data_dir/request.manifest;

    $* >>~"%EOO%"
      : 1
      status: 422
      %message: unable to fetch repository information .+%
      %.*
      reference: $request_id
      EOO
  }

  : loader-not-exist
  :
  {
    $clone_root_data_clean;

    $* 2>~'%.*brep-load.*%' != 0
  }
}