testing

========
Unit test : Hanya untuk testing satu method biasanya untuk memastikan rumus (yang biasanya kompleks) benar proses dan outputnya. Kalau methodnya cuma CRUD, tidak usah dibuat unit test.

========
Functional test : Untuk testing satu controller, jadi kalau ada CRUD Users, bisa dibuatkan functional test dan biasanya sudah testing datatabasenya sehingga saya pakai
'use Illuminate\Foundation\Testing\DatabaseTransactions;'.
Ini tidak perlu ada hubungannya dengan javascript, bisa via phpunitnya laravel. Ini cuplikan dari dokumentasi rails. http://guides.rubyonrails.org/testing.html...

"In Rails, testing the various actions of a controller is a form of writing functional tests."

========
Integration test: Untuk testing antar controllers biasanya, misalnya jika CRUD yang ada ajax callnya ke route berbeda, bisa dikategorikan disini. Di laravel juga sudah ada, gunakan dokumentasi ini untuk ajax call dan lihat json outputnya. https://laravel.com/docs/5.3/application-testing... dan ini cuplikan dari dokumentasi rails

"Integration tests are used to test how various parts of your application interact. They are generally used to test important workflows within our application."

========
User Acceptance Test: Biasanya saya pakai ini untuk interaksi javascriptnya, sekarang pakai selenium walaupun masih sulit untuk beberapa case, sehingga case tertentu, cukup dengan integration test saja. Sementara di depan ada Laravel Dusk, kita tunggu.

========
Regression Test: ini testing untuk mencari celah bug pada prosesnya, tidak ada error di method misalnya, tapi outputnya salah. Mungkin saya biasanya pakai Unit Test saja sih.

========
Environment: di laravel hanya bisa satu environment via .env. Saya sudah berkali-kali coba tanpa modifikasi agar memanggil .env.testing belum berhasil. Sehingga sekarang .env digunakan untuk database mysql sedangkan untuk testing di config/database.php saya modifikasi menjadi 'default' => $app->environment('testing') ? 'sqlite' : env('DB_CONNECTION', 'mysql'),

karena secara default phpunit.xml sudah ada code <env name="APP_ENV" value="testing"/>

Tapi di Laravel 5.2 ke atas tidak bisa modifikasi config di atas, karena helper methodnya belum terload. Sehingga yang dilakukan di phpunit.xml itu tambahkan path-nya sqlite. <env name="DB_DATABASE" value='path/to/database.sqlite' /> atau jika ingin menggunakan database mysql juga, tapi beda database dengan .env maka lengkapi seperti setup value database di mysql sehingga menjadi

<env name="APP_ENV" value="testing"/>
<env name="DB_HOST" value='localhost' />
<env name="DB_DATABASE" value='mysql_testing' />
<env name="DB_USERNAME" value='root' />
<env name="DB_PASSWORD" value='' />

laravel parameter menggunakan slash

Route::get('view/{slashData?}', 'ExampleController@getData')
    ->where('slashData', '(.*)');
jika menggunakan route::resource
simpan di routeserviceprovider
Route::pattern('id', '[0-9]+');

parsley validation

 $('#corrective-form .btn').on('click', function() {
           $('#corrective-form').parsley().validate();
           validateFront();
         });
         var validateFront = function() {
           if (true === $('#corrective-form').parsley().isValid()) {
             $('.bs-callout-info').removeClass('hidden');
             $('.bs-callout-warning').addClass('hidden');
           } else {
             $('.bs-callout-info').addClass('hidden');
             $('.bs-callout-warning').removeClass('hidden');
           }
         };

Laravel ajax file upload

di view

