name: Run Tests on: push: branches: - main pull_request: branches: - main jobs: test: runs-on: docker container: image: ruby:3.3-alpine defaults: run: working-directory: ./app steps: - name: Install system dependencies including Node.js run: | # Detect package manager and install dependencies if command -v apk >/dev/null 2>&1; then # Alpine Linux apk add --no-cache build-base libffi-dev linux-headers postgresql-dev git curl tzdata nodejs npm elif command -v apt-get >/dev/null 2>&1; then # Debian/Ubuntu apt-get update && apt-get install -y build-essential libffi-dev libpq-dev git curl tzdata nodejs npm elif command -v yum >/dev/null 2>&1; then # CentOS/RHEL yum install -y gcc make libffi-devel postgresql-devel git curl tzdata nodejs npm elif command -v dnf >/dev/null 2>&1; then # Fedora dnf install -y gcc make libffi-devel postgresql-devel git curl tzdata nodejs npm else echo "Package manager not found. Installing Node.js manually..." curl -fsSL https://deb.nodesource.com/setup_18.x | bash - apt-get install -y nodejs || echo "Failed to install Node.js" fi - name: Checkout repository uses: actions/checkout@v4 - name: Install bundler run: gem install bundler -v 2.6.7 - name: Cache Ruby gems uses: actions/cache@v4 with: path: app/vendor/bundle key: ${{ runner.os }}-gems-${{ hashFiles('app/Gemfile.lock') }} restore-keys: | ${{ runner.os }}-gems- - name: Install Ruby dependencies run: | bundle config path vendor/bundle bundle install --jobs 4 --retry 3 - name: Run unit tests run: | echo "๐Ÿงช Running unit tests..." bundle exec rspec spec/unit/ --format documentation - name: Run integration tests run: | echo "๐Ÿงช Running integration tests..." bundle exec rspec spec/integration/ --format documentation - name: Generate coverage report run: | echo "๐Ÿ“Š Generating coverage report..." COVERAGE=true bundle exec rspec --format progress - name: Upload coverage results uses: actions/upload-artifact@v4 if: always() with: name: coverage-report path: app/coverage/