Skip to content

Commit b01260e

Browse files
committed
Add comprehensive unit tests for services and main package
- Implement tests for the app service, including course processing from file and URI. - Create mock implementations for CourseParser and Exporter to facilitate testing. - Add tests for HTML cleaner service to validate HTML content cleaning functionality. - Develop tests for the parser service, covering course fetching and loading from files. - Introduce tests for utility functions in the main package, ensuring URI validation and string joining. - Include benchmarks for performance evaluation of key functions.
1 parent 9de7222 commit b01260e

File tree

17 files changed

+4421
-181
lines changed

17 files changed

+4421
-181
lines changed

.github/workflows/ci.yml

Lines changed: 206 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ name: CI
22

33
on:
44
push:
5-
branches: [ "master", "develop" ]
5+
branches: [ "master", "develop" ]
66
tags:
77
- "v*.*.*"
88
pull_request:
@@ -16,7 +16,11 @@ jobs:
1616
contents: write
1717
strategy:
1818
matrix:
19-
go: [1.21.x, 1.22.x, 1.23.x, 1.24.x]
19+
go:
20+
- 1.21.x
21+
- 1.22.x
22+
- 1.23.x
23+
- 1.24.x
2024

2125
steps:
2226
- uses: actions/checkout@v4
@@ -37,20 +41,171 @@ jobs:
3741
- name: Build
3842
run: go build -v ./...
3943

