Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 29 additions & 3 deletions app/Exports/ExportAKIAKB.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,15 +40,41 @@

class ExportAKIAKB implements FromCollection, WithHeadings, WithMapping, WithStyles
{
protected array $params;

public function __construct($params = [])
{
$this->params = $params;
}

/**
* Mengambil koleksi data AKI AKB untuk ekspor
*
*
* @return \Illuminate\Support\Collection
*/
public function collection()
{
// Mengambil semua data AKI AKB tanpa filter atau limit
return AkiAkb::with('desa')->get();
// Ambil data dari database lokal dengan filter jika ada
$desa_id = $this->params['desa_id'] ?? null;
$bulan = $this->params['bulan'] ?? null;
$tahun = $this->params['tahun'] ?? null;

$query = AkiAkb::with('desa');

// Hanya tambahkan filter jika ada parameter dan bukan 'Semua'
if ($desa_id && $desa_id !== 'Semua') {
$query->where('desa_id', $desa_id);
}

if ($bulan && $bulan !== 'Semua') {
$query->where('bulan', $bulan);
}

if ($tahun && $tahun !== 'Semua') {
$query->where('tahun', $tahun);
}

return $query->get();
}

/**
Expand Down
2 changes: 1 addition & 1 deletion app/Exports/ExportDataDesa.php
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public function map($desa): array
$desa->desa_id,
$desa->nama,
$desa->sebutan_desa ?? 'Desa',
$desa->website,
$desa->website ?? '',
$desa->luas_wilayah ?? 0,
$desa->created_at ? $desa->created_at->format('d/m/Y H:i:s') : '',
$desa->updated_at ? $desa->updated_at->format('d/m/Y H:i:s') : '',
Expand Down
3 changes: 2 additions & 1 deletion catatan_rilis.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,5 @@ Di rilis versi v2602.0.0 di versi ini terdapat modul komentar pada artikel dan p
11. [#1432](https://github.com/OpenSID/OpenDK/issues/1432) Code Quality Issues.
12. [#43](https://github.com/OpenSID/wiki-keamanan/issues/43) update kerentanan package yg digunakan OpenDK.
13. [#1454](https://github.com/OpenSID/OpenDK/issues/1454) Pengujian Fitur Autentikasi Komprehensif.
14. [#1452](https://github.com/OpenSID/OpenDK/issues/1452) Refactor Base TestCase ke Arsitektur Berbasis Trait (Pest v4).
14. [#1452](https://github.com/OpenSID/OpenDK/issues/1452) Refactor Base TestCase ke Arsitektur Berbasis Trait (Pest v4).
15. [#1467](https://github.com/OpenSID/OpenDK/issues/1467) Standarisasi dan Ekspansi Tests untuk Export Excel Features.
285 changes: 285 additions & 0 deletions tests/Feature/AKIAKBExportTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -151,3 +151,288 @@
// Assert: Periksa bahwa collection kosong
expect($collection)->toHaveCount(0);
});

// =============================================================================
// FILTER TESTS
// =============================================================================

test('export aki akb with desa_id filter', function () {
// Arrange: Buat data dengan beberapa desa
AkiAkb::query()->delete();
$desa1 = DataDesa::factory()->create(['desa_id' => '111']);
$desa2 = DataDesa::factory()->create(['desa_id' => '222']);

AkiAkb::factory()->count(3)->create([
'desa_id' => $desa1->desa_id,
'bulan' => 1,
'tahun' => 2024,
]);
AkiAkb::factory()->count(2)->create([
'desa_id' => $desa2->desa_id,
'bulan' => 2,
'tahun' => 2024,
]);

// Act: Export dengan filter desa_id
$export = new ExportAKIAKB(['desa_id' => $desa1->desa_id]);
$collection = $export->collection();

// Assert: Hanya data desa1 yang ter-export
expect($collection)->toHaveCount(3)
->and($collection->every(fn($item) => $item->desa_id === '111'))->toBeTrue();
});

test('export aki akb with bulan filter', function () {
// Arrange: Buat data dengan berbagai bulan
AkiAkb::query()->delete();
$desa = DataDesa::factory()->create();

AkiAkb::factory()->create([
'desa_id' => $desa->desa_id,
'bulan' => 1,
'tahun' => 2024,
]);
AkiAkb::factory()->create([
'desa_id' => $desa->desa_id,
'bulan' => 2,
'tahun' => 2024,
]);
AkiAkb::factory()->create([
'desa_id' => $desa->desa_id,
'bulan' => 3,
'tahun' => 2024,
]);

// Act: Export dengan filter bulan
$export = new ExportAKIAKB(['bulan' => 2]);
$collection = $export->collection();

// Assert: Hanya data bulan 2 yang ter-export
expect($collection)->toHaveCount(1)
->and($collection->first()->bulan)->toBe(2);
});

test('export aki akb with tahun filter', function () {
// Arrange: Buat data dengan berbagai tahun
AkiAkb::query()->delete();
$desa = DataDesa::factory()->create();

AkiAkb::factory()->create([
'desa_id' => $desa->desa_id,
'bulan' => 1,
'tahun' => 2023,
]);
AkiAkb::factory()->create([
'desa_id' => $desa->desa_id,
'bulan' => 2,
'tahun' => 2024,
]);
AkiAkb::factory()->create([
'desa_id' => $desa->desa_id,
'bulan' => 3,
'tahun' => 2025,
]);

// Act: Export dengan filter tahun
$export = new ExportAKIAKB(['tahun' => 2024]);
$collection = $export->collection();

// Assert: Hanya data tahun 2024 yang ter-export
expect($collection)->toHaveCount(1)
->and($collection->first()->tahun)->toBe(2024);
});

test('export aki akb with combined filters', function () {
// Arrange: Buat data dengan berbagai kombinasi
AkiAkb::query()->delete();
$desa1 = DataDesa::factory()->create(['desa_id' => '111']);
$desa2 = DataDesa::factory()->create(['desa_id' => '222']);

// Data untuk desa1, bulan 1, tahun 2024
AkiAkb::factory()->create([
'desa_id' => $desa1->desa_id,
'bulan' => 1,
'tahun' => 2024,
]);

// Data untuk desa1, bulan 2, tahun 2024 (tidak match semua filter)
AkiAkb::factory()->create([
'desa_id' => $desa1->desa_id,
'bulan' => 2,
'tahun' => 2024,
]);

// Data untuk desa2, bulan 1, tahun 2024 (tidak match semua filter)
AkiAkb::factory()->create([
'desa_id' => $desa2->desa_id,
'bulan' => 1,
'tahun' => 2024,
]);

// Data untuk desa1, bulan 1, tahun 2023 (tidak match semua filter)
AkiAkb::factory()->create([
'desa_id' => $desa1->desa_id,
'bulan' => 1,
'tahun' => 2023,
]);

// Act: Export dengan kombinasi filter
$export = new ExportAKIAKB([
'desa_id' => $desa1->desa_id,
'bulan' => 1,
'tahun' => 2024
]);
$collection = $export->collection();

// Assert: Hanya data yang match semua filter yang ter-export
expect($collection)->toHaveCount(1)
->and($collection->first()->desa_id)->toBe('111')
->and($collection->first()->bulan)->toBe(1)
->and($collection->first()->tahun)->toBe(2024);
});

test('export aki akb dengan filter Semua for desa_id', function () {
// Arrange: Buat data dengan beberapa desa
AkiAkb::query()->delete();
$desa1 = DataDesa::factory()->create(['desa_id' => '111']);
$desa2 = DataDesa::factory()->create(['desa_id' => '222']);

AkiAkb::factory()->count(2)->create([
'desa_id' => $desa1->desa_id,
]);
AkiAkb::factory()->count(3)->create([
'desa_id' => $desa2->desa_id,
]);

// Act: Export dengan filter 'Semua'
$export = new ExportAKIAKB(['desa_id' => 'Semua']);
$collection = $export->collection();

// Assert: Semua data harus ter-export
expect($collection)->toHaveCount(5);
});

test('export aki akb dengan filter Semua for bulan', function () {
// Arrange: Buat data dengan berbagai bulan
AkiAkb::query()->delete();
$desa = DataDesa::factory()->create();

AkiAkb::factory()->create(['desa_id' => $desa->desa_id, 'bulan' => 1]);
AkiAkb::factory()->create(['desa_id' => $desa->desa_id, 'bulan' => 2]);
AkiAkb::factory()->create(['desa_id' => $desa->desa_id, 'bulan' => 3]);

// Act: Export dengan filter 'Semua' untuk bulan
$export = new ExportAKIAKB(['bulan' => 'Semua']);
$collection = $export->collection();

// Assert: Semua data harus ter-export
expect($collection)->toHaveCount(3);
});

test('export aki akb dengan filter Semua for tahun', function () {
// Arrange: Buat data dengan berbagai tahun
AkiAkb::query()->delete();
$desa = DataDesa::factory()->create();

AkiAkb::factory()->create(['desa_id' => $desa->desa_id, 'tahun' => 2023]);
AkiAkb::factory()->create(['desa_id' => $desa->desa_id, 'tahun' => 2024]);
AkiAkb::factory()->create(['desa_id' => $desa->desa_id, 'tahun' => 2025]);

// Act: Export dengan filter 'Semua' untuk tahun
$export = new ExportAKIAKB(['tahun' => 'Semua']);
$collection = $export->collection();

// Assert: Semua data harus ter-export
expect($collection)->toHaveCount(3);
});

test('export aki akb with empty filter', function () {
// Arrange: Buat data
AkiAkb::query()->delete();
$desa = DataDesa::factory()->create();
AkiAkb::factory()->count(4)->create([
'desa_id' => $desa->desa_id,
]);

// Act: Export dengan filter kosong
$export = new ExportAKIAKB([]);
$collection = $export->collection();

// Assert: Semua data harus ter-export
expect($collection)->toHaveCount(4);
});

test('export aki akb with non_existent desa_id filter', function () {
// Arrange: Buat data
AkiAkb::query()->delete();
$desa = DataDesa::factory()->create();
AkiAkb::factory()->count(2)->create([
'desa_id' => $desa->desa_id,
]);

// Act: Export dengan filter desa_id yang tidak ada
$export = new ExportAKIAKB(['desa_id' => 'non_existent']);
$collection = $export->collection();

// Assert: Tidak ada data yang ter-export
expect($collection)->toHaveCount(0);
});

test('export aki akb with non_existent bulan filter', function () {
// Arrange: Buat data dengan bulan 1-3
AkiAkb::query()->delete();
$desa = DataDesa::factory()->create();
AkiAkb::factory()->create(['desa_id' => $desa->desa_id, 'bulan' => 1]);
AkiAkb::factory()->create(['desa_id' => $desa->desa_id, 'bulan' => 2]);

// Act: Export dengan filter bulan yang tidak ada
$export = new ExportAKIAKB(['bulan' => 99]);
$collection = $export->collection();

// Assert: Tidak ada data yang ter-export
expect($collection)->toHaveCount(0);
});

test('export aki akb with non_existent tahun filter', function () {
// Arrange: Buat data dengan tahun 2023-2024
AkiAkb::query()->delete();
$desa = DataDesa::factory()->create();
AkiAkb::factory()->create(['desa_id' => $desa->desa_id, 'tahun' => 2023]);
AkiAkb::factory()->create(['desa_id' => $desa->desa_id, 'tahun' => 2024]);

// Act: Export dengan filter tahun yang tidak ada
$export = new ExportAKIAKB(['tahun' => 1990]);
$collection = $export->collection();

// Assert: Tidak ada data yang ter-export
expect($collection)->toHaveCount(0);
});

test('export aki akb filter preserves relationships', function () {
// Arrange: Buat data dengan relasi desa
AkiAkb::query()->delete();
$desa1 = DataDesa::factory()->create(['desa_id' => '111', 'nama' => 'Desa Filter Test']);
$desa2 = DataDesa::factory()->create(['desa_id' => '222', 'nama' => 'Desa Lain']);

AkiAkb::factory()->create([
'desa_id' => $desa1->desa_id,
'aki' => 5,
'akb' => 3,
]);
AkiAkb::factory()->create([
'desa_id' => $desa2->desa_id,
'aki' => 2,
'akb' => 1,
]);

// Act: Export dengan filter
$export = new ExportAKIAKB(['desa_id' => $desa1->desa_id]);
$collection = $export->collection();
$mappedData = $export->map($collection->first());

// Assert: Relasi desa harus tetap ter-load
expect($collection)->toHaveCount(1)
->and($collection->first()->desa)->not->toBeNull()
->and($collection->first()->desa->nama)->toBe('Desa Filter Test')
->and($mappedData[1])->toBe('Desa Filter Test');
});
Loading