name: Run tests on: pull_request_target: paths: # run tests only when the python code has changed - 'src/**.py' - 'tests/**.py' workflow_dispatch: jobs: offline-tests: name: offline strategy: matrix: platform: [ubuntu-latest, macos-latest] python-version: ['3.7', '3.11'] runs-on: ${{ matrix.platform }} steps: - name: Checkout merge commit uses: actions/checkout@v3 if: github.event_name == 'pull_request_target' with: ref: 'refs/pull/${{ github.event.number }}/merge' persist-credentials: false - name: Checkout head commit uses: actions/checkout@v3 if: github.event_name != 'pull_request_target' - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4.5.0 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip python -m pip install -U .[test] - name: Test with pytest run: | python -m pytest --cov=maestral --cov-report=xml tests/offline - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: file: ./coverage.xml flags: pytest env_vars: OS,PYTHON,TYPE name: pytests -v env: OS: ${{ matrix.platform }} PYTHON: ${{ matrix.python-version }} TYPE: 'offline' linked-unit-tests: name: Linked unit tests needs: offline-tests strategy: fail-fast: false matrix: platform: [ubuntu-latest, macos-latest] include: - platform: ubuntu-latest token: DROPBOX_REFRESH_TOKEN_1 - platform: macos-latest token: DROPBOX_REFRESH_TOKEN_2 runs-on: ${{ matrix.platform }} steps: - name: Checkout merge commit uses: actions/checkout@v3 if: github.event_name == 'pull_request_target' with: ref: 'refs/pull/${{ github.event.number }}/merge' persist-credentials: false - name: Checkout head commit uses: actions/checkout@v3 if: github.event_name != 'pull_request_target' - name: Set up Python 3.11 uses: actions/setup-python@v4.5.0 with: python-version: '3.11' - name: Install dependencies run: | python -m pip install --upgrade pip python -m pip install -U .[test] - name: Get short-lived Oauth2 access token # We generate a short-lived auth token which is passed to the test runner as # an environment variable. At no point does the test code, potentially from an # untrusted 3rd party, get access to a long-lived token. run: | auth_result=$(curl https://api.dropbox.com/oauth2/token \ -d grant_type=refresh_token \ -d refresh_token=${{ secrets[matrix.token] }} \ -d client_id=2jmbq42w7vof78h) token=$(echo $auth_result | python -c "import sys, json; print(json.load(sys.stdin)['access_token'])") echo "::add-mask::$token" echo "DROPBOX_ACCESS_TOKEN=$token" >> $GITHUB_ENV - name: Test with pytest run: | pytest -v --cov=maestral --cov-report=xml tests/linked/unit - name: Upload Code Coverage uses: codecov/codecov-action@v3 with: file: ./coverage.xml flags: pytest env_vars: OS,PYTHON,TYPE name: pytests env: OS: ${{ matrix.platform }} PYTHON: ${{ matrix.python-version }} TYPE: 'linked-unit-tests' linked-integration-tests: name: Linked integration tests needs: linked-unit-tests strategy: fail-fast: false matrix: observer: [inotify, fsevents] include: - observer: inotify platform: ubuntu-latest token: DROPBOX_REFRESH_TOKEN_1 - observer: fsevents platform: macos-latest token: DROPBOX_REFRESH_TOKEN_2 # - observer: kqueue # platform: macos-latest # token: DROPBOX_REFRESH_TOKEN_3 runs-on: ${{ matrix.platform }} steps: - name: Checkout merge commit uses: actions/checkout@v3 if: github.event_name == 'pull_request_target' with: ref: 'refs/pull/${{ github.event.number }}/merge' persist-credentials: false - name: Checkout head commit uses: actions/checkout@v3 if: github.event_name != 'pull_request_target' - name: Set up Python 3.11 uses: actions/setup-python@v4.5.0 with: python-version: '3.11' - name: Install dependencies run: | python -m pip install --upgrade pip python -m pip install -U .[test] - name: Get short-lived Dropbox token # We generate a short-lived auth token which is passed to the test runner as # an environment variable. At no point does the test code, potentially from a # malicious PR, get access to a long-lived token. run: | auth_result=$(curl https://api.dropbox.com/oauth2/token \ -d grant_type=refresh_token \ -d refresh_token=${{ secrets[matrix.token] }} \ -d client_id=2jmbq42w7vof78h) token=$(echo $auth_result | python -c "import sys, json; print(json.load(sys.stdin)['access_token'])") echo "::add-mask::$token" echo "DROPBOX_ACCESS_TOKEN=$token" >> $GITHUB_ENV - name: Test with pytest run: | pytest --verbose --cov=maestral --cov-report=xml tests/linked/integration --fs-observer ${{ matrix.observer }} - name: Upload Code Coverage uses: codecov/codecov-action@v3 with: file: ./coverage.xml flags: pytest env_vars: OS,PYTHON,TYPE name: pytests env: OS: ${{ matrix.platform }} PYTHON: ${{ matrix.python-version }} TYPE: 'linked-integration-tests'