40-
- name: Run tests
41-
run: go test -v -race -coverprofile=coverage.out ./...
44+
- name: Run tests with enhanced reporting
45+
id: test
46+
run: |
47+
echo "## 🔧 Test Environment" >> $GITHUB_STEP_SUMMARY
48+
echo "- **Go Version:** ${{ matrix.go }}" >> $GITHUB_STEP_SUMMARY
49+
echo "- **OS:** ubuntu-latest" >> $GITHUB_STEP_SUMMARY
50+
echo "- **Timestamp:** $(date -u)" >> $GITHUB_STEP_SUMMARY
51+
echo "" >> $GITHUB_STEP_SUMMARY
52+
53+
echo "Running tests with coverage..."
54+
go test -v -race -coverprofile=coverage.out ./... 2>&1 | tee test-output.log
55+
56+
# Extract test results for summary
57+
TEST_STATUS=$?
58+
TOTAL_TESTS=$(grep -c "=== RUN" test-output.log || echo "0")
59+
PASSED_TESTS=$(grep -c "--- PASS:" test-output.log || echo "0")
60+
FAILED_TESTS=$(grep -c "--- FAIL:" test-output.log || echo "0")
61+
SKIPPED_TESTS=$(grep -c "--- SKIP:" test-output.log || echo "0")
62+
63+
# Generate test summary
64+
echo "## 🧪 Test Results (Go ${{ matrix.go }})" >> $GITHUB_STEP_SUMMARY
65+
echo "" >> $GITHUB_STEP_SUMMARY
66+
echo "| Metric | Value |" >> $GITHUB_STEP_SUMMARY
67+
echo "|--------|-------|" >> $GITHUB_STEP_SUMMARY
68+
echo "| Total Tests | $TOTAL_TESTS |" >> $GITHUB_STEP_SUMMARY
69+
echo "| Passed | ✅ $PASSED_TESTS |" >> $GITHUB_STEP_SUMMARY
70+
echo "| Failed | ❌ $FAILED_TESTS |" >> $GITHUB_STEP_SUMMARY
71+
echo "| Skipped | ⏭️ $SKIPPED_TESTS |" >> $GITHUB_STEP_SUMMARY
72+
echo "| Status | $([ $TEST_STATUS -eq 0 ] && echo "✅ PASSED" || echo "❌ FAILED") |" >> $GITHUB_STEP_SUMMARY
73+
echo "" >> $GITHUB_STEP_SUMMARY
74+
75+
# Add package breakdown
76+
echo "### 📦 Package Test Results" >> $GITHUB_STEP_SUMMARY
77+
echo "" >> $GITHUB_STEP_SUMMARY
78+
echo "| Package | Status |" >> $GITHUB_STEP_SUMMARY
79+
echo "|---------|--------|" >> $GITHUB_STEP_SUMMARY
80+
81+
# Extract package results
82+
grep "^ok\|^FAIL" test-output.log | while read line; do
83+
if [[ $line == ok* ]]; then
84+
pkg=$(echo $line | awk '{print $2}')
85+
echo "| $pkg | ✅ PASS |" >> $GITHUB_STEP_SUMMARY
86+
elif [[ $line == FAIL* ]]; then
87+
pkg=$(echo $line | awk '{print $2}')
88+
echo "| $pkg | ❌ FAIL |" >> $GITHUB_STEP_SUMMARY
89+
fi
90+
done
91+
92+
echo "" >> $GITHUB_STEP_SUMMARY
93+
94+
# Add detailed results if tests failed
95+
if [ $TEST_STATUS -ne 0 ]; then
96+
echo "### ❌ Failed Tests Details" >> $GITHUB_STEP_SUMMARY
97+
echo "" >> $GITHUB_STEP_SUMMARY
98+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
99+
grep -A 10 "--- FAIL:" test-output.log | head -100 >> $GITHUB_STEP_SUMMARY
100+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
101+
echo "" >> $GITHUB_STEP_SUMMARY
102+
fi
103+
104+
# Set outputs for other steps
105+
echo "test-status=$TEST_STATUS" >> $GITHUB_OUTPUT
106+
echo "total-tests=$TOTAL_TESTS" >> $GITHUB_OUTPUT
107+
echo "passed-tests=$PASSED_TESTS" >> $GITHUB_OUTPUT
108+
echo "failed-tests=$FAILED_TESTS" >> $GITHUB_OUTPUT
109+
110+
# Exit with the original test status
111+
exit $TEST_STATUS
112+
113+
- name: Generate coverage report
114+
if: always()
115+
run: |
116+
if [ -f coverage.out ]; then
117+
go tool cover -html=coverage.out -o coverage.html
118+
COVERAGE=$(go tool cover -func=coverage.out | grep total | awk '{print $3}')
119+
120+
echo "## 📊 Code Coverage (Go ${{ matrix.go }})" >> $GITHUB_STEP_SUMMARY
121+
echo "" >> $GITHUB_STEP_SUMMARY
122+
echo "**Total Coverage: $COVERAGE**" >> $GITHUB_STEP_SUMMARY
123+
echo "" >> $GITHUB_STEP_SUMMARY
124+
125+
# Add coverage by package
126+
echo "### 📋 Coverage by Package" >> $GITHUB_STEP_SUMMARY
127+
echo "" >> $GITHUB_STEP_SUMMARY
128+
echo "| Package | Coverage |" >> $GITHUB_STEP_SUMMARY
129+
echo "|---------|----------|" >> $GITHUB_STEP_SUMMARY
130+
131+
go tool cover -func=coverage.out | grep -v total | while read line; do
132+
if [[ $line == *".go:"* ]]; then
133+
pkg=$(echo $line | awk '{print $1}' | cut -d'/' -f1-3)
134+
coverage=$(echo $line | awk '{print $3}')
135+
echo "| $pkg | $coverage |" >> $GITHUB_STEP_SUMMARY
136+
fi
137+
done | sort -u
138+
139+
echo "" >> $GITHUB_STEP_SUMMARY
140+
else
141+
echo "## ⚠️ Coverage Report" >> $GITHUB_STEP_SUMMARY
142+
echo "No coverage file generated" >> $GITHUB_STEP_SUMMARY
143+
echo "" >> $GITHUB_STEP_SUMMARY
144+
fi
145+
146+
- name: Upload test artifacts
147+
if: failure()
148+
uses: actions/upload-artifact@v4
149+
with:
150+
name: test-results-go-${{ matrix.go }}
151+
path: |
152+
test-output.log
153+
coverage.out
154+
coverage.html
155+
retention-days: 7
42156

