name: Test
on:
  push:
    branches:
      - main
    paths-ignore:
      - '**.md'
  pull_request:
    paths-ignore:
      - '**.md'

jobs:

  build:
    name: Build

    strategy:
      matrix:
        runs-on: [ubuntu-latest, macos-latest, windows-latest]
      fail-fast: false

    runs-on: ${{ matrix.runs-on }}

    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Setup Node 16
      uses: actions/setup-node@v3
      with:
        node-version: 16.x
        cache: 'npm'

    - name: Install dependencies
      run: npm ci

    - name: Compile
      run: npm run build

    - name: Lint
      run: npm run lint

    - name: Format
      run: npm run format-check

    - name: Test
      run: npm run test

    # Test end-to-end by uploading two artifacts and then downloading them
    - name: Create artifact files
      run: |
        mkdir -p path/to/dir-1
        mkdir -p path/to/dir-2
        mkdir -p path/to/dir-3
        echo "Lorem ipsum dolor sit amet" > path/to/dir-1/file1.txt
        echo "Hello world from file #2" > path/to/dir-2/file2.txt
        echo "This is a going to be a test for a large enough file that should get compressed with GZip. The @actions/artifact package uses GZip to upload files. This text should have a compression ratio greater than 100% so it should get uploaded using GZip" > path/to/dir-3/gzip.txt

    # Upload a single file artifact
    - name: 'Upload artifact #1'
      uses: ./
      with:
        name: 'Artifact-A'
        path: path/to/dir-1/file1.txt

    # Upload using a wildcard pattern, name should default to 'artifact' if not provided
    - name: 'Upload artifact #2'
      uses: ./
      with:
        path: path/**/dir*/

    # Upload a directory that contains a file that will be uploaded with GZip
    - name: 'Upload artifact #3'
      uses: ./
      with:
        name: 'GZip-Artifact'
        path: path/to/dir-3/

    # Upload a directory that contains a file that will be uploaded with GZip
    - name: 'Upload artifact #4'
      uses: ./
      with:
        name: 'Multi-Path-Artifact'
        path: |
          path/to/dir-1/*
          path/to/dir-[23]/*
          !path/to/dir-3/*.txt

    # Download Artifact #1 and verify the correctness of the content
    - name: 'Download artifact #1'
      uses: actions/download-artifact@v3
      with:
        name: 'Artifact-A'
        path: some/new/path

    - name: 'Verify Artifact #1'
      run: |
        $file = "some/new/path/file1.txt"
        if(!(Test-Path -path $file))
        {
            Write-Error "Expected file does not exist"
        }
        if(!((Get-Content $file) -ceq "Lorem ipsum dolor sit amet"))
        {
            Write-Error "File contents of downloaded artifact are incorrect"
        }
      shell: pwsh

    # Download Artifact #2 and verify the correctness of the content
    - name: 'Download artifact #2'
      uses: actions/download-artifact@v3
      with:
        name: 'artifact'
        path: some/other/path

    - name: 'Verify Artifact #2'
      run: |
        $file1 = "some/other/path/to/dir-1/file1.txt"
        $file2 = "some/other/path/to/dir-2/file2.txt"
        if(!(Test-Path -path $file1) -or !(Test-Path -path $file2))
        {
            Write-Error "Expected files do not exist"
        }
        if(!((Get-Content $file1) -ceq "Lorem ipsum dolor sit amet") -or !((Get-Content $file2) -ceq "Hello world from file #2"))
        {
            Write-Error "File contents of downloaded artifacts are incorrect"
        }
      shell: pwsh

    # Download Artifact #3 and verify the correctness of the content
    - name: 'Download artifact #3'
      uses: actions/download-artifact@v3
      with:
        name: 'GZip-Artifact'
        path: gzip/artifact/path

    # Because a directory was used as input during the upload the parent directories, path/to/dir-3/, should not be included in the uploaded artifact
    - name: 'Verify Artifact #3'
      run: |
        $gzipFile = "gzip/artifact/path/gzip.txt"
        if(!(Test-Path -path $gzipFile))
        {
            Write-Error "Expected file do not exist"
        }
        if(!((Get-Content $gzipFile) -ceq "This is a going to be a test for a large enough file that should get compressed with GZip. The @actions/artifact package uses GZip to upload files. This text should have a compression ratio greater than 100% so it should get uploaded using GZip"))
        {
            Write-Error "File contents of downloaded artifact is incorrect"
        }
      shell: pwsh

    - name: 'Download artifact #4'
      uses: actions/download-artifact@v3
      with:
        name: 'Multi-Path-Artifact'
        path: multi/artifact

    - name: 'Verify Artifact #4'
      run: |
        $file1 = "multi/artifact/dir-1/file1.txt"
        $file2 = "multi/artifact/dir-2/file2.txt"
        if(!(Test-Path -path $file1) -or !(Test-Path -path $file2))
        {
            Write-Error "Expected files do not exist"
        }
        if(!((Get-Content $file1) -ceq "Lorem ipsum dolor sit amet") -or !((Get-Content $file2) -ceq "Hello world from file #2"))
        {
            Write-Error "File contents of downloaded artifacts are incorrect"
        }
      shell: pwsh
