Skip to content

Add Integration Test #7

Add Integration Test

Add Integration Test #7

name: iOS Tests
on:
pull_request:
jobs:
test:
name: Run Xcode Tests
runs-on: macos-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Select Xcode
run: sudo xcode-select -s /Applications/Xcode.app
- name: Get Available Destination
id: get-destination
run: |
# Get all available destinations and save to a file
xcodebuild -scheme "Xendit-Package" -showdestinations | tee destinations.txt
# Print all destinations for debugging
echo "Available destinations:"
cat destinations.txt
# Extract simulator with latest OS (works for both iPhone and iPhone SE)
DESTINATION=$(grep -E "platform:iOS Simulator.*name:iPhone" destinations.txt | \
sort -t':' -k4,4V | \
tail -n1 | \
sed -e 's/^[[:space:]]*//' | \
sed -e 's/[[:space:]]*$//' | \
sed -e 's/[{}]//g' | \
sed -e 's/platform:/platform=/g' | \
sed -e 's/id:/id=/g' | \
sed -e 's/, /,/g' | \
sed -e 's/,OS.*//g' | \
xargs)
if [ -z "$DESTINATION" ]; then
echo "Error: No iPhone simulator destination found!"
echo "Available destinations were:"
cat destinations.txt
exit 1
fi
# Set the destination as an output
echo "DESTINATION=$DESTINATION" >> "$GITHUB_OUTPUT"
# Print the selected destination for logging
echo "Selected destination: $DESTINATION"
- name: Build and Test
run: |
DESTINATION="${{ steps.get-destination.outputs.DESTINATION }}"
echo "Using destination: $DESTINATION"
xcodebuild test \
-scheme "Xendit-Package" \
-configuration Debug \
-destination "$DESTINATION" \
-enableCodeCoverage YES \
-resultBundlePath TestResults.xcresult \
clean test | xcpretty --report junit && exit ${PIPESTATUS[0]}
- name: Generate Test Report
if: success() || failure()
run: |
xcrun xcresulttool get --format json --path TestResults.xcresult > test_report.json
xcrun xccov view --report --json TestResults.xcresult > coverage_report.json
- name: Upload test results
if: always()
uses: actions/upload-artifact@v3
with:
name: test-results
path: |
test_report.json
coverage_report.json
TestResults.xcresult
build/reports/
destinations.txt
- name: Create Test Summary
if: always()
run: |
echo "### Test Results Summary" >> $GITHUB_STEP_SUMMARY
echo "---" >> $GITHUB_STEP_SUMMARY
echo "Using destination: ${{ steps.get-destination.outputs.DESTINATION }}" >> $GITHUB_STEP_SUMMARY
if [ -f "TestResults.xcresult" ]; then
# Get test results summary
echo "### Test Results" >> $GITHUB_STEP_SUMMARY
xcrun xcresulttool get --format human-readable --path TestResults.xcresult >> $GITHUB_STEP_SUMMARY
# Get failed tests if any
echo "### Failed Tests" >> $GITHUB_STEP_SUMMARY
xcrun xcresulttool get --format json --path TestResults.xcresult | \
jq -r '.. | select(.identifier? == "com.apple.xcode.tests.failed")? | .._message?' >> $GITHUB_STEP_SUMMARY
# Get code coverage if enabled
echo "### Code Coverage" >> $GITHUB_STEP_SUMMARY
xcrun xccov view --report --json TestResults.xcresult | \
jq -r '.targets[] | "- \(.name): \(.lineCoverage)%"' >> $GITHUB_STEP_SUMMARY
else
echo "❌ No test results found" >> $GITHUB_STEP_SUMMARY
fi
- name: Comment PR with Results
if: github.event_name == 'pull_request'
uses: actions/github-script@v6
with:
script: |
const fs = require('fs');
const testReport = JSON.parse(fs.readFileSync('test_report.json', 'utf8'));
let message = '';
const failures = testReport.actions.testsRef.tests
.filter(test => test.status === 'Failure')
.map(test => `- ${test.identifier}: ${test.message}`);
if (failures.length > 0) {
message = `### ❌ Test Failures\n\n${failures.join('\n')}`;
} else {
const coverage = JSON.parse(fs.readFileSync('coverage_report.json', 'utf8'));
const coverageSummary = coverage.targets
.map(target => `- ${target.name}: ${(target.lineCoverage * 100).toFixed(2)}%`)
.join('\n');
message = `### ✅ All Tests Passed!\n\n` +
`**Code Coverage:**\n${coverageSummary}\n\n` +
`Total tests: ${testReport.actions.testsRef.tests.length}`;
}
github.rest.issues.createComment({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.issue.number,
body: message
});