43157
- name: Run go vet
44-
run: go vet ./...
158+
run: |
159+
echo "## 🔍 Static Analysis (Go ${{ matrix.go }})" >> $GITHUB_STEP_SUMMARY
160+
echo "" >> $GITHUB_STEP_SUMMARY
161+
162+
VET_OUTPUT=$(go vet ./... 2>&1 || echo "")
163+
VET_STATUS=$?
164+
165+
if [ $VET_STATUS -eq 0 ]; then
166+
echo "✅ **go vet:** No issues found" >> $GITHUB_STEP_SUMMARY
167+
else
168+
echo "❌ **go vet:** Issues found" >> $GITHUB_STEP_SUMMARY
169+
echo "" >> $GITHUB_STEP_SUMMARY
170+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
171+
echo "$VET_OUTPUT" >> $GITHUB_STEP_SUMMARY
172+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
173+
fi
174+
echo "" >> $GITHUB_STEP_SUMMARY
175+
176+
exit $VET_STATUS
45177
46178
- name: Run go fmt
47179
run: |
48-
if [ "$(gofmt -s -l . | wc -l)" -gt 0 ]; then
49-
echo "The following files are not formatted:"
50-
gofmt -s -l .
180+
FMT_OUTPUT=$(gofmt -s -l . 2>&1 || echo "")
181+
182+
if [ -z "$FMT_OUTPUT" ]; then
183+
echo "✅ **go fmt:** All files properly formatted" >> $GITHUB_STEP_SUMMARY
184+
else
185+
echo "❌ **go fmt:** Files need formatting" >> $GITHUB_STEP_SUMMARY
186+
echo "" >> $GITHUB_STEP_SUMMARY
187+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
188+
echo "$FMT_OUTPUT" >> $GITHUB_STEP_SUMMARY
189+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
190+
echo "" >> $GITHUB_STEP_SUMMARY
51191
exit 1
52192
fi
53193
194+
- name: Job Summary
195+
if: always()
196+
run: |
197+
echo "## 📋 Job Summary (Go ${{ matrix.go }})" >> $GITHUB_STEP_SUMMARY
198+
echo "" >> $GITHUB_STEP_SUMMARY
199+
echo "| Step | Status |" >> $GITHUB_STEP_SUMMARY
200+
echo "|------|--------|" >> $GITHUB_STEP_SUMMARY
201+
echo "| Dependencies | ✅ Success |" >> $GITHUB_STEP_SUMMARY
202+
echo "| Build | ✅ Success |" >> $GITHUB_STEP_SUMMARY
203+
echo "| Tests | ${{ steps.test.outcome == 'success' && '✅ Success' || '❌ Failed' }} |" >> $GITHUB_STEP_SUMMARY
204+
echo "| Coverage | ${{ job.status == 'success' && '✅ Generated' || '⚠️ Partial' }} |" >> $GITHUB_STEP_SUMMARY
205+
echo "| Static Analysis | ${{ job.status == 'success' && '✅ Clean' || '❌ Issues' }} |" >> $GITHUB_STEP_SUMMARY
206+
echo "| Code Formatting | ${{ job.status == 'success' && '✅ Clean' || '❌ Issues' }} |" >> $GITHUB_STEP_SUMMARY
207+
echo "" >> $GITHUB_STEP_SUMMARY
208+
54209
- name: Upload coverage reports to Codecov
55210
uses: codecov/codecov-action@v5
56211
with:
@@ -81,9 +236,6 @@ jobs:
81236
fail-on-severity: moderate
82237
comment-summary-in-pr: always
83238

84-
# # Use comma-separated names to pass list arguments:
85-
# deny-licenses: LGPL-2.0, BSD-2-Clause
86-
87239
release:
88240
name: Release
89241
runs-on: ubuntu-latest
@@ -103,7 +255,26 @@ jobs:
103255
check-latest: true
104256

