AnonSec Team
Server IP : 103.11.96.170  /  Your IP : 18.217.35.130
Web Server : Microsoft-IIS/10.0
System : Windows NT WIN-F6SLGVICLOP 10.0 build 17763 (Windows Server 2016) AMD64
User : elibrary.unsap.ac.id ( 0)
PHP Version : 7.4.19
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF
Directory (0777) :  D:/localhost/grosir/tests/Feature/

[  Home  ][  C0mmand  ][  Upload File  ]

Current File : D:/localhost/grosir/tests/Feature/TransactionEntryTest.php
<?php

namespace Tests\Feature;

use App\Cart\CartCollection;
use App\Cart\CashDraft;
use App\Cart\CreditDraft;
use App\Cart\Item;
use App\Product;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Tests\BrowserKitTestCase;

class TransactionEntryTest extends BrowserKitTestCase
{
    use DatabaseMigrations;

    /** @test */
    public function user_can_visit_transaction_drafts_page()
    {
        $this->loginAsUser();

        // Add new draft to collection
        $cart = new CartCollection();
        $draft = $cart->add(new CashDraft());

        $this->visit(route('cart.index'));

        $this->assertViewHas('draft', $draft);
        $this->see($draft->type);
    }

    /** @test */
    public function user_can_create_transaction_draft_by_transaction_create_button()
    {
        $this->loginAsUser();
        $this->visit(route('home'));

        $this->press(trans('transaction.create'));
        $cart = new CartCollection();
        $draft = $cart->content()->last();
        $this->seePageIs(route('cart.show', $draft->draftKey));

        $this->press(trans('transaction.create_credit'));
        $cart = new CartCollection();
        $draft = $cart->content()->last();
        $this->seePageIs(route('cart.show', $draft->draftKey));
    }

    /** @test */
    public function user_can_search_product_on_transaction_draft_page()
    {
        $product = factory(Product::class)->create(['name' => 'Testing Produk 1']);
        $this->loginAsUser();

        $cart = new CartCollection();
        $draft = new CreditDraft();
        $cart->add($draft);

        // Visit cart index page
        $this->visit(route('cart.index'));

        // Visit search for products
        $this->submitForm(trans('cart.product_search'), [
            'query' => 'testing',
        ]);

        $this->seePageIs(route('cart.show', [$draft->draftKey, 'query' => 'testing']));
        // See product list appears
        $this->see($product->name);
        $this->see(format_rp($product->credit_price));
        $this->seeElement('form', ['action' => route('cart.add-draft-item', [$draft->draftKey, $product->id])]);
        $this->seeElement('input', ['id' => 'qty-'.$product->id, 'name' => 'qty']);
        $this->seeElement('input', ['id' => 'add-product-'.$product->id]);
        $this->dontSee($product->cash_price);
    }

    /** @test */
    public function user_can_add_item_to_cash_draft()
    {
        $product1 = factory(Product::class)->create(['name' => 'Testing Produk 1', 'cash_price' => 400, 'credit_price' => 500]);
        $product2 = factory(Product::class)->create(['name' => 'Testing Produk 2', 'cash_price' => 1000, 'credit_price' => 1100]);
        $this->loginAsUser();

        $cart = new CartCollection();
        $draft = new CashDraft();
        $cart->add($draft);

        // Visit cart index with searched item
        $this->visit(route('cart.show', [$draft->draftKey, 'query' => 'testing']));

        $this->type(2, 'qty');
        $this->press('add-product-'.$product1->id);
        // $this->see(trans('cart.item_added', [
        //     'product_name' => $product1->name.' ('.$product1->unit->name.')',
        //     'qty'          => 2,
        // ]));

        $this->type(3, 'qty');
        $this->press('add-product-'.$product2->id);
        // $this->see(trans('cart.item_added', [
        //     'product_name' => $product2->name.' ('.$product2->unit->name.')',
        //     'qty'          => 3,
        // ]));

        $this->seePageIs(route('cart.show', [$draft->draftKey, 'query' => 'testing']));
        $this->assertTrue($cart->draftHasItem($draft, $product1));
        $this->assertTrue($cart->draftHasItem($draft, $product2));
        $this->assertEquals(3800, $draft->getTotal());

        $this->seeElement('input', ['id' => 'qty-'. 0]);
        $this->seeElement('input', ['id' => 'item_discount-'. 0]);
        $this->seeElement('button', ['id' => 'remove-item-'. 0]);
        $this->see(format_rp(3800));
    }

    /** @test */
    public function user_can_add_item_to_credit_draft()
    {
        $product1 = factory(Product::class)->create(['name' => 'Testing Produk 1', 'cash_price' => 400, 'credit_price' => 500]);
        $product2 = factory(Product::class)->create(['name' => 'Testing Produk 2', 'cash_price' => 1000, 'credit_price' => 1100]);
        $this->loginAsUser();

        $cart = new CartCollection();
        $draft = new CreditDraft();
        $cart->add($draft);

        // Visit cart index with searched item
        $this->visit(route('cart.show', [$draft->draftKey, 'query' => 'testing']));

        $this->type(2, 'qty');
        $this->press('add-product-'.$product1->id);
        $this->type(3, 'qty');
        $this->press('add-product-'.$product2->id);

        $this->seePageIs(route('cart.show', [$draft->draftKey, 'query' => 'testing']));
        $this->assertTrue($cart->draftHasItem($draft, $product1));
        $this->assertTrue($cart->draftHasItem($draft, $product2));
        $this->assertEquals(4300, $draft->getTotal());
    }