$("#modal-edit-corrective").find('.modal-footer #btn-submit').on('click', function(e){
    var id={!! $incompatibility->corrective->id !!}
    var formdata = new FormData();    
    var file = $("#modal-edit-corrective").find('#attachment')[0].files[0];
    formdata.append('attachment', file);
    formdata.append('_token','{{ csrf_token() }}');
    formdata.append('corrective_action',$("#modal-edit-corrective").find(".modal-body #corrective_action").val());
    formdata.append('preventive_measure',$("#modal-edit-corrective").find(".modal-body #preventive_measure").val());
    $.ajax({
      type:"POST",
      url:"{!! route('corrective.update',$incompatibility->corrective->id) !!}",
      headers: {
              'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          },
      data:formdata,
      cache:false,
      processData: false,
      async:false,
      contentType: false,
      success:function(){
          window.location.reload();
      }
    })
  })

disable datatable back to page one

disable datatable kembali ke halaman pertama
gunkan

stateSave: true,

integrasi wysiwyg bootstrap

 <h2>Uraian Ketidaksesuaian</h2>
                         
                  <div class="clearfix"></div>
                </div>
                <div class="x_content">
                  <div id="alerts"></div>
                 
                  <div class="btn-toolbar editor" data-role="editor-toolbar" data-target="#editor">
                    <div class="btn-group">
                      <a class="btn dropdown-toggle" data-toggle="dropdown" title="" data-original-title="Font"><i class="fa fa-font"></i><b class="caret"></b></a>
                      <ul class="dropdown-menu">
                      <li><a data-edit="fontName Serif" style="font-family:'Serif'">Serif</a></li><li><a data-edit="fontName Sans" style="font-family:'Sans'">Sans</a></li><li><a data-edit="fontName Arial" style="font-family:'Arial'">Arial</a></li><li><a data-edit="fontName Arial Black" style="font-family:'Arial Black'">Arial Black</a></li><li><a data-edit="fontName Courier" style="font-family:'Courier'">Courier</a></li><li><a data-edit="fontName Courier New" style="font-family:'Courier New'">Courier New</a></li><li><a data-edit="fontName Comic Sans MS" style="font-family:'Comic Sans MS'">Comic Sans MS</a></li><li><a data-edit="fontName Helvetica" style="font-family:'Helvetica'">Helvetica</a></li><li><a data-edit="fontName Impact" style="font-family:'Impact'">Impact</a></li><li><a data-edit="fontName Lucida Grande" style="font-family:'Lucida Grande'">Lucida Grande</a></li><li><a data-edit="fontName Lucida Sans" style="font-family:'Lucida Sans'">Lucida Sans</a></li><li><a data-edit="fontName Tahoma" style="font-family:'Tahoma'">Tahoma</a></li><li><a data-edit="fontName Times" style="font-family:'Times'">Times</a></li><li><a data-edit="fontName Times New Roman" style="font-family:'Times New Roman'">Times New Roman</a></li><li><a data-edit="fontName Verdana" style="font-family:'Verdana'">Verdana</a></li></ul>
                    </div>

                    <div class="btn-group">
                      <a class="btn dropdown-toggle" data-toggle="dropdown" title="" data-original-title="Font Size"><i class="fa fa-text-height"></i>&nbsp;<b class="caret"></b></a>
                      <ul class="dropdown-menu">
                        <li>
                          <a data-edit="fontSize 5">
                            <p style="font-size:17px">Huge</p>
                          </a>
                        </li>
                        <li>
                          <a data-edit="fontSize 3">
                            <p style="font-size:14px">Normal</p>
                          </a>
                        </li>
                        <li>
                          <a data-edit="fontSize 1">
                            <p style="font-size:11px">Small</p>
                          </a>
                        </li>
                      </ul>
                    </div>

                    <div class="btn-group">
                      <a class="btn" data-edit="bold" title="" data-original-title="Bold (Ctrl/Cmd+B)"><i class="fa fa-bold"></i></a>
                      <a class="btn" data-edit="italic" title="" data-original-title="Italic (Ctrl/Cmd+I)"><i class="fa fa-italic"></i></a>
                      <a class="btn" data-edit="strikethrough" title="" data-original-title="Strikethrough"><i class="fa fa-strikethrough"></i></a>
                      <a class="btn" data-edit="underline" title="" data-original-title="Underline (Ctrl/Cmd+U)"><i class="fa fa-underline"></i></a>
                    </div>

                    <div class="btn-group">
                      <a class="btn" data-edit="insertunorderedlist" title="" data-original-title="Bullet list"><i class="fa fa-list-ul"></i></a>
                      <a class="btn" data-edit="insertorderedlist" title="" data-original-title="Number list"><i class="fa fa-list-ol"></i></a>
                      <a class="btn" data-edit="outdent" title="" data-original-title="Reduce indent (Shift+Tab)"><i class="fa fa-dedent"></i></a>
                      <a class="btn" data-edit="indent" title="" data-original-title="Indent (Tab)"><i class="fa fa-indent"></i></a>
                    </div>

                    <div class="btn-group">
                      <a class="btn btn-info" data-edit="justifyleft" title="" data-original-title="Align Left (Ctrl/Cmd+L)"><i class="fa fa-align-left"></i></a>
                      <a class="btn" data-edit="justifycenter" title="" data-original-title="Center (Ctrl/Cmd+E)"><i class="fa fa-align-center"></i></a>
                      <a class="btn" data-edit="justifyright" title="" data-original-title="Align Right (Ctrl/Cmd+R)"><i class="fa fa-align-right"></i></a>
                      <a class="btn" data-edit="justifyfull" title="" data-original-title="Justify (Ctrl/Cmd+J)"><i class="fa fa-align-justify"></i></a>
                    </div>

                    <div class="btn-group">
                      <a class="btn dropdown-toggle" data-toggle="dropdown" title="" data-original-title="Hyperlink"><i class="fa fa-link"></i></a>
                      <div class="dropdown-menu input-append">
                        <input class="span2" placeholder="URL" type="text" data-edit="createLink">
                        <button class="btn" type="button">Add</button>
                      </div>
                      <a class="btn" data-edit="unlink" title="" data-original-title="Remove Hyperlink"><i class="fa fa-cut"></i></a>
                    </div>

                    <div class="btn-group">
                      <a class="btn" title="" id="pictureBtn" data-original-title="Insert picture (or just drag &amp; drop)"><i class="fa fa-picture-o"></i></a>
                      <input type="file" data-role="magic-overlay" data-target="#pictureBtn" data-edit="insertImage" style="opacity: 0; position: absolute; top: 0px; left: 0px; width: 41px; height: 34px;">
                    </div>

                    <div class="btn-group">
                      <a class="btn" data-edit="undo" title="" data-original-title="Undo (Ctrl/Cmd+Z)"><i class="fa fa-undo"></i></a>
                      <a class="btn" data-edit="redo" title="" data-original-title="Redo (Ctrl/Cmd+Y)"><i class="fa fa-repeat"></i></a>
                    </div>
                  </div>

                 

                  <div id="editor" name="uraian" class="editor-wrapper placeholderText" contenteditable="true">            
                  </div>

                      <textarea name="uraian" id="uraian" style="display: none;"></textarea>


                  <div class="ln_solid"></div>


 <!-- bootstrap-wysiwyg -->
    <script>
      $(document).ready(function() {
        function initToolbarBootstrapBindings() {
          var fonts = ['Serif', 'Sans', 'Arial', 'Arial Black', 'Courier',
              'Courier New', 'Comic Sans MS', 'Helvetica', 'Impact', 'Lucida Grande', 'Lucida Sans', 'Tahoma', 'Times',
              'Times New Roman', 'Verdana'
            ],
            fontTarget = $('[title=Font]').siblings('.dropdown-menu');
          $.each(fonts, function(idx, fontName) {
            fontTarget.append($('<li><a data-edit="fontName ' + fontName + '" style="font-family:\'' + fontName + '\'">' + fontName + '</a></li>'));
          });
          $('a[title]').tooltip({
            container: 'body'
          });
          $('.dropdown-menu input').click(function() {
              return false;
            })
            .change(function() {
              $(this).parent('.dropdown-menu').siblings('.dropdown-toggle').dropdown('toggle');
            })
            .keydown('esc', function() {
              this.value = '';
              $(this).change();
            });

          $('[data-role=magic-overlay]').each(function() {
            var overlay = $(this),
              target = $(overlay.data('target'));
            overlay.css('opacity', 0).css('position', 'absolute').offset(target.offset()).width(target.outerWidth()).height(target.outerHeight());
          });

          if ("onwebkitspeechchange" in document.createElement("input")) {
            var editorOffset = $('#editor').offset();

            $('.voiceBtn').css('position', 'absolute').offset({
              top: editorOffset.top,
              left: editorOffset.left + $('#editor').innerWidth() - 35
            });
          } else {
            $('.voiceBtn').hide();
          }
        }

        function showErrorAlert(reason, detail) {
          var msg = '';
          if (reason === 'unsupported-file-type') {
            msg = "Unsupported format " + detail;
          } else {
            console.log("error uploading file", reason, detail);
          }
          $('<div class="alert"> <button type="button" class="close" data-dismiss="alert">&times;</button>' +
            '<strong>File upload error</strong> ' + msg + ' </div>').prependTo('#alerts');
        }

        initToolbarBootstrapBindings();

        $('#editor').wysiwyg({
          fileUploadError: showErrorAlert
        });

        $('#form_tindakan').submit(function(){
          $("#uraian").val($("#editor").html());
        })

        window.prettyPrint;
        prettyPrint();

        $(".js-example-basic-multiple").select2();
 
      });
    </script>

Membuat Global Variable di Laravel

buat folder composers di dalamfolder app

buat file di app/composers dengan nama NavbarComposer.php

<?php

/**

*

*/

namespace App\Composers;

use Illuminate\Contracts\View\View;

use App\Models\Incompatibility;



class NavbarComposer{



 public function compose($view){

  $incompatibilities=Incompatibility::where('status','=',NULL)->get();



  $view->with('incompatibilities',$incompatibilities);

 } 

}

?>





Terus edit file AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        $this->buatNavbar();
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('user','App\Models\User');
    }

    private function buatNavbar(){
        view()->composer('backend.layout.app','App\Composers\NavbarComposer');
    }
}