Skip to content

Commit e581dd9

Browse files
committed
Add comprehensive test suite for CSASAuthorize package
- Implemented integration tests for Application and Auth flow in ApplicationAuthFlowTest.php. - Created NotificatorTest.php to validate Notificator class functionality. - Added TokenInfoTest.php for testing TokenInfo UI component. - Developed WebPageTest.php to ensure proper functionality of WebPage UI class. - Established bootstrap.php for test environment initialization. - Created TokenTest.php to validate Token class methods and behaviors. - Added test-export-functionality.php to verify export feature compatibility. - Implemented verify_tests.php for automated test class verification and coverage summary.
1 parent dea8277 commit e581dd9

40 files changed

Lines changed: 11301 additions & 52 deletions

CHANGELOG.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# Changelog
2+
3+
All notable changes to this project will be documented in this file.
4+
5+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7+
8+
## [Unreleased]
9+
10+
## [0.3.0] - 2024-09-29
11+
12+
### Added
13+
14+
#### Export Functionality
15+
- **NEW**: Export mode in `csas-access-token.php` tool via `--export` / `-x` option
16+
- Export application data in Developer Portal compatible JSON format
17+
- Support for exporting by application ID or UUID
18+
- File output or stdout output for piping to other tools
19+
- Complete bidirectional data flow: import + export capabilities
20+
- Comprehensive documentation in `docs/EXPORT_FUNCTIONALITY.md`
21+
22+
#### Enhanced OAuth2 Error Handling
23+
- Graceful handling of expired refresh tokens in `Token::refreshToken()`
24+
- New methods: `isRefreshTokenExpired()`, `needsRefresh()`, `getTokenStatus()`
25+
- Automatic redirect to re-authorization when refresh token expires
26+
- Proper exception handling for `IdentityProviderException`
27+
28+
#### Developer Portal Import System
29+
- Web interface for importing Developer Portal data (`src/import.php`)
30+
- Command-line import tool (`import-from-portal` command)
31+
- `DeveloperPortalImporter` class with validation and field mapping
32+
- Support for hierarchical and flat JSON formats
33+
- Integration into main UI with "Import from Developer Portal" link
34+
- Comprehensive documentation in `DEVELOPER_PORTAL_IMPORT.md`
35+
36+
#### Comprehensive Test Suite
37+
- **NEW**: Complete PHPUnit test coverage for all SpojeNet classes
38+
- Unit tests: `ApplicationTest`, `AuthTest`, `NotificatorTest`, `TokenInfoTest`, `WebPageTest`
39+
- Integration test: `ApplicationAuthFlowTest` for complete OAuth2 workflow
40+
- Mock-based testing for external API dependencies
41+
- Test documentation in `TEST_SUITE_DOCUMENTATION.md`
42+
43+
### Changed
44+
45+
#### Documentation Updates
46+
- Updated `README.md` with export functionality and bidirectional workflow
47+
- Enhanced command-line usage examples with export options
48+
- Updated man page (`debian/csas-access-token.1`) with new export option
49+
- Expanded `DEVELOPER_PORTAL_IMPORT.md` with export information
50+
- Added comprehensive export documentation
51+
52+
#### Tool Enhancements
53+
- Extended `csas-access-token.php` with new command-line options
54+
- Updated help text and usage information
55+
- Better error messages and exit codes
56+
- Support for both numeric IDs and UUIDs in export mode
57+
58+
### Technical Details
59+
60+
#### Database Schema
61+
No changes to existing database schema. All new functionality works with existing tables:
62+
- `application` table: stores application data with sandbox/production environments
63+
- `token` table: stores OAuth2 tokens with refresh capabilities
64+
65+
#### API Compatibility
66+
- Maintains backward compatibility with existing OAuth2 flows
67+
- All existing functionality preserved
68+
- New features are additive and optional
69+
70+
#### Security Considerations
71+
- Export functionality includes sensitive client secrets and API keys
72+
- Proper validation and sanitization of import data
73+
- Clear security warnings in documentation
74+
- No exposure of sensitive data in logs or error messages
75+
76+
#### Performance Impact
77+
- Export operations are lightweight database queries
78+
- Import operations include validation overhead but process quickly
79+
- Test suite runs efficiently with mock objects
80+
- No impact on existing token refresh performance
81+
82+
## Previous Versions
83+
84+
### Historical Note
85+
This project has been in development since June 2024. This changelog documents major enhancements added during development iterations in September 2024, focusing on:
86+
87+
1. **OAuth2 Robustness**: Handling refresh token expiration gracefully
88+
2. **Data Portability**: Bidirectional import/export with Developer Portal format
89+
3. **Test Coverage**: Comprehensive automated testing infrastructure
90+
4. **Documentation**: Complete usage and implementation documentation
91+
92+
### Dependencies
93+
- PHP 8.4+ with OAuth2 and database support
94+
- League OAuth2 Client for CSAS API integration
95+
- PHPUnit for testing infrastructure
96+
- Bootstrap 5 via Ease framework for UI components
97+
- MySQL/MariaDB or SQLite for data storage
98+
99+
### Migration Notes
100+
- No database migrations required for new functionality
101+
- Existing applications and tokens continue working without changes
102+
- New export feature requires existing application data to be present
103+
- Import feature can be used immediately without any setup