105257
- name: Run tests
106-
run: go test -v ./...
258+
run: |
259+
echo "## 🚀 Release Tests" >> $GITHUB_STEP_SUMMARY
260+
echo "" >> $GITHUB_STEP_SUMMARY
261+
262+
go test -v ./... 2>&1 | tee release-test-output.log
263+
TEST_STATUS=$?
264+
265+
TOTAL_TESTS=$(grep -c "=== RUN" release-test-output.log || echo "0")
266+
PASSED_TESTS=$(grep -c "--- PASS:" release-test-output.log || echo "0")
267+
FAILED_TESTS=$(grep -c "--- FAIL:" release-test-output.log || echo "0")
268+
269+
echo "| Metric | Value |" >> $GITHUB_STEP_SUMMARY
270+
echo "|--------|-------|" >> $GITHUB_STEP_SUMMARY
271+
echo "| Total Tests | $TOTAL_TESTS |" >> $GITHUB_STEP_SUMMARY
272+
echo "| Passed | ✅ $PASSED_TESTS |" >> $GITHUB_STEP_SUMMARY
273+
echo "| Failed | ❌ $FAILED_TESTS |" >> $GITHUB_STEP_SUMMARY
274+
echo "| Status | $([ $TEST_STATUS -eq 0 ] && echo "✅ PASSED" || echo "❌ FAILED") |" >> $GITHUB_STEP_SUMMARY
275+
echo "" >> $GITHUB_STEP_SUMMARY
276+
277+
exit $TEST_STATUS
107278
108279
- name: Install UPX
109280
run: |
@@ -112,6 +283,9 @@ jobs:
112283
113284
- name: Build binaries
114285
run: |
286+
echo "## 🔨 Build Process" >> $GITHUB_STEP_SUMMARY
287+
echo "" >> $GITHUB_STEP_SUMMARY
288+
115289
# Set the build time environment variable
116290
BUILD_TIME=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
117291
@@ -121,20 +295,31 @@ jobs:
121295
# Display help information for the build script
122296
./scripts/build.sh --help
123297
298+
echo "**Build Configuration:**" >> $GITHUB_STEP_SUMMARY
299+
echo "- Version: ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY
300+
echo "- Build Time: $BUILD_TIME" >> $GITHUB_STEP_SUMMARY
301+
echo "- Git Commit: ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY
302+
echo "" >> $GITHUB_STEP_SUMMARY
303+
124304
# Build for all platforms
125305
./scripts/build.sh \
126306
--verbose \
127307
-ldflags "-s -w -X github.com/kjanat/articulate-parser/internal/version.Version=${{ github.ref_name }} -X github.com/kjanat/articulate-parser/internal/version.BuildTime=$BUILD_TIME -X github.com/kjanat/articulate-parser/internal/version.GitCommit=${{ github.sha }}"
128308
129309
- name: Compress binaries with UPX
130310
run: |
311+
echo "## 📦 Binary Compression" >> $GITHUB_STEP_SUMMARY
312+
echo "" >> $GITHUB_STEP_SUMMARY
313+
131314
echo "Compressing binaries with UPX..."
132315
cd build/
133316
134317
# Get original sizes
135-
echo "Original sizes:"
136-
ls -lah
137-
echo ""
318+
echo "**Original sizes:**" >> $GITHUB_STEP_SUMMARY
319+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
320+
ls -lah >> $GITHUB_STEP_SUMMARY
321+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
322+
echo "" >> $GITHUB_STEP_SUMMARY
138323
139324
# Compress all binaries except Darwin (macOS) binaries as UPX doesn't work well with recent macOS versions
140325
for binary in articulate-parser-*; do
@@ -148,16 +333,16 @@ jobs:
148333
fi
149334
done
150335
151-
echo ""
152-
echo "Final sizes:"
153-
ls -lah
336+
echo "**Final sizes:**" >> $GITHUB_STEP_SUMMARY
337+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
338+
ls -lah >> $GITHUB_STEP_SUMMARY
339+
echo "\`\`\`" >> $GITHUB_STEP_SUMMARY
340+
echo "" >> $GITHUB_STEP_SUMMARY
154341
155342
- name: Upload a Build Artifact
156343
uses: actions/[email protected]
157344
with:
158-
# Artifact name
159-
name: build-artifacts # optional, default is artifact
160-
# A file, directory or wildcard pattern that describes what to upload
345+
name: build-artifacts
161346
path: build/
162347
if-no-files-found: ignore
163348
retention-days: 1

.gitignore

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,37 @@ go.work
2626

2727
# End of https://www.toptal.com/developers/gitignore/api/go
2828

29+
# Shit
30+
.github/TODO
31+
2932
# Local test files
3033
output/
3134
articulate-sample.json
3235
test-output.*
3336
go-os-arch-matrix.csv
37+
test_godocx.go
38+
test_input.json
3439

3540
# Build artifacts
3641
build/
42+
43+
# Old workflows
44+
.github/workflows/ci-old.yml
45+
.github/workflows/ci-enhanced.yml
46+
47+
# Test coverage files
48+
coverage.out
49+
coverage.txt
50+
coverage
51+
*.cover
52+
*.coverprofile
53+
54+
# Other common exclusions
55+
*.exe
56+
*.exe~
57+
*.dll
58+
*.so
59+
*.dylib
60+
*.test
61+
*.out
62+
/tmp/

0 commit comments

Comments
 (0)