# Copyright The ORAS Authors.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Tests

on:
  push:
    branches:
      - main
      - release-*
  pull_request:
    branches:
      - main
      - release-*

defaults:
  run:
    shell: bash

jobs:
  test-basic-setup:
    name: Test Setup ORAS CLI
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-latest, windows-latest, ubuntu-latest]
        version:
          - 1.1.0
          - 1.2.3
      fail-fast: true
    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Setup ORAS v${{ matrix.version }}
      uses: ./
      with:
        version: ${{ matrix.version }}

    - name: Verify ORAS version installed
      env:
        ORAS_VERSION_EXPECTED: ${{ matrix.version }}
      run: |
        echo ---
        oras version
        echo ---
        read -ra ORAS_VERSION_INSTALLED <<<$(oras version)
        [ "${ORAS_VERSION_INSTALLED[1]}" == "$ORAS_VERSION_EXPECTED" ]

  create-test-variables:
    runs-on: ubuntu-latest
    outputs:
      url: ${{ steps.get-checksum-url.outputs.URL }}
      checksum: ${{ steps.get-checksum-url.outputs.CHECKSUM }}
    steps:
      - id: checkout
        uses: actions/checkout@v4
      - id: get-checksum-url
        run: |
          RELEASE=$(jq -r 'keys_unsorted[0] as $k | .[$k].linux.amd64' src/lib/data/releases.json)
          echo "CHECKSUM=$(echo $RELEASE | jq -r '.checksum')" >> "$GITHUB_OUTPUT"
          echo "URL=$(echo $RELEASE | jq -r '.url')" >> "$GITHUB_OUTPUT"

  test-custom-url:
    name: Test Setup using URL
    runs-on: ubuntu-latest
    needs: create-test-variables
    steps:
    - name: Checkout
      uses: actions/checkout@v4

    - name: Setup ORAS using URL
      uses: ./
      with:
        url: ${{ needs.create-test-variables.outputs.url }}
        checksum: ${{ needs.create-test-variables.outputs.checksum }}

    - name: Setup ORAS using URL without checksum
      id: no-checksum
      continue-on-error: true
      uses: ./
      with:
        url: ${{ needs.create-test-variables.outputs.url }}
    - name: 'Should Fail: Setup ORAS using URL without checksum'
      if: steps.no-checksum.outcome != 'failure'
      run: |
        echo "Setup ORAS using URL without checksum should fail, but succeeded."
        exit 1
    
    - name: Setup ORAS using checksum without url
      id: no-url
      continue-on-error: true
      uses: ./
      with:
        checksum: ${{ needs.create-test-variables.outputs.checksum }}
    - name: 'Should Fail: Setup ORAS using checksum without url'
      if: steps.no-url.outcome != 'failure'
      run: |
        echo "Setup ORAS using checksum without url should fail, but succeeded."
        exit 1
    
    - name: Setup ORAS using URL and invalid checksum
      id: invalid-checksum
      continue-on-error: true
      uses: ./
      with:
        url: ${{ needs.create-test-variables.outputs.url }}
        checksum: abcedf
    - name: 'Should Fail: Setup ORAS using URL and invalid checksum'
      if: steps.invalid-checksum.outcome != 'failure'
      run: |
        echo "Setup ORAS using URL and invalid checksum should fail, but succeeded."
        exit 1
    
    - name: Setup ORAS using invalid URL
      id: invalid-url
      continue-on-error: true
      uses: ./
      with:
        url: invalid-url
        checksum: test
    - name: 'Should Fail: Setup ORAS using invalid URL'
      if: steps.invalid-url.outcome != 'failure'
      run: |
        echo "Setup ORAS using invalid URL should fail, but succeeded."
        exit 1