cashumit/test_firefly_integration.dart

158 lines
5.5 KiB
Dart

import 'dart:io';
import 'dart:convert';
import 'package:http/http.dart' as http;
/// Script untuk menguji integrasi dengan Firefly III API
/// Menjalankan beberapa operasi dasar:
/// 1. Menguji koneksi ke instance Firefly III
/// 2. Menguji autentikasi dengan token
/// 3. Mengambil daftar akun
/// 4. Mengirim transaksi dummy
void main() async {
// Konfigurasi - Ganti dengan nilai yang sesuai untuk instance Firefly III Anda
const String baseUrl = 'http://192.168.1.100:8080'; // Contoh URL
const String accessToken = 'your_access_token_here'; // Contoh token
const String sourceAccountId = '1'; // ID akun sumber (revenue)
const String destinationAccountId = '2'; // ID akun tujuan (asset)
print('=== MENGUJI INTEGRASI FIREFLY III ===\n');
// 1. Menguji koneksi
print('1. Menguji koneksi ke Firefly III...');
try {
final connectivityResponse = await http.get(Uri.parse('$baseUrl/api/v1/about'));
if (connectivityResponse.statusCode == 200) {
print(' ✓ Koneksi berhasil');
} else {
print(' ✗ Koneksi gagal (Status code: ${connectivityResponse.statusCode})');
return;
}
} catch (e) {
print(' ✗ Koneksi gagal dengan error: $e');
return;
}
// 2. Menguji autentikasi
print('\n2. Menguji autentikasi dengan token...');
try {
final authResponse = await http.get(
Uri.parse('$baseUrl/api/v1/about/user'),
headers: {
'Authorization': 'Bearer $accessToken',
'Accept': 'application/json',
},
);
if (authResponse.statusCode == 200) {
print(' ✓ Autentikasi berhasil');
} else {
print(' ✗ Autentikasi gagal (Status code: ${authResponse.statusCode})');
print(' Response body: ${authResponse.body}');
return;
}
} catch (e) {
print(' ✗ Autentikasi gagal dengan error: $e');
return;
}
// 3. Mengambil daftar akun
print('\n3. Mengambil daftar akun...');
try {
final accountsResponse = await http.get(
Uri.parse('$baseUrl/api/v1/accounts'),
headers: {
'Authorization': 'Bearer $accessToken',
'Accept': 'application/json',
},
);
if (accountsResponse.statusCode == 200) {
final accountsData = json.decode(accountsResponse.body);
if (accountsData is Map<String, dynamic> && accountsData.containsKey('data')) {
final accounts = accountsData['data'] as List;
print(' ✓ Berhasil mengambil ${accounts.length} akun');
// Tampilkan 3 akun pertama
print(' Contoh akun:');
for (int i = 0; i < accounts.length && i < 3; i++) {
final account = accounts[i];
if (account is Map<String, dynamic> && account.containsKey('id') && account.containsKey('attributes')) {
final attributes = account['attributes'];
if (attributes is Map<String, dynamic> && attributes.containsKey('name') && attributes.containsKey('type')) {
print(' - ID: ${account['id']}, Nama: ${attributes['name']}, Tipe: ${attributes['type']}');
}
}
}
} else {
print(' ✗ Format respons akun tidak sesuai harapan');
return;
}
} else {
print(' ✗ Gagal mengambil akun (Status code: ${accountsResponse.statusCode})');
print(' Response body: ${accountsResponse.body}');
return;
}
} catch (e) {
print(' ✗ Gagal mengambil akun dengan error: $e');
return;
}
// 4. Mengirim transaksi dummy
print('\n4. Mengirim transaksi dummy...');
try {
final transactionPayload = jsonEncode({
"transactions": [
{
"type": "deposit",
"date": "2025-08-21",
"amount": "50.00",
"description": "Transaksi Dummy via Test Script",
"source_id": sourceAccountId,
"destination_id": destinationAccountId,
}
]
});
final transactionResponse = await http.post(
Uri.parse('$baseUrl/api/v1/transactions'),
headers: {
'Authorization': 'Bearer $accessToken',
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: transactionPayload,
);
if (transactionResponse.statusCode == 200 || transactionResponse.statusCode == 201) {
print(' ✓ Transaksi berhasil dikirim');
// Coba parse transaction ID
try {
final transactionData = json.decode(transactionResponse.body);
if (transactionData is Map<String, dynamic> &&
transactionData.containsKey('data') &&
transactionData['data'] is List &&
transactionData['data'].isNotEmpty) {
final firstTransaction = transactionData['data'][0];
if (firstTransaction is Map<String, dynamic> && firstTransaction.containsKey('transaction_id')) {
print(' Transaction ID: ${firstTransaction['transaction_id']}');
} else if (firstTransaction is Map<String, dynamic> && firstTransaction.containsKey('id')) {
print(' Transaction ID: ${firstTransaction['id']}');
}
}
} catch (e) {
print(' Tidak dapat mem-parsing transaction ID: $e');
}
} else {
print(' ✗ Gagal mengirim transaksi (Status code: ${transactionResponse.statusCode})');
print(' Response body: ${transactionResponse.body}');
return;
}
} catch (e) {
print(' ✗ Gagal mengirim transaksi dengan error: $e');
return;
}
print('\n=== PENGUJIAN SELESAI ===');
print('Semua pengujian berhasil! Integrasi dengan Firefly III berfungsi dengan baik.');
}