Professional Documents
Culture Documents
Whitebox Testing
Whitebox Testing
Whitebox Testing
1. Login(Fn-01)
1. <form class="mt-4" method="POST" action="{{route('login')}}">
@csrf
<div class="row">
<div class="col-lg-12">
<div class="form-group">
<label class="text-dark" for="identity">ID</label>
<input class="form-control{{ $errors->has('identity') ? ' is-
invalid' : '' }}" id="identity" type="text" placeholder="masukkan
email atau NIK" name="identity" required autofocus>
</div>
</div>
<div class="col-lg-12">
<div class="form-group">
<label class="text-dark" for="pwd">Kata Sandi</label>
<input class="form-control{{ $errors->has('password') ? ' is-
invalid' : '' }}" id="pwd" type="password" placeholder="masukkan
kata sandi" name="password">
</div>
</div>
2. <div class="col-lg-12 text-center">
<button type="submit" class="btn btn-block btn-
success">Masuk</button>
</div>
</div>
</form>
3. Route::post('login', [ 'as' => 'login', 'uses' =>
'Auth\LoginController@login']);
4. public function login(Request $request)
{
$loginType = filter_var($request->identity,
FILTER_VALIDATE_EMAIL) ? 'email' : 'identity';
$login = [
$loginType => $request->identity,
'password' => $request->password
];
5. if (auth()->attempt($login))
6. return redirect()->route('dashboard');
7. return redirect()->route('login')->with(['error' => 'Autentikasi
gagal!']);}
8. $errors->as('identity')
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('identity') }}</strong>
</span>$errors->as('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $errors->first('password') }}</strong>
</span>
9. </div>
</div>
</div>
</div>
Basis Jalur
Deskripsi Sukses
Alur Independen
Login menggunakan akun admin
Jalur 1 1-2-3-4-5-7-9 iya
yang terdaftar
Login menggunakan akun admin
Jalur 2 1-2-3-4-5-6-8-9 iya
yang belum terdaftar
Basis Jalur
Deskripsi Sukses
Alur Independen
Menambahkan data sekolah baru
1-2-3-4-5-6-7-8-9-10-
Jalur 1 dengan input yang sesuai dengan iya
11-12
tipe data
Koneksi dengan server terputus
Jalur 2 1-4-5-6-7-11-12 dimana response mengembalikan iya
nilai ‘false’
Admin berusaha menambahkan
Jalur 3 1-6-7-9-10-11-12 iya
sekolah dengan quota kosong
Jalur 4 1-4-5-6-7-8-9-10-11-12 Admin berusaha menambahkan iya
sekolah dengan nama yang sudah
ada
Penanganan kesalahan pada sisi
Jalur 5 1-6-7-8-9-10-11-12 server dimana hasil request iya
mengembalikan status ‘error’
1. Route::get('/manage/{type}','Controller@manage')->name('manage');
public function manage($type) {
$level =
Level::with(['students','students.grade','students.group','students
.registrations'])->where('name', $type)->first()->toJson();
$data = (object) null;
$data->title = 'Pendaftaran ' . strtoupper($type);
$data->type = $type;
$data->level = $level;
return view('admin.manage', compact('data'));
}
window._obj_level = {!! $data->level !!};
window.card_content = '<div class="pt-4 pb-4 mt-4 mb-4 text-center
text-muted">pendaftaran belum dibuka</div>';
window.secondary = {
text : '<p><span class="text-uppercase">{{$data->type}}</span> pada
{{env('APP_NAME')}} dapat menerima calon peserta didik hingga <code
class="font-weight-bold">'+(_obj_level.quota * _obj_level.room)
+'</code> orang dimana tiap kelas memiliki <code class="font-
weight-bold">'+_obj_level.room+'</code> ruang dengan quota <code
class="font-weight-bold">'+_obj_level.quota+'</code> orang. Klik
tombol <small class="bg-secondary text-white pt-1 pb-1 pl-2 pr-2
rounded">tutup</small> untuk menutup akses pendaftaran dan
menyimpannya sebagai arsip.</p>',
btn : 'tutup',
role : 2,
fun : function () {
_popup.content({
id : 'popup-close-access',
header : '<strong>tutup akses pendaftaran</strong>',
content : '<p>apakah anda yakin ingin menghapus <code class="font-
weight-bold">{{strtoupper($data->type)}}</code> dari sistem?</p>',
footer : _btn_group.make([
_btn.render({
operate : 'batal',
type : 'success',
title : 'batal',
content : 'batal',
fun : function () {
_popup.close('popup-close-access');
}
}),
_btn.render({
operate : 'tutup',
type : 'secondary',
title : 'tutup',
content : 'tutup',
fun : function () {
_popup.close('popup-close-access');
_transition.in();
_switcher.switch('switch-akses');
_response.post({async:false, url:'{{url('close')}}',data:
{id:_obj_level.id}, file:new FormData()});
2. if (_response.response._status) {
3. window._obj_level = _response.response;
_card.remove('card-tabel-pendaftaran');
_tagger.tag('card-tabel-pendaftaran');
window.card_content = '<div class="pt-4 pb-4 mt-4 mb-4 text-center
text-muted">pendaftaran belum dibuka</div>';
_card.render({
element : 'card-tabel-pendaftaran',
items : [
{
title : 'Data Pendaftaran <span class="text-uppercase">{{$data-
>type}}</span>',
label : 'ti-user',
id : 'tabel-pendaftaran',
content : card_content,
}
],
});
}
4. _transition.out();
}
}),
]),
});
}
}
window.primary = {
text : '<p><span class="text-uppercase">{{$data->type}}</span> pada
{{env('APP_NAME')}} dapat menerima calon peserta didik hingga <code
class="font-weight-bold">'+(_obj_level.quota * _obj_level.room)
+'</code> orang dimana tiap kelas memiliki <code class="font-
weight-bold">'+_obj_level.room+'</code> ruang dengan quota <code
class="font-weight-bold">'+_obj_level.quota+'</code> orang. Klik
tombol <small class="bg-success text-white pt-1 pb-1 pl-2 pr-2
rounded">buka</small> untuk membuka akses pendaftaran.</p>',
btn : 'buka',
role : 1,
fun : function () {
_transition.in();
_response.post({async:false, url:'{{url('open')}}',data:
{id:_obj_level.id}, file:new FormData()});
5. if (_response.response._status) {
6. window._obj_level = _response.response;
_card.remove('card-tabel-pendaftaran');
_tagger.tag('card-tabel-pendaftaran');
window.card_content = _tables.render({
element : 'table-{{$data->type}}',
template : 'custom',
column : [
{content : 'Profil'},
{content : 'Tempat / Tanggal Lahir'},
{content : 'Kelas / Ruang'},
{content : 'Token'},
{content : 'Aksi'},
],
});
_card.render({
element : 'card-tabel-pendaftaran',
items : [
{
title : 'Data Pendaftaran <span class="text-uppercase">{{$data-
>type}}</span>',
label : 'ti-user',
id : 'tabel-pendaftaran',
content : card_content,
}
],
});
7. _switcher.switch('switch-akses');
_transition.out();
}
}
8. if (_obj_level.open) {
9. let temp = window.primary;
window.primary = window.secondary;
window.secondary = temp;
window.card_content = _tables.render({
element : 'table-{{$data->type}}',
template : 'custom',
column : [
{content : 'Profil'},
{content : 'Tempat / Tanggal Lahir'},
{content : 'Kelas / Ruang'},
{content : 'Token'},
{content : 'Aksi'},
],
});
}
10. _card.render({
element : 'card-akses-pendaftaran',
items : [
{
title : 'Akses Pendaftaran',
label : 'ti-user',
id : 'akses-pendaftaran',
content : _switcher.render({
id : 'switch-akses',
primary : window.primary,
secondary : window.secondary,
}),
}
],
});
_card.render({
element : 'card-tabel-pendaftaran',
items : [
{
title : 'Data Pendaftaran <span class="text-uppercase">{{$data-
>type}}</span>',
label : 'ti-user',
id : 'tabel-pendaftaran',
content : card_content,
}
],
});
11. if (_obj_level.open && _obj_level.students.length > 0) {
12. const students = _obj_level.students;
let verified_row = [],
nonverified_row = [];
13. for (let i = 0; i < students.length; i++) {
14. if (students[i].registrations[0].verified)
15. verified_row.push(students[i]);
16. else
nonverified_row.push(students[i]);
17. }
18. insertTable(nonverified_row);
insertTable(verified_row);
}
19. _tagger.tag('popup-delete-record');
_popup.init({element : 'popup-delete-record', align : 'center'});
_tagger.tag('popup-close-access');
_popup.init({element : 'popup-close-access', align : 'center'});
_transition.out();
Route::post('verify', 'RegistrationController@verify');
Route::post('unverify', 'RegistrationController@unverify');
20. public function verify(Request $request):JsonResponse {
$token = $request->token;
21. if (Registration::all()->where('token', $token)->count() > 0) {
22. $data = Registration::all()->firstWhere('token', $token);
$data->veryfied_by = _Authorize::data()->name;
$data->verified = true;
$data->save();
$data = (object) null;
$data->status = true;
return response()->json($data);
}
23. else {
$data = (object) null;
$data->status = false;
return response()->json($data);
}
24. }
Basis Jalur
Deskripsi Sukses
Alur Independen
Admin mengakses halaman sekolah
1-2-3-4-5-6-7-8-9-10- dimana akses pendaftaran sekolah
Jalur 1 11-12-13-14-15-17-13- yang sedang dibuka lebih dari 1 iya
18-19-20-21-22-24 dan jumlah pendaftar tiap sekolah
lebih dari 1
Admin mengakses halaman sekolah
1-4-5-6-7-8-9-10-11-12- dimana akses pendaftaran sekolah
Jalur 2 13-14-15-17-13-18-19- yang sedang dibuka hanya 1 dan iya
20-21-22-24 jumlah pendaftar tiap sekolah lebih
dari 1
Admin mengakses halaman sekolah
dimana akses pendaftaran sekolah
1-4-7-8-9-10-11-12-18-
Jalur 3 yang sedang dibuka lebih dari 1 iya
19-20-21-22-24
dan jumlah pendaftar tiap sekolah
kosong
Admin mengakses halaman sekolah
1-4-7-8-9-10-11-12-19-
Jalur 4 dimana tidak ada akses iya
20-23-24
pendaftaran yang dibuka
Admin hanya membuka akses
1-2-3-4-5-6-7-10-19-20-
Jalur 5 pendaftaran tanpa melakukan aksi iya
23-24
apapun
1-2-3-4-5-6-7-8-9-10- Admin menghapus salah satu data
Jalur 6 11-12-13-18--19-20-23- pendaftar iya
24
1-2-3-4-7-10-11-12-13- Admin memverifikasi salah satu
Jalur 7 16-17-13-18-19-20-23- data pendaftar iya
24
1-2-3-4-7-10-11-12-13- Admin batal verifikasi salah satu
Jalur 8 16-17-13-16-17-13-18- data pendaftar iya
19-20-24
1. Route::get('/data/{type}','Controller@data')->name('data');
2. window._obj_level = {!! $data->level !!};
const archives = _obj_level.archives;
3. for (let i = 0; i < archives.length; i++) {
4. const archive = archives[i];
const studs = archive.studs;
const datename = datemaker(archive.updated_at);
_tagger.tag(datename[1]);
_card.render({
element : datename[1],
items : [
{
title : 'Arsip ' + datename[0],
label : 'ti-user',
id : 'data-' + datename[0],
content : _ui_factory.__general.compact_els('div',[
_btn_group.make([
_delete.render(function (e) {
_popup.content({
id : 'popup-delete-level',
header : '<strong>hapus arsip pendaftaran</strong>',
content : '<p>apakah anda yakin ingin menghapus arsip <code
class="font-weight-bold">'+datename[0]+'</code> dari sistem?</p>',
footer : _btn_group.make([
_btn.render({
operate : 'batal',
type : 'success',
title : 'batal',
content : 'batal',
fun : function () {
_popup.close('popup-delete-record');
}
}),
_btn.render({
operate : 'hapus',
type : 'secondary',
title : 'hapus',
content : 'hapus',
fun : function () {
_popup.close('popup-delete-record');
_transition.in();
_response.post({async:false, url:'{{url('deleteReport')}}', data:
{id:archive.id}, file:new FormData()});
5. if (_response.response._status) {
6. let target = e.target;
let parent = target.parentNode;
parent.removeChild(target);
}
7. _transition.out();
}
}),
]),
});
}),
_btn.render({
type : 'success',
title : 'cetak laporan',
operate : 'cetak',
content : 'cetak laporan',
fun : function (e) {
const win = window.open('{{url('/report')}}/' + archive.id,
'_blank');
win.focus();
}
}),
]),
_tables.render({
element : 'table-' + datename[0],
template : 'custom',
column : [
{content : 'Profil'},
{content : 'Tempat / Tanggal Lahir'},
{content : 'Kelas / Ruang'},
{content : 'Tanggal Daftar'},
],
}),
]),
}
],
});
8. _tagger.tag('popup-delete-record');
_popup.init({element : 'popup-delete-record', align :
'center',});
_transition.out();
9. Route::post('clearRegistration', 'RegistrationController@clear');
public function clear(Request $request):JsonResponse {
$regists = Registration::whereHas('student.levels', function($q)
use ($request){
$q->where('name', '=', $request->name);
})->get();
$regist->delete();
$data = (object) null;
$data->status = true;
return response()->json($data);
}
Basis Jalur
Deskripsi Sukses
Alur Independen
Membuka halaman riwayat sekolah
dimana terdapat 1 atau lebih
Jalur 1 1-2-3-4-5-6-7-3-8-9 iya
pendaftaran dan admin melakukan
penghapusan data
Membuka halaman riwayat sekolah
Jalur 2 1-2-3-4-7-3-8-9 dimana terdapat 1 atau lebih iya
pendaftaran
Jalur 3 1-2-3-8-9 Tidak ada riwayat pendaftaran iya
return response()->json($request);
}
9. if (_response.response._status) {
10. document.getElementById('daftar').innerHTML = '';
const card = document.getElementById('card-fill');
card.setAttribute('style', 'margin-bottom:12rem');
card.innerHTML = '<h3 class="h3">Pendaftaran Berhasil !</h3><h4
class="h4 text-black-50">menunggu verifikasi
admin.</h4><hr><p>Proses verifikasi yang dilakukan oleh admin
mungkin membutuhkan waktu beberapa jam. Status verifikasi
pendaftaran dapat dilihat pada alamat <a
href="{{url('/registration')}}/'+_response.response.token+'">
ini</a>.</p>';
}
11. console.log(_response.response);
});
}
12. else {
document.getElementById('daftar').innerHTML = '';
document.getElementById('card-fill').innerHTML = '<h3 class="text-
muted text-center" style="padding-bottom: 12rem">Pendaftaran Belum
Dibuka</h3>';
}
13. </script>
Basis Jalur
Deskripsi Sukses
Alur Independen
Pengunjung membuka web dimana
1-2-3-4-5-6-7-8-9-10- akses pendaftaran sedang dibuka
Jalur 1 iya
11-13 kemudian mengisi form
pendaftaran dan hasilnya sukses
Akses pendaftaran dibuka dan
Jalur 2 1-2-3-4-5-6-7-8-11-13 pengunjung gagal melakukan iya
submit form pendaftaran
Jalur 3 1-2-3-4-12-13 Akses pendaftaran sedang tutup iya
Basis Jalur
Deskripsi Sukses
Alur Independen
Akses pendaftaran sekolah yang
Jalur 1 1-2-3-4-5-6-8 dituju berada pada indeks pertama iya
dan akses dibuka
Looping terjadi dimana sekolah
Jalur 2 1-2-3-4-7-4-5-6-8 iya
berada pada indeks != 0
Nilai pada array != undefined tetapi
Jalur 3 1-2-3-4-8 iya
jumlah sekolah dalam array 0
Jalur 4 1-2-3-8 Nilai pada array == undefined iya