17 KiB
🧪 SEO Skills - Complete Testing Guide
Purpose: Test all implemented features systematically
Estimated Time: 2-3 hours for full test suite
Prerequisites: Python 3.8+, pip packages installed
📋 TEST OVERVIEW
| Test Group | Features | Priority | Time |
|---|---|---|---|
| Group 1: Content Generation | Multi-channel generation | High | 30 min |
| Group 2: Thai Analysis | Keyword, readability, quality | High | 20 min |
| Group 3: Context Management | Create, manage context | Medium | 15 min |
| Group 4: Image Integration | Generate, edit images | Medium | 30 min |
| Group 5: Auto-Publish | Astro publishing | Medium | 20 min |
| Group 6: Analytics | GA4, GSC, DataForSEO, Umami | Low | 30 min |
🔧 PRE-TEST SETUP
1. Install Dependencies
# Navigate to skills directory
cd /Users/kunthawatgreethong/Gitea/opencode-skill/skills
# Install all dependencies
pip install pythainlp pyyaml python-dotenv pandas tqdm rich \
markdown python-frontmatter GitPython Pillow requests
# Install Google APIs (for analytics testing)
pip install google-analytics-data google-auth google-auth-oauthlib \
google-api-python-client
# Download Thai language data
python3 -c "from pythainlp.corpus import download; download('default')"
2. Verify Installation
# Test PyThaiNLP
python3 -c "from pythainlp import word_tokenize; print(word_tokenize('ทดสอบภาษาไทย'))"
# Expected: ['ทดสอบ', 'ภาษาไทย']
# Test YAML
python3 -c "import yaml; print('YAML OK')"
# Test requests
python3 -c "import requests; print('Requests OK')"
📝 GROUP 1: Content Generation Tests
Test 1.1: Facebook Post Generation
cd /Users/kunthawatgreethong/Gitea/opencode-skill/skills/seo-multi-channel/scripts
python3 generate_content.py \
--topic "บริการ podcast hosting" \
--channels facebook \
--language th \
--output test-fb
Expected Output:
🎯 Generating content for: บริการ podcast hosting
📱 Channels: facebook
🌐 Language: th
Generating facebook...
[Image Generation] Would generate image for facebook
Topic: บริการ podcast hosting, Type: social
... (5 times)
✅ Results saved to: output/บริการ-podcast-hosting/results.json
📊 Summary:
Channels generated: 1
- facebook: 5 variations
Verify:
- Output file created at
output/test-fb/results.json - Contains 5 Facebook variations
- Each has: primary_text, headline, cta, hashtags
Test 1.2: Multi-Channel Generation
python3 generate_content.py \
--topic "บริการ podcast hosting" \
--channels facebook google_ads blog \
--language th
Expected Output:
🎯 Generating content for: บริการ podcast hosting
📱 Channels: facebook, google_ads, blog
🌐 Language: th
Generating facebook... (5 variations)
Generating google_ads... (3 variations)
Generating blog... (5 variations)
✅ Results saved to: output/บริการ-podcast-hosting/results.json
📊 Summary:
Channels generated: 3
- facebook: 5 variations
- google_ads: 3 variations
- blog: 5 variations
Verify:
- All 3 channels generated
- Total 13 variations
- Blog has markdown with frontmatter
- Google Ads has 15 headlines, 4 descriptions
Test 1.3: English Content
python3 generate_content.py \
--topic "best podcast hosting 2026" \
--channels facebook blog \
--language en
Verify:
- English content generated
- Different tone/formality than Thai
- Proper English grammar structure
📝 GROUP 2: Thai Analysis Tests
Test 2.1: Keyword Density Analysis
cd /Users/kunthawatgreethong/Gitea/opencode-skill/skills/seo-analyzers/scripts
python3 thai_keyword_analyzer.py \
--text "บริการ podcast hosting ที่ดีที่สุดช่วยให้คุณเผยแพร่ podcast ไปยัง Apple Podcasts, Spotify, YouTube Music ได้อย่างง่ายดาย บริการ podcast ของเราเป็นเครื่องมือที่ครบวงจรที่สุด" \
--keyword "บริการ podcast" \
--language th \
--output text
Expected Output:
📊 Keyword Analysis Results
Keyword: บริการ podcast
Word Count: 25
Occurrences: 3
Density: 12.0% (target: 1.0-1.5%)
Status: too_high
Critical Placements:
✓ First 100 words: Yes
✓ H1 Headline: No
✓ Conclusion: No
✓ H2 Headings: 0 found
Keyword Stuffing Risk: high
💡 Recommendations:
• ลดการใช้คำหลักลง อาจถูกมองว่า keyword stuffing
• เพิ่มคำหลักในหัวข้อหลัก (H1)
• เพิ่มคำหลักในบทสรุป
Verify:
- Thai word count accurate (uses PyThaiNLP)
- Density calculated correctly
- Recommendations in Thai
Test 2.2: Readability Analysis
python3 thai_readability.py \
--text "มาเริ่ม podcast กันเลย! ไม่ต้องรอให้พร้อม 100% แค่มีไอเดียดีๆ กับไมค์หนึ่งอัน คุณก็เริ่มต้นได้แล้ว ส่วนเรื่องเทคนิคที่เหลือ เราช่วยคุณเอง" \
--output text
Expected Output:
📖 Thai Readability Analysis
Sentence Count: 3
Word Count: 28
Avg Sentence Length: 9.3 words
Grade Level: ง่าย (ม.6-ม.9)
Formality: กันเอง (Casual)
Readability Score: 75/100
Verify:
- Thai sentences counted correctly
- Formality detected (กันเอง vs เป็นทางการ)
- Grade level in Thai format
Test 2.3: Content Quality Scoring
python3 content_quality_scorer.py \
--text "# คู่มือ Podcast Hosting
บริการ podcast hosting เป็นสิ่งสำคัญสำหรับ podcaster ทุกคน...
[Add 500+ words of content]" \
--keyword "podcast hosting" \
--output text
Expected Output:
⭐ Content Quality Score
Overall Score: 65.0/100
Status: fair
Action: Address priority fixes
Category Scores:
• Keyword Optimization: 15/25
• Readability: 18/25
• Structure: 17/25
• Brand Voice: 15/25
Verify:
- Score between 0-100
- 4 category breakdowns
- Recommendations provided
📝 GROUP 3: Context Management Tests
Test 3.1: Create Context Files
cd /Users/kunthawatgreethong/Gitea/opencode-skill/skills/seo-context/scripts
python3 context_manager.py \
--create \
--project "/tmp/test-website" \
--industry "podcast" \
--formality "normal"
Expected Output:
📝 Context Manager
Project: /tmp/test-website
Creating context files...
Industry: podcast
Audience: Thai audience
Formality: normal
✅ Context created successfully!
📁 Created files:
✓ brand-voice.md
✓ target-keywords.md
✓ seo-guidelines.md
✓ internal-links-map.md
✓ data-services.json
✓ style-guide.md
📍 Location: /tmp/test-website/context
Verify:
- All 6 files created in
/tmp/test-website/context/ - brand-voice.md has Thai voice pillars
- seo-guidelines.md has Thai-specific rules
- data-services.json has all services disabled
# Verify files
ls -la /tmp/test-website/context/
cat /tmp/test-website/context/brand-voice.md | head -20
Test 3.2: Alternative --action Flag
python3 context_manager.py \
--action create \
--project "/tmp/test-website-2" \
--industry "ecommerce" \
--formality "casual"
Verify:
- Works with
--action createinstead of--create - Different industry reflected in content
📝 GROUP 4: Image Integration Tests
Test 4.1: Image Generation (Requires CHUTES_API_TOKEN)
cd /Users/kunthawatgreethong/Gitea/opencode-skill/skills/seo-multi-channel/scripts
# Set your API token
export CHUTES_API_TOKEN="your_token_here"
python3 image_integration.py \
--action generate \
--topic "podcast hosting" \
--channel facebook \
--output-dir ./test-images
Expected Output:
🎨 Generating image...
Prompt: Professional illustration of podcast hosting...
Size: 1024x1024
✓ Saved: ./test-images/podcast-hosting/facebook/generated_xxx.png
Verify:
- Image file created
- Saved in correct folder structure
- Image is viewable (not corrupted)
Note: If no API token, test will show prompt about needing token
Test 4.2: Find Product Images
# First, create a test website structure
mkdir -p /tmp/test-website/public/images/products
cp /path/to/any-image.jpg /tmp/test-website/public/images/products/podcast-mic.jpg
python3 image_integration.py \
--action find \
--product-name "podcast-mic" \
--website-repo "/tmp/test-website"
Expected Output:
🔍 Looking for product images: podcast-mic
✓ Found 1 image(s)
- /tmp/test-website/public/images/products/podcast-mic.jpg
Verify:
- Finds images in website repo
- Searches multiple directories
- Returns full paths
Test 4.3: Product Image Edit (Requires CHUTES_API_TOKEN)
export CHUTES_API_TOKEN="your_token_here"
python3 image_integration.py \
--action edit \
--product-name "podcast-mic" \
--website-repo "/tmp/test-website" \
--prompt "Enhance product, professional lighting, clean background" \
--topic "podcast-mic" \
--channel facebook_ads \
--output-dir ./test-images
Expected Output:
✏️ Editing product image...
Base: /tmp/test-website/public/images/products/podcast-mic.jpg
Edit: Enhance product, professional lighting...
✓ Saved: ./test-images/podcast-mic/facebook_ads/edited_xxx.png
Verify:
- Original image found
- Edited image created
- Saved in channel-specific folder
📝 GROUP 5: Auto-Publish Tests
Test 5.1: Publish Blog Post
cd /Users/kunthawatgreethong/Gitea/opencode-skill/skills/seo-multi-channel/scripts
# Create test blog post
cat > /tmp/test-blog.md << 'EOF'
---
title: "คู่มือ Podcast Hosting ที่ดีที่สุด 2026"
description: "เปรียบเทียบบริการ podcast hosting ทั้งหมด"
keywords: ["podcast hosting", "บริการ podcast"]
slug: podcast-hosting-best-2026
lang: th
category: guides
created: 2026-03-08
---
# คู่มือ Podcast Hosting ที่ดีที่สุด 2026
บทความนี้จะเปรียบเทียบแพลตฟอร์มยอดนิยม...
EOF
# Initialize test git repo
mkdir -p /tmp/test-astro-website/src/content/blog/\(th\)
cd /tmp/test-astro-website
git init
git config user.email "test@test.com"
git config user.name "Test User"
git remote add origin https://github.com/yourusername/test-repo.git
# Publish
python3 auto_publish.py \
--file /tmp/test-blog.md \
--website-repo /tmp/test-astro-website
Expected Output:
📝 Publishing to Astro
✓ Saved: /tmp/test-astro-website/src/content/blog/(th)/podcast-hosting-best-2026.md
✓ Committed: Add blog post: podcast-hosting-best-2026 (th)
✓ Pushed to remote
✅ Published successfully!
Slug: podcast-hosting-best-2026
Language: th
Path: /tmp/test-astro-website/src/content/blog/(th)/podcast-hosting-best-2026.md
Verify:
- Markdown file saved in correct language folder
- Git commit created
- Slug generated correctly from Thai title
Test 5.2: English Blog Post
cat > /tmp/test-blog-en.md << 'EOF'
---
title: "Best Podcast Hosting 2026"
description: "Compare all podcast hosting services"
slug: best-podcast-hosting-2026
lang: en
---
# Best Podcast Hosting 2026
This article compares...
EOF
python3 auto_publish.py \
--file /tmp/test-blog-en.md \
--website-repo /tmp/test-astro-website
Verify:
- Saved in
(en)folder - Language auto-detected if not specified
📝 GROUP 6: Analytics Tests (Optional - Needs Credentials)
Test 6.1: Data Aggregator (No Services)
cd /Users/kunthawatgreethong/Gitea/opencode-skill/skills/seo-data/scripts
# Create empty config
cat > /tmp/test-context/data-services.json << 'EOF'
{
"ga4": {"enabled": false},
"gsc": {"enabled": false},
"dataforseo": {"enabled": false},
"umami": {"enabled": false}
}
EOF
python3 data_aggregator.py \
--context /tmp/test-context \
--action performance \
--url "https://test.com/page"
Expected Output:
📊 Initializing Data Service Manager...
Context: /tmp/test-context
No analytics services configured. All features will be skipped.
⚠️ No services configured. Exiting.
Verify:
- Gracefully handles no services
- No errors thrown
Test 6.2: GA4 Connector (With Credentials)
# Only if you have GA4 credentials
python3 ga4_connector.py \
--property-id "G-XXXXXXXXXX" \
--credentials "/path/to/ga4-credentials.json" \
--url "/blog/article" \
--days 30
Verify (if credentials provided):
- Connects successfully
- Returns pageview data
- Returns engagement metrics
Test 6.3: GSC Connector (With Credentials)
# Only if you have GSC credentials
python3 gsc_connector.py \
--site-url "https://yoursite.com" \
--credentials "/path/to/gsc-credentials.json" \
--quick-wins
Expected Output:
🔍 Testing GSC Connector
Site: https://yoursite.com
Finding quick wins (position 11-20)...
Found 15 opportunities:
1. keyword example
Position: 12 | Impressions: 1,234 | Priority: 85
Verify (if credentials provided):
- Connects successfully
- Returns keyword positions
- Quick wins calculated correctly
Test 6.4: DataForSEO (With Credentials)
python3 dataforseo_client.py \
--login "your_login" \
--password "your_password" \
--keyword "podcast hosting"
Verify (if credentials provided):
- Authenticates successfully
- Returns SERP data
Test 6.5: Umami (With Credentials)
python3 umami_connector.py \
--api-url "https://analytics.yoursite.com" \
--api-key "your_api_key" \
--website-id "your_website_id"
Verify (if credentials provided):
- Connects successfully
- Returns analytics data
✅ TEST CHECKLIST SUMMARY
High Priority (Must Test):
- Test 1.1: Facebook post generation (Thai)
- Test 1.2: Multi-channel generation
- Test 2.1: Thai keyword density analysis
- Test 2.2: Thai readability analysis
- Test 2.3: Content quality scoring
- Test 3.1: Context file creation
Medium Priority (Should Test):
- Test 4.1: Image generation (if have token)
- Test 4.2: Find product images
- Test 5.1: Auto-publish blog post
- Test 1.3: English content generation
Low Priority (If Have Credentials):
- Test 6.2: GA4 connector
- Test 6.3: GSC connector
- Test 6.4: DataForSEO client
- Test 6.5: Umami connector
🐛 COMMON ISSUES & FIXES
Issue 1: PyThaiNLP Not Working
Error: ImportError: No module named 'pythainlp'
Fix:
pip install pythainlp
python3 -c "from pythainlp.corpus import download; download('default')"
Issue 2: YAML Parser Errors
Error: yaml.parser.ParserError
Fix: Templates already fixed. If using custom templates, ensure:
- No unquoted special characters
- Proper indentation (2 spaces)
- No
orin values (use quotes)
Issue 3: Image Generation Fails
Error: CHUTES_API_TOKEN not set
Fix: Either set token or skip image tests (core functionality still works)
export CHUTES_API_TOKEN="your_token"
Issue 4: Git Push Fails
Error: git push authentication failed
Fix: For testing, skip remote push:
# Just test local commit
git commit -m "Test commit"
# Don't push
📊 TEST RESULTS TEMPLATE
After testing, fill in this template:
## Test Results - [Date]
**Tester:** [Your name]
**Environment:** [Python version, OS]
### Group 1: Content Generation
- [ ] Test 1.1: Facebook (Thai) - PASS/FAIL
- [ ] Test 1.2: Multi-channel - PASS/FAIL
- [ ] Test 1.3: English - PASS/FAIL
### Group 2: Thai Analysis
- [ ] Test 2.1: Keyword density - PASS/FAIL
- [ ] Test 2.2: Readability - PASS/FAIL
- [ ] Test 2.3: Quality score - PASS/FAIL
### Group 3: Context
- [ ] Test 3.1: Create context - PASS/FAIL
### Group 4: Images
- [ ] Test 4.1: Generate - PASS/FAIL/SKIP
- [ ] Test 4.2: Find products - PASS/FAIL
### Group 5: Auto-Publish
- [ ] Test 5.1: Publish blog - PASS/FAIL
### Group 6: Analytics
- [ ] Test 6.x: [Service] - PASS/FAIL/SKIP (no creds)
### Bugs Found:
1. [Description]
2. [Description]
### Overall Status: [Ready/Needs Fixes]
Happy Testing! 🧪🎉