    /** @test */
    public function user_can_update_item_qty()
    {
        $cart = new CartCollection();

        $draft = $cart->add(new CashDraft());

        $product1 = factory(Product::class)->create(['cash_price' => 1000]);
        $product2 = factory(Product::class)->create(['cash_price' => 2000]);
        $item1 = new Item($product1, 1);
        $item2 = new Item($product2, 3);

        // Add items to draft
        $cart->addItemToDraft($draft->draftKey, $item1);
        $cart->addItemToDraft($draft->draftKey, $item2);

        $this->loginAsUser();
        $this->visit(route('cart.show', $draft->draftKey));

        $this->submitForm('update-item-0', [
            'item_key'      => 0,
            'qty'           => 2,
            'item_discount' => 100,
        ]);

        $this->submitForm('update-item-1', [
            'item_key'      => 1,
            'qty'           => 2,
            'item_discount' => 100,
        ]);

        $this->assertEquals(400, $draft->getDiscountTotal());
        $this->assertEquals(6000, $draft->getSubtotal());
        $this->assertEquals(5600, $draft->getTotal());

        $this->see(format_rp($draft->getSubtotal()));
        $this->see(format_rp($draft->getTotal()));
    }

    /** @test */
    public function user_can_update_draft_transaction_detail_and_get_confirm_page()
    {
        $cart = new CartCollection();

        $draft = $cart->add(new CashDraft());

        $product1 = factory(Product::class)->create(['cash_price' => 1000]);
        $product2 = factory(Product::class)->create(['cash_price' => 2000]);
        $item1 = new Item($product1, 1);
        $item2 = new Item($product2, 3);

        // Add items to draft
        $cart->addItemToDraft($draft->draftKey, $item1);
        $cart->addItemToDraft($draft->draftKey, $item2);

        $this->loginAsUser();
        $this->visit(route('cart.show', $draft->draftKey));

        $this->type('Nafies', 'customer[name]');
        $this->type('-', 'customer[phone]');
        $this->type('catatan', 'notes');
        $this->type(10000, 'payment');
        $this->press(trans('transaction.proccess'));

        $this->seePageIs(route('cart.show', [$draft->draftKey, 'action' => 'confirm']));

        $this->see(trans('transaction.confirm'));
        $this->see($draft->customer['name']);
        $this->see($draft->customer['phone']);
        $this->see($draft->notes);
        $this->see(format_rp(10000));
        $this->see(format_rp(3000));
        $this->seeElement('input', ['id' => 'save-transaction-draft']);
    }

    /** @test */
    public function it_validates_proper_payment_amount()
    {
        $cart = new CartCollection();

        $draft = $cart->add(new CashDraft());

        $product1 = factory(Product::class)->create(['cash_price' => 100000]);
        $product2 = factory(Product::class)->create(['cash_price' => 50000]);
        $item1 = new Item($product1, 1);
        $item2 = new Item($product2, 3);

        // Add items to draft
        $cart->addItemToDraft($draft->draftKey, $item1);
        $cart->addItemToDraft($draft->draftKey, $item2);

        $this->loginAsUser();
        $this->visit(route('cart.show', $draft->draftKey));

        $this->type('Nafies', 'customer[name]');
        $this->type('-', 'customer[phone]');
        $this->type('catatan', 'notes');

        $this->type(100000, 'payment');
        $this->press(trans('transaction.proccess'));
        $this->dontSee(trans('transaction.confirm'));

        $this->type(350001, 'payment');
        $this->press(trans('transaction.proccess'));
        $this->dontSee(trans('transaction.confirm'));

        $this->type(350000, 'payment');
        $this->press(trans('transaction.proccess'));
        $this->see(trans('transaction.confirm'));
    }

    /** @test */
    public function user_can_save_transaction_if_draft_is_completed()
    {
        $cart = new CartCollection();

        $draft = $cart->add(new CashDraft());

        $product1 = factory(Product::class)->create(['cash_price' => 1000]);
        $product2 = factory(Product::class)->create(['cash_price' => 2000]);
        $item1 = new Item($product1, 1);
        $item2 = new Item($product2, 3);

        // Add items to draft
        $cart->addItemToDraft($draft->draftKey, $item1);
        $cart->addItemToDraft($draft->draftKey, $item2);

        $draftAttributes = [
            'customer' => [
                'name'  => 'Nafies',
                'phone' => '081234567890',
            ],
            'payment'  => 10000,
            'notes'    => 'Catatan',
        ];
        $cart->updateDraftAttributes($draft->draftKey, $draftAttributes);

        $user = $this->loginAsUser();
        $this->visit(route('cart.show', [$draft->draftKey, 'action' => 'confirm']));

        $this->press(trans('transaction.save'));

        $this->seePageIs(route('transactions.show', date('ym').'0001'));
        // $this->see(trans('transaction.created', ['invoice_no' => date('ym').'0001']));

        $this->seeInDatabase('transactions', [
            'invoice_no' => date('ym').'0001',
            'items'      => '[{"id":'.$product1->id.',"name":"'.$product1->name.'","unit":"'.$product1->unit->name.'","price":1000,"qty":1,"item_discount":0,"item_discount_subtotal":0,"subtotal":1000},{"id":'.$product2->id.',"name":"'.$product2->name.'","unit":"'.$product2->unit->name.'","price":2000,"qty":3,"item_discount":0,"item_discount_subtotal":0,"subtotal":6000}]',
            'customer'   => '{"name":"Nafies","phone":"081234567890"}',
            'payment'    => 10000,
            'total'      => 7000,
            'notes'      => 'Catatan',
            'user_id'    => $user->id,
        ]);
    }
}

AnonSec - 2021