DEVELOPER_PORTAL_IMPORT.md

Lines changed: 236 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,236 @@
1+
# CSAS Developer Portal Data Import
2+
3+
## Přehled
4+
5+
CSAS Authorize nyní podporuje **bidirectional** data flow s CSAS Developer Portal - jak import, tak export dat aplikací.
6+
7+
### Import z Developer Portal
8+
Import dat aplikací z CSAS Developer Portal do CSAS Authorize eliminuje nutnost ručního opisování konfiguračních údajů.
9+
10+
### Export do formátu Developer Portal
11+
Nový export umožňuje exportovat data z CSAS Authorize do formátu kompatibilního s Developer Portal pro zálohu, migraci nebo sdílení mezi instancemi.
12+
13+
## Aktuální stav Developer Portal
14+
15+
K datu 29. září 2025 **CSAS Developer Portal (https://developers.erstegroup.com/) neposkytuje automatizovaný export dat aplikací**. Proto jsme implementovali:
16+
1. **Import nástroj** pro ruční import dat ve formátu JSON
17+
2. **Export nástroj** pro generování dat ve formátu kompatibilním s Developer Portal
18+
19+
## Implementované nástroje
20+
21+
### Export funkčnost
22+
23+
**Umístění:** `libexec/csas-access-token.php` (rozšířeno o `--export` možnost)
24+
25+
**Použití:**
26+
```bash
27+
# Export aplikace podle ID do stdout
28+
php libexec/csas-access-token.php --export=1
29+
30+
# Export aplikace podle UUID do souboru
31+
php libexec/csas-access-token.php --export=71004963-e3d4-471f-96fc-1aef79d17ec1 --output=backup.json
32+
33+
# Export s krátkou volbou
34+
php libexec/csas-access-token.php -x 1 -o export.json
35+
```
36+
37+
**Funkce:**
38+
- Export dat z CSAS Authorize do Developer Portal kompatibilního JSON formátu
39+
- Podpora exportu podle ID nebo UUID aplikace
40+
- Filtrování prázdných hodnot pro čistý JSON výstup
41+
- Výstup do souboru nebo stdout pro piping do jiných nástrojů
42+
- Úplná kompatibilita s import nástrojem
43+
44+
### Import funkčnost
45+
46+
**Umístění:** `src/SpojeNet/CSas/DeveloperPortalImporter.php`
47+
48+
**Funkce:**
49+
- Import dat z JSON souboru
50+
- Import dat z JSON řetězce
51+
- Mapování různých formátů dat z Developer Portal
52+
- Validace povinných polí
53+
- Automatické uložení do databáze
54+
55+
### 2. Webové rozhraní pro import
56+
57+
**Umístění:** `src/import.php`
58+
59+
**Funkce:**
60+
- Formulář pro nahrání JSON souboru
61+
- Možnost vložení JSON dat přímo do textového pole
62+
- Zobrazení příkladu očekávaného formátu JSON
63+
- Průvodce manuálním exportem z Developer Portal
64+
65+
### 3. Integrace do uživatelského rozhraní
66+
67+
- Přidán odkaz "Import from Developer Portal" na hlavní stránku
68+
- Breadcrumb navigace pro snadný návrat
69+
- Automatické přesměrování na detail aplikace po úspěšném importu
70+
71+
## Podporované formáty JSON
72+
73+
### Hierarchická struktura (doporučená)
74+
75+
```json
76+
{
77+
"name": "Název aplikace",
78+
"id": "application-uuid-from-portal",
79+
"logoUrl": "https://example.com/logo.png",
80+
"email": "developer@example.com",
81+
"sandbox": {
82+
"clientId": "sandbox-client-uuid",
83+
"clientSecret": "sandbox-client-secret",
84+
"apiKey": "sandbox-api-key-uuid",
85+
"redirectUri": "https://myapp.example.com/sandbox/callback"
86+
},
87+
"production": {
88+
"clientId": "production-client-uuid",
89+
"clientSecret": "production-client-secret",
90+
"apiKey": "production-api-key-uuid",
91+
"redirectUri": "https://myapp.example.com/production/callback"
92+
}
93+
}
94+
```
95+
96+
### Plochá struktura (alternativní)
97+
98+
```json
99+
{
100+
"name": "Název aplikace",
101+
"uuid": "application-uuid",
102+
"sandboxClientId": "sandbox-client-uuid",
103+
"sandboxClientSecret": "sandbox-client-secret",
104+
"sandboxApiKey": "sandbox-api-key",
105+
"sandboxRedirectUri": "https://example.com/sandbox/callback",
106+
"productionClientId": "production-client-uuid",
107+
"productionClientSecret": "production-client-secret",
108+
"productionApiKey": "production-api-key",
109+
"productionRedirectUri": "https://example.com/production/callback"
110+
}
111+
```
112+
113+
## Mapování polí
114+
115+
Importér automaticky mapuje různé názvy polí z Developer Portal:
116+
117+
| Developer Portal | CSAS Authorize DB |
118+
|------------------|-------------------|
119+
| `name` / `applicationName` | `name` |
120+
| `id` / `applicationId` / `uuid` | `uuid` |
121+
| `logoUrl` / `logo` | `logo` |
122+
| `email` / `contactEmail` | `email` |
123+
| `sandbox.clientId` | `sandbox_client_id` |
124+
| `sandbox.clientSecret` | `sandbox_client_secret` |
125+
| `sandbox.apiKey` | `sandbox_api_key` |
126+
| `sandbox.redirectUri` | `sandbox_redirect_uri` |
127+
128+
## Manuální postup exportu
129+
130+
Protože Developer Portal nemá export funkci:
131+
132+
1. **Přihlaste se do Developer Portal:** https://developers.erstegroup.com/portal/organizations/vitezslav-dvorak/applications
133+
2. **Otevřete detail aplikace** kterou chcete importovat
134+
3. **Zkopírujte následující údaje:**
135+
- Název aplikace
136+
- Application ID (UUID)
137+
- Logo URL (pokud existuje)
138+
- Sandbox Client ID
139+
- Sandbox Client Secret
140+
- Sandbox API Key
141+
- Production Client ID
142+
- Production Client Secret
143+
- Production API Key
144+
- Redirect URI pro oba prostředí
145+
4. **Vytvořte JSON** podle výše uvedeného formátu
146+
5. **Použijte import formulář** v CSAS Authorize
147+
148+
## Validace dat
149+
150+
Importér ověřuje:
151+
152+
- **Povinná pole:** `name` a `uuid` musí být vyplněny
153+
- **Alespoň jedno prostředí:** Sandbox NEBO production musí mít kompletní credentials (client_id a client_secret)
154+
- **Formát JSON:** Data musí být ve validním JSON formátu
155+
156+
## Bezpečnostní upozornění
157+
158+
⚠️ **Bezpečnost dat:**
159+
- Client secrets a API klíče jsou citlivé údaje
160+
- Importujte pouze z důvěryhodných zdrojů
161+
- Ujistěte se, že JSON soubory neuchovávate v nezabezpečených místech
162+
- Po importu si ověřte, že údaje jsou správné
163+
164+
## Testování
165+
166+
Vytvořena kompletní testovací sada v `tests/DeveloperPortalImporterTest.php` která pokrývá:
167+
168+
- Import z JSON souboru a dat
169+
- Mapování různých formátů polí
170+
- Validaci povinných údajů
171+
- Zpracování chybových stavů
172+
- Bezpečnostní kontroly
173+
174+
## Bidirectional workflow
175+
176+
Nyní je možný úplný bidirectional workflow:
177+
178+
```bash
179+
# 1. Export z jedné instance CSAS Authorize
180+
php libexec/csas-access-token.php --export=1 --output=backup.json
181+
182+
# 2. Import do jiné instance (nebo stejné instance)
183+
# Import to another instance (or same instance)
184+
import-from-portal --file backup.json
185+
186+
# 3. Nebo přes webové rozhraní
187+
# Nahrajte backup.json přes /import.php
188+
```
189+
190+
### Použití pro zálohy a migrace
191+
192+
```bash
193+
# Záloha všech aplikací (může být automatizováno)
194+
for app_id in $(php -r "/* získej seznam ID aplikací */"); do
195+
php libexec/csas-access-token.php --export=$app_id --output="backup-$app_id.json"
196+
done
197+
198+
# Obnovení ze zálohy
199+
for backup_file in backup-*.json; do
200+
import-from-portal --file "$backup_file"
201+
done
202+
```
203+
204+
## Doporučení pro CSAS
205+
206+
**Navrhujeme CSAS aby do Developer Portal přidal:**
207+
208+
1. **Export API** - programový přístup k datům aplikací
209+
2. **Export tlačítko** - možnost stažení JSON/CSV s daty aplikace
210+
3. **Webhook notifikace** - automatická synchronizace změn
211+
4. **Bulk export** - export všech aplikací najednou
212+
213+
To by eliminovalo nutnost ručního kopírování a snížilo riziko chyb.
214+
215+
## Použití
216+
217+
### Z webového rozhraní:
218+
1. Přejděte na `import.php`
219+
2. Nahrajte JSON soubor NEBO vložte JSON data
220+
3. Klikněte "Import Application"
221+
222+
### Z kódu:
223+
```php
224+
$importer = new DeveloperPortalImporter();
225+
226+
// Import z souboru
227+
$success = $importer->importFromJson('/path/to/export.json');
228+
229+
// Import z pole
230+
$success = $importer->importFromArray($applicationData);
231+
232+
// Získání importované aplikace
233+
$app = $importer->getApplication();
234+
```
235+
236+
Toto řešení poskytuje flexibilní a bezpečný způsob importu dat z CSAS Developer Portal do CSAS Authorize aplikace.

Makefile

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,18 @@ sysmigration: ## Run database migrations using system phinx
3838
.PHONY: newmigration
3939
newmigration: ## Prepare new Database Migration
4040
read -p "Enter CamelCase migration name : " migname ; cd src ; ../vendor/bin/phinx create $$migname -c ../phinx-adapter.php ; cd ..
41+
42+
usesqlite: ## Use SQLite database for tests
43+
@echo "Updating .env to use a fresh SQLite database for tests..."
44+
@sqlite_db="var/test_database.sqlite"
45+
@rm -f "$$sqlite_db"
46+
@touch "$$sqlite_db"
47+
@if [ ! -f .env ]; then \
48+
touch .env; \
49+
fi
50+
@sed -i.bak '/^DB_CONNECTION=/d;/^DB_DATABASE=/d;/^DB_USERNAME=/d;/^DB_PASSWORD=/d' .env
51+
@echo "DB_CONNECTION=sqlite" >> .env
52+
@echo "DB_DATABASE=$$sqlite_db" >> .env
53+
@echo "DB_USERNAME=" >> .env
54+
@echo "DB_PASSWORD=" >> .env
55+
@echo "Successfully updated .env to use SQLite database: $$sqlite_db"

0 commit comments

Comments
 (0)