name: Run pre-release integ tests
on: 
    pull_request_target:
permissions:
    contents: read

jobs:
  oidc:
    if: ${{ github.event.pull_request.user.login == 'aws-sdk-osds' && github.repository == 'aws-actions/configure-aws-credentials' }}
    permissions: 
        id-token: write
    strategy: 
        fail-fast: false
        matrix:
            os: [windows-latest, ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    name: OIDC login test
    steps:
      - name: checkout
        uses: actions/checkout@v5
        with:
            fetch-depth: 0
            persist-credentials: false
      - name: Configure AWS credentials
        uses: ./
        with:
            aws-region: us-west-2
            role-to-assume: ${{ secrets.OIDC_integ_role }}
      - name: Get Caller Identity
        run: |
            aws sts get-caller-identity

  #can cut this test out if it's not necessary
  static_assumeRole:
    if: ${{ github.event.pull_request.user.login == 'aws-sdk-osds' && github.repository == 'aws-actions/configure-aws-credentials' }}
    strategy: 
        fail-fast: false
        matrix:
            os: [windows-latest, ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    name: Static IAM creds test
    steps:
      - name: checkout
        uses: actions/checkout@v5
        with:
            fetch-depth: 0
            persist-credentials: false
      - name: Configure AWS credentials
        uses: ./
        with:
            aws-region: us-west-2
            aws-access-key-id: ${{ secrets.STATIC_ak_id }}
            aws-secret-access-key: ${{ secrets.STATIC_secret_ak }}
            role-to-assume: ${{ secrets.STATIC_role }}
      - name: Get Caller Identity
        run: |
          aws sts get-caller-identity

  role_chaining:
    if: ${{ github.event.pull_request.user.login == 'aws-sdk-osds' && github.repository == 'aws-actions/configure-aws-credentials' }}
    permissions: 
        id-token: write
    strategy: 
        fail-fast: false
        matrix:
            os: [windows-latest, ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    name: Existing Creds + Role Chaining test
    steps:
      - name: checkout
        uses: actions/checkout@v5
        with:
            fetch-depth: 0
            persist-credentials: false    
      - name: Configure AWS credentials
        uses: ./
        with:
            aws-region: us-west-2
            role-to-assume: ${{ secrets.ROLE_chaining_1 }}
      - name: Get Caller Identity
        run: |
          aws sts get-caller-identity
      - name: assume second role
        uses: ./
        with:
            aws-region: us-west-2
            role-to-assume: ${{ secrets.ROLE_chaining_2 }}
            role-chaining: true
      - name: get caller identity
        run: |
          aws sts get-caller-identity

  inline_policy:
    if: ${{ github.event.pull_request.user.login == 'aws-sdk-osds' && github.repository == 'aws-actions/configure-aws-credentials' }}
    permissions: 
        id-token: write
    strategy: 
        fail-fast: false
        matrix:
            os: [ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    name: Inline Policy Test
    steps:
      - name: checkout
        uses: actions/checkout@v5
        with:
            fetch-depth: 0
            persist-credentials: false  
      - name: get creds w scoped down policy
        uses: ./
        with: 
            aws-region: us-west-2
            role-to-assume: ${{ secrets.INLINE_policy_role }}
            inline-session-policy: '{"Version":"2012-10-17","Statement":[{"Sid":"Stmt1","Effect":"Allow","Action":"s3:ListAllMyBuckets","Resource":"*"}]}'
    
      #NOTE: This step should succeed. The role should have permission only to list all buckets.
      - name: list buckets
        run: aws s3 ls > /dev/null

      #NOTE: This step should fail. we don't want the role to have permission to see the bucket contents.    
      - name: try to list bucket contents
        id: bucketContentsStep
        continue-on-error: true
        run: aws s3 ls s3://cawsc-integ-tests-bucket > /dev/null

      #But the test fails if we could list the bucket contents.
      - name: fail if we can list bucket contents
        if: steps.bucketContentsStep.outcome == 'success'
        run: exit 1

  http-proxy:
    if: ${{ github.event.pull_request.user.login == 'aws-sdk-osds' && github.repository == 'aws-actions/configure-aws-credentials' }}
    permissions:
        id-token: write
    runs-on: ubuntu-latest
    name: HTTP Proxy Test
    steps:
      - name: checkout
        uses: actions/checkout@v5
        with:
            fetch-depth: 0
            persist-credentials: false  
      - name: install tinyproxy
        run: |
          sudo apt-get update
          sudo apt-get -y install tinyproxy
      - name: start tinyproxy
        run: tinyproxy -c .github/integ_tests/tinyproxy.conf
      - name: Configure AWS credentials
        continue-on-error: true
        uses: ./
        with:
            aws-region: us-west-2
            role-to-assume: ${{ secrets.OIDC_integ_role }}
            http-proxy: http://127.0.0.1:9999
            retry-max-attempts: 4
      - name: checkout logs 
        run: cat integ_proxy_log.txt
      - name: check logs to see if successful call
        run: grep -q "Request" integ_proxy_log.txt && echo "PROXY_CALL_LOGGED=1" >> $GITHUB_ENV || echo "PROXY_CALL_LOGGED=0" >> $GITHUB_ENV
      - name: fail job if bad call 
        if: ${{ env.PROXY_CALL_LOGGED != 1 }}
        run: exit 1

  token-file:
    if: ${{ github.event.pull_request.user.login == 'aws-sdk-osds' && github.repository == 'aws-actions/configure-aws-credentials' }}
    permissions:
        id-token: write
    strategy: 
      fail-fast: false
      matrix:
        os: [windows-latest, ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    name: Token File Test
    steps:
      - name: checkout
        uses: actions/checkout@v5
        with:
            fetch-depth: 0
            persist-credentials: false
      - name: fetch token and write to file
        uses: actions/github-script@v7
        with:
          script: |
            const fs = require('fs');
            async function getIDTokenAction() {
              const id_token = await core.getIDToken("sts.amazonaws.com");
              return id_token;
            }
            const idToken = await getIDTokenAction();
            fs.writeFileSync(".github/integ_tests/integ_token.txt", idToken, (err) => {
              if (err) throw err;
            });
      - name: get creds with that file
        uses: ./
        with:
            aws-region: us-west-2
            role-to-assume: ${{ secrets.OIDC_integ_role }}
            web-identity-token-file: .github/integ_tests/integ_token.txt
            retry-max-attempts: 4
      - name: check creds
        run: aws sts get-caller-identity
