diff --git a/rest/tests/Attachment/AttachmentCreateTest.php b/rest/tests/Attachment/AttachmentCreateTest.php new file mode 100644 index 00000000..7da7c978 --- /dev/null +++ b/rest/tests/Attachment/AttachmentCreateTest.php @@ -0,0 +1,142 @@ +create([ + 'wallet' => $wallet, + ]); + + // generate fake image + Storage::fake('attachments'); + + $attachments[] = UploadedFile::fake()->image('attachment.jpg'); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // update contract with attachment + $response = $this->put("api/v1/contracts/{$id}", [ + 'attachments' => $attachments, + 'kpi' => 'test', + ], [ + 'wallet' => $wallet, + ]); + + // validate status + $this->seeStatusCode(200); + + // check attachment available in database + $this->seeInDatabase('media', [ + 'model_type' => \App\Models\Contract::class, + ]); + } + + /** + * @test + * + * @return void + */ + public function should_upload_a_file_with_an_existing_dispute_of_a_contract() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7'; + + // create user + $user = factory(App\Models\User::class)->create([ + 'wallet' => $wallet, + ]); + + // create fake image + Storage::fake('attachments'); + + $attachments[] = UploadedFile::fake()->image('attachment.jpg'); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // create a dispute + $dispute = $this->post("api/v1/contracts/disputes/{$id}", [ + 'attachments' => $attachments, + 'code' => 35, + ], [ + 'wallet' => $wallet, + ]); + + // validate status + $this->seeStatusCode(200); + + // check attachment available in database + $this->seeInDatabase('media', [ + 'model_type' => \App\Models\ContractStatusDetail::class, + ]); + } + + /** + * @test + * + * @return void + */ + public function should_upload_a_file_with_activity_of_a_contract() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A6'; + + // create user + $user = factory(App\Models\User::class)->create([ + 'wallet' => $wallet, + ]); + + // create fake image + Storage::fake('attachments'); + + $attachments[] = UploadedFile::fake()->image('attachment.jpg'); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // create an activity with attachment + $dispute = $this->post("api/v1/activities/{$id}", [ + 'attachments' => $attachments, + 'code' => 35, + ], [ + 'wallet' => $wallet, + ]); + + // validate status + $this->seeStatusCode(200); + + // check attachment available in database + $this->seeInDatabase('media', [ + 'model_type' => \App\Models\Activity::class, + ]); + } +} diff --git a/rest/tests/contract/ContactCreateTest.php b/rest/tests/contract/ContactCreateTest.php new file mode 100644 index 00000000..bec76249 --- /dev/null +++ b/rest/tests/contract/ContactCreateTest.php @@ -0,0 +1,348 @@ +post("api/v1/contracts", + [ + 'part_a_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_b_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1', + ], + ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A6']// non existing wallet + ); + + // validate status + $this->seeStatusCode(422); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'user_id' => ['The User Id is not valid'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_create_contract_without_wallet() + { + $this->post("api/v1/contracts", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_create_contract_without_part_a_and_b_wallets() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A4']; + + $this->post("api/v1/contracts", [], $header); + + // validate status + $this->seeStatusCode(422); + + // validate stucture of data + $this->seeJsonStructure( + [ + "message", + "errors" => [ + "part_a_wallet", + "part_b_wallet", + ], + "status_code", + ] + ); + + // validate data + $this->seeJson( + [ + "message" => "The given data was invalid.", + "errors" => [ + "part_a_wallet" => [ + "The part a wallet field is required.", + ], + "part_b_wallet" => [ + "The part b wallet field is required.", + ], + ], + "status_code" => 422, + ] + ); + + // validate data not present in database + $this->notSeeInDatabase('contracts', $header); + } + + /** + * @test + * + * @return void + */ + public function should_create_contract_only_with_party_a_and_b_wallets() + { + + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7']; + + $this->post("api/v1/contracts", + [ + 'part_a_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_b_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1', + ], + $header + ); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'data' => + [ + "id", + "statusId", + "statusLabel", + "statusUpdatedAt", + "statusFrom", + "statusPart", + "contractName", + "duration" => [ + "days", + "hours", + "minutes", + ], + "expireAlertFrom", + "counterparties" => [ + [ + "wallet", + "name", + "email", + "renderName", + ], + [ + "wallet", + "name", + "email", + "renderName", + ], + ], + "value", + "whoPays", + "address", + "kpi", + "resolutionProof", + "category", + "inCaseOfDispute", + "hasPenaltyFee", + "partAPenaltyFee", + "partBPenaltyFee", + "isDispute", + "isFriendlyResolution", + ], + ] + ); + + // validate data present in database + $this->seeInDatabase('contracts', $header); + } + + /** + * @test + * + * @return void + */ + public function should_not_create_contract_with_invalid_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + $this->post("api/v1/contracts", + [ + 'accepted_terms' => 1, + 'accepted_disclaimer' => 1, + ], + $header + ); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_create_contract_with_valid_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AA']; + + $data = [ + 'part_a_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_b_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1', + 'part_a_name' => 'Alice', + 'part_a_email' => 'alice_in_wonderland@gmail.com', + 'part_b_name' => 'Bob', + 'part_b_email' => 'bob_in_thailand@gmail.com', + 'kpi' => 'freelance aggreement', + 'category' => 'General', + 'who_pays' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'value' => 100, + 'has_penalty_fee' => 0, + ]; + + $this->post("api/v1/contracts", $data, $header); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'data' => + [ + "id", + "statusId", + "statusLabel", + "statusUpdatedAt", + "statusFrom", + "statusPart", + "contractName", + "duration" => [ + "days", + "hours", + "minutes", + ], + "expireAlertFrom", + "counterparties" => [ + [ + "wallet", + "name", + "email", + "renderName", + ], + [ + "wallet", + "name", + "email", + "renderName", + ], + ], + "value", + "whoPays", + "address", + "kpi", + "resolutionProof", + "category", + "inCaseOfDispute", + "hasPenaltyFee", + "partAPenaltyFee", + "partBPenaltyFee", + "isDispute", + "isFriendlyResolution", + ], + ] + ); + + // validate data present in database + $this->seeInDatabase('contracts', array_merge($data, $header)); + } + + /** + * @test + * + * @return void + */ + public function should_not_create_contract_with_invalid_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1']; + + $data = [ + 'part_a_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc96', // invalid address + 'part_b_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1', + 'part_a_email' => 'alice_in_wonderland', // invalid email + 'value' => 'nil', // not a number + 'has_penalty_fee' => 'nil', // not boolean + ]; + + $this->post("api/v1/contracts", $data, $header); + + // validate status + $this->seeStatusCode(422); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'errors' => + [ + 'part_a_wallet', + 'part_a_email', + 'value', + 'has_penalty_fee', + ], + ] + ); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'part_a_wallet' => ['The Part A Wallet is not valid'], + 'part_a_email' => ['The Part A Email is not valid'], + 'value' => ['The Value must be a number'], + 'has_penalty_fee' => ['The Has Penalty Fee nust be boolean'], + ], + ] + ); + + // validate data not present in database + $this->notSeeInDatabase('contracts', $header); + } +} diff --git a/rest/tests/contract/ContractDeleteTest.php b/rest/tests/contract/ContractDeleteTest.php new file mode 100644 index 00000000..8eaf804e --- /dev/null +++ b/rest/tests/contract/ContractDeleteTest.php @@ -0,0 +1,236 @@ +create(); + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // try to delete + $this->delete("api/v1/contracts/{$id}", []); + + // validate status + $this->seeStatusCode(401); + + $this->seeInDatabase('contracts', [ + 'id' => $contract->id, + ]); + } + + /** + * @test + * + * @return void + */ + public function should_delete_contract_using_wallet_and_contract_id() + { + $user = factory(App\Models\User::class)->create(); + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + // try to delete + $this->delete("api/v1/contracts/{$id}", [], ['wallet' => $user->wallet]); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure(['id']); + + // validate data + $this->seeJson( + [ + 'id' => $id, + ] + ); + + // validate data present in database + $this->notSeeInDatabase('contracts', ['id' => $contract->id]); + } + + /** + * @test + * + * @return void + */ + public function should_not_delete_contract_with_invalid_wallet() + { + $user = factory(App\Models\User::class)->create(); + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + // try to delete + $this->delete("api/v1/contracts/{$id}", [], ['wallet' => $user->wallet]); + + // validate status + $this->seeStatusCode(422); + + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + $this->delete("api/v1/contracts", [], $header); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_delete_contract_with_non_existing_wallet() + { + $user = factory(App\Models\User::class)->create(); + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A5']; // non-existing wallet address + + // try to delete + $this->delete("api/v1/contracts/{$id}", [], $header); + + $this->seeStatusCode(404); + } + + /** + * @test + * + * @return void + */ + public function should_not_delete_contract_with_non_existing_id() + { + $user = factory(App\Models\User::class)->create(); + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + $id = "EX3eR4"; // non existing id + + // try to delete + $this->delete("api/v1/contracts/{$id}", [], ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7']); + + // should not delete item + $this->seeStatusCode(422); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'id' => ['The Id is not valid.'], + ], + ] + ); + + $id = "123456"; // non existing id with invalid format + + // try to delete + $this->delete("api/v1/contracts/{$id}", [], ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7']); + + // should not delete item + $this->seeStatusCode(422); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'id' => ['The Id is not in valid format.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_delete_all_contracts_related_to_wallet() + { + $user = factory(App\Models\User::class)->create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // try to delete + $this->delete("api/v1/contracts/delete-all", [], ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7']); + + // should not delete item + $this->seeStatusCode(200); + + // validate data present in database + $this->notSeeInDatabase('contracts', ['id' => $contract->id]); + } +} diff --git a/rest/tests/contract/ContractReadAllTest.php b/rest/tests/contract/ContractReadAllTest.php new file mode 100644 index 00000000..48ebcb50 --- /dev/null +++ b/rest/tests/contract/ContractReadAllTest.php @@ -0,0 +1,173 @@ +get("api/v1/contracts", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate response + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_contract_with_invalid_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + $this->get("api/v1/contracts", $header); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_contract_with_non_existing_wallet() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A5'; // non-existing wallet address + + $this->get("api/v1/contracts", [], ['wallet' => $wallet]) + ->seeStatusCode(401); + } + + /** + * @test + * + * @return void + */ + public function should_read_contract_with_blank_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AA']; + + // get contracts + $this->get("api/v1/contracts", $header); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'data', + 'meta' => + [ + "pagination" => [ + "total", + "count", + "per_page", + "current_page", + "total_pages", + "links", + ], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_read_contract_with_data() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7'; + + // create contract + $this->post("api/v1/contracts", + [ + 'wallet' => $wallet, + 'part_a_wallet' => $wallet, + 'part_b_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1', + ], + ['wallet' => $wallet] + ); + + // validate status + $this->seeStatusCode(200); + + // get contract + $this->get("api/v1/contracts", ['wallet' => $wallet]); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'data' => + [ + [ + "id", + ], + ], + 'meta' => + [ + "pagination" => [ + "total", + "count", + "per_page", + "current_page", + "total_pages", + "links", + ], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_read_contract_with_filter_by_dates() + { + $from = '2019-02-10'; + $to = '2019-03-20'; + + $this->get("api/v1/contracts?from={$from}&to={$to}", [ + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1', + ])->seeStatusCode(200); + } +} diff --git a/rest/tests/contract/ContractReadTest.php b/rest/tests/contract/ContractReadTest.php new file mode 100644 index 00000000..d5173b92 --- /dev/null +++ b/rest/tests/contract/ContractReadTest.php @@ -0,0 +1,152 @@ +create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + $this->get("api/v1/contracts/{$id}", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate response + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_single_contract_with_invalid_wallet() + { + $user = factory(App\Models\User::class)->create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + $this->get("api/v1/contracts/{$id}", $header); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_single_contract_with_non_existing_wallet() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A5'; // non-existing wallet address + + $user = factory(App\Models\User::class)->create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + // try to get details with invalid wallet + $this->get("api/v1/contracts/{$id}", [], ['wallet' => $wallet]) + ->seeStatusCode(401); + } + + /** + * @test + * + * @return void + */ + public function should_read_single_contract_with_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AA']; + + $user = factory(App\Models\User::class)->create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + // get contracts + $this->get("api/v1/contracts/{$id}", $header); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'data', + ] + ); + } +} diff --git a/rest/tests/contract/ContractUpdateTest.php b/rest/tests/contract/ContractUpdateTest.php new file mode 100644 index 00000000..9305a2da --- /dev/null +++ b/rest/tests/contract/ContractUpdateTest.php @@ -0,0 +1,324 @@ +create(); + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + $this->put("api/v1/contracts/{$id}", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_update_contract_with_invalid_id() + { + $user = factory(App\Models\User::class)->create(); + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // wrong id + $id = "123456"; // wrong format + + $this->put("api/v1/contracts/{$id}", [], ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7']); + + // validate status + $this->seeStatusCode(422); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'id' => ['The Id is in invalid format.'], + ], + ] + ); + + // wrong id + $id = "lX8Zw4"; // non existing id + + $this->put("api/v1/contracts/{$id}", [], ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7']); + + // validate status + $this->seeStatusCode(422); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'id' => ['The Id is invalid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_update_contract_with_invalid_wallet() + { + $header1 = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + $header2 = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A6']; // non existing wallet + + $user = factory(App\Models\User::class)->create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + $this->put("api/v1/contracts/{$id}", $header1); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + + $this->put("api/v1/contracts/{$id}", $header2); + + // validate status + $this->seeStatusCode(404); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet not exists.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_update_contract_with_valid_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AA']; + + $data = [ + 'part_a_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_b_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1', + 'part_a_name' => 'Alice', + 'part_a_email' => 'alice_in_wonderland@gmail.com', + 'part_b_name' => 'Bob', + 'part_b_email' => 'bob_in_thailand@gmail.com', + 'kpi' => 'freelance aggreement', + 'category' => 'General', + 'who_pays' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'value' => 100, + 'has_penalty_fee' => 0, + ]; + + // create contract + $user = factory(App\Models\User::class)->create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + // update contract with data + $this->put("api/v1/contracts/{$id}", $data, $header); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'data' => + [ + "id", + "statusId", + "statusLabel", + "statusUpdatedAt", + "statusFrom", + "statusPart", + "contractName", + "duration" => [ + "days", + "hours", + "minutes", + ], + "expireAlertFrom", + "counterparties" => [ + [ + "wallet", + "name", + "email", + "renderName", + ], + [ + "wallet", + "name", + "email", + "renderName", + ], + ], + "value", + "whoPays", + "address", + "kpi", + "resolutionProof", + "category", + "inCaseOfDispute", + "hasPenaltyFee", + "partAPenaltyFee", + "partBPenaltyFee", + "isDispute", + "isFriendlyResolution", + ], + ] + ); + + // validate data present in database + $this->seeInDatabase('contracts', array_merge($data, $header)); + } + + /** + * @test + * + * @return void + */ + public function should_not_update_contract_with_invalid_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1']; + + $data = [ + 'part_a_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc96', // invalid address + 'part_b_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1', + 'part_a_email' => 'alice_in_wonderland', // invalid email + 'value' => 'nil', // not a number + 'has_penalty_fee' => 'nil', // not boolean + ]; + + // create contract + $user = factory(App\Models\User::class)->create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + // update contract with data + $this->put("api/v1/contracts/{$id}", $data, $header); + + // validate status + $this->seeStatusCode(422); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'errors' => + [ + 'part_a_wallet', + 'part_a_email', + 'value', + 'has_penalty_fee', + ], + ] + ); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'part_a_wallet' => ['The Part A Wallet is not valid'], + 'part_a_email' => ['The Part A Email is not valid'], + 'value' => ['The Value must be a number'], + 'has_penalty_fee' => ['The Has Penalty Fee nust be boolean'], + ], + ] + ); + } +} diff --git a/rest/tests/contract/dispute/DisputeCreateTest.php b/rest/tests/contract/dispute/DisputeCreateTest.php new file mode 100644 index 00000000..801039ca --- /dev/null +++ b/rest/tests/contract/dispute/DisputeCreateTest.php @@ -0,0 +1,77 @@ +create([ + 'wallet' => $wallet, + ]); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + $this->post("api/v1/contracts/disputes/{$id}", [], []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_create_dipute_only_with_code_and_wallet() + { + + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7']; + + // create user + $user = factory(App\Models\User::class)->create($header); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + $this->post("api/v1/contracts/disputes/{$id}", ['code' => 35], $header); + + // validate status + $this->seeStatusCode(200); + + } +} diff --git a/rest/tests/contract/dispute/DisputeReadAllTest.php b/rest/tests/contract/dispute/DisputeReadAllTest.php new file mode 100644 index 00000000..ea698ee4 --- /dev/null +++ b/rest/tests/contract/dispute/DisputeReadAllTest.php @@ -0,0 +1,121 @@ +get("api/v1/contracts/disputes/all", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate response + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_dispute_with_invalid_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + $this->get("api/v1/contracts/disputes/all", $header); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_dispute_with_non_existing_wallet() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A5'; // non-existing wallet address + + $this->get("api/v1/contracts/disputes/all", [], ['wallet' => $wallet]) + ->seeStatusCode(401); + } + + /** + * @test + * + * @return void + */ + public function should_read_dispute_with_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AA']; + + // get disputes + $this->get("api/v1/contracts/disputes/all", $header); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'data', + 'meta' => + [ + "pagination" => [ + "total", + "count", + "per_page", + "current_page", + "total_pages", + "links", + ], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_read_dispute_with_filter_by_dates() + { + $from = '2019-02-10'; + $to = '2019-03-20'; + + $this->get("api/v1/contracts/disputes/all?from={$from}&to={$to}", [ + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1', + ])->seeStatusCode(200); + } +} diff --git a/rest/tests/contract/dispute/DisputeReadTest.php b/rest/tests/contract/dispute/DisputeReadTest.php new file mode 100644 index 00000000..4967a118 --- /dev/null +++ b/rest/tests/contract/dispute/DisputeReadTest.php @@ -0,0 +1,155 @@ +create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => $wallet, + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + // create an activity with attachment + $dispute = $this->get("api/v1/contracts/disputes/{$id}", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate response + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_single_dispute_with_invalid_wallet() + { + $user = factory(App\Models\User::class)->create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + // create an activity with attachment + $dispute = $this->get("api/v1/contracts/disputes/{$id}", []); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_single_dispute_with_non_existing_wallet() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A5'; // non-existing wallet address + + $user = factory(App\Models\User::class)->create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + // try to get details with invalid wallet + $this->get("api/v1/contracts/disputes/{$id}", [], ['wallet' => $wallet]) + ->seeStatusCode(401); + } + + /** + * @test + * + * @return void + */ + public function should_read_single_dispute_with_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AA']; + + $user = factory(App\Models\User::class)->create(); + + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + 'wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'part_a_wallet' => $user->wallet, + ]); + + // validate data present in database + $this->seeInDatabase('contracts', ['id' => $contract->id]); + + // get encoded id + $id = encodeId($contract->id); + + // create dispute + $this->post("api/v1/contracts/disputes/{$id}", ['code' => 35], $header); + + // validate status + $this->seeStatusCode(200); + + // get dispute + $this->get("api/v1/contracts/disputes/{$id}", $header); + + // validate status + $this->seeStatusCode(200); + } +} diff --git a/rest/tests/user/UserCreateTest.php b/rest/tests/user/UserCreateTest.php new file mode 100644 index 00000000..06b00b59 --- /dev/null +++ b/rest/tests/user/UserCreateTest.php @@ -0,0 +1,318 @@ +post("api/v1/user", ['accepted_disclaimer' => 1, 'accepted_terms' => 1]); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_create_user_without_accepting_disclaimer_and_terms() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A4']; + + $this->post("api/v1/user", [], $header); + + // validate status + $this->seeStatusCode(422); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'errors' => + [ + 'accepted_terms', + 'accepted_disclaimer', + ], + ] + ); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'accepted_terms' => ['The accepted terms must be accepted.'], + 'accepted_disclaimer' => ['The accepted disclaimer must be accepted.'], + ], + ] + ); + + // validate data not present in database + $this->notSeeInDatabase('users', $header); + } + + /** + * @test + * + * @return void + */ + public function should_create_user_only_with_wallet() + { + + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7']; + + $this->post("api/v1/user", + [ + 'accepted_terms' => 1, + 'accepted_disclaimer' => 1, + ], + $header + ); + + // validate status + $this->seeStatusCode(201); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'user' => + [ + 'id', + 'wallet', + 'accepted_terms', + 'accepted_disclaimer', + 'updated_at', + 'created_at', + ], + ] + ); + + // validate data present in database + $this->seeInDatabase('users', $header); + } + + /** + * @test + * + * @return void + */ + public function should_not_create_user_with_invalid_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + $this->post("api/v1/user", + [ + 'accepted_terms' => 1, + 'accepted_disclaimer' => 1, + ], + $header + ); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_create_user_with_same_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A8']; + + $this->post("api/v1/user", + [ + 'accepted_terms' => 1, + 'accepted_disclaimer' => 1, + ], + $header + ) + ->seeStatusCode(201); + + $this->post("api/v1/user", + [ + 'accepted_terms' => 1, + 'accepted_disclaimer' => 1, + ], + $header + ) + ->seeStatusCode(422); + } + + /** + * @test + * + * @return void + */ + public function should_create_user_with_valid_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AA']; + + $data = [ + 'name' => 'Alice', + 'email' => 'alice007@gmail.com', + 'gender' => 'female', + 'location' => 'New York', + 'birth_date' => '1989-10-08', + 'category' => 'General', + 'show_fullname' => 1, + 'accepted_terms' => 1, + 'accepted_disclaimer' => 1, + ]; + + $this->post("api/v1/user", $data, $header); + + // validate status + $this->seeStatusCode(201); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'user' => + [ + 'id', + 'wallet', + 'name', + 'email', + 'gender', + 'location', + 'birth_date', + 'category', + 'show_fullname', + 'accepted_terms', + 'accepted_disclaimer', + 'updated_at', + 'created_at', + ], + ] + ); + + // validate data present in database + $this->seeInDatabase('users', array_merge($data, $header)); + } + + /** + * @test + * + * @return void + */ + public function should_not_create_user_with_invalid_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1']; + + $data = [ + 'name' => 'Bob', + 'email' => 'bob', // invalid email + 'gender' => 'feale', // invalid gender (accept only male,femail and other) + 'location' => 'New York', + 'birth_date' => '1989-30-08', // invalid date + 'category' => 'General', + 'show_fullname' => 'yes', // invalid data type + 'accepted_terms' => 'no', // invalid data type + 'accepted_disclaimer' => 'no', // invalid data type + ]; + + $this->post("api/v1/user", $data, $header); + + // validate status + $this->seeStatusCode(422); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'errors' => + [ + 'email', + 'gender', + 'birth_date', + 'show_fullname', + 'accepted_terms', + 'accepted_disclaimer', + ], + ] + ); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'email' => ['Email is not valid'], + 'gender' => ['Gender is not valid'], + 'birth_date' => ['Birth Date is an invalid date'], + 'show_fullname' => ['Show Fullname is not valid'], + 'accepted_terms' => ['The accepted terms must be accepted.', 'Accepted Terms is not valid'], + 'accepted_disclaimer' => ['The accepted disclaimer must be accepted.', 'Accepted Disclaimer is not valid'], + ], + ] + ); + + // validate data not present in database + $this->notSeeInDatabase('users', $header); + } + + /** + * @test + * + * @return void + */ + public function should_not_create_user_without_unique_name() + { + // TODO: the name should replaced as username in database + + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A2']; + + $this->post("api/v1/user", + [ + 'name' => 'John Nash', + 'accepted_terms' => 1, + 'accepted_disclaimer' => 1, + ], + $header + ) + ->seeStatusCode(201); + + // check user name is unique + $this->post("api/v1/user", + [ + 'name' => 'John Nash', + 'accepted_terms' => 1, + 'accepted_disclaimer' => 1, + ], + $header + ) + ->seeStatusCode(422); + } +} diff --git a/rest/tests/user/UserDeleteTest.php b/rest/tests/user/UserDeleteTest.php new file mode 100644 index 00000000..64133b4b --- /dev/null +++ b/rest/tests/user/UserDeleteTest.php @@ -0,0 +1,238 @@ +delete("api/v1/user", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_delete_user_name_using_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7']; + + // create user + $this->post("api/v1/user", ['accepted_disclaimer' => 1, 'accepted_terms' => 1], $header); + + // validate status of create + $this->seeStatusCode(201); + + // validate data present in database + $this->seeInDatabase('users', $header); + + // update existing user's name + $this->delete("api/v1/user", [], $header); + + // validate status of update + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'status', + ] + ); + + // validate data + $this->seeJson( + [ + 'status' => 'deleted', + ] + ); + + // validate data not present in database + $this->notseeInDatabase('users', $header); + } + + /** + * @test + * + * @return void + */ + public function should_not_delete_user_with_invalid_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + $this->delete("api/v1/user", [], $header); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_delete_user_with_non_existing_wallet() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A5'; // non-existing wallet address + + $this->delete("api/v1/user", [], ['wallet' => $wallet]) + ->seeStatusCode(404); + } + + /** + * @test + * + * @return void + */ + public function should_delete_user_with_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AA']; + + $data = [ + 'name' => 'Alice', + 'email' => 'alice007@gmail.com', + 'gender' => 'female', + 'location' => 'New York', + 'birth_date' => '1989-10-08', + 'category' => 'General', + 'show_fullname' => 1, + 'accepted_disclaimer' => 1, + 'accepted_terms' => 1, + ]; + + // create user + $this->post("api/v1/user", $data, $header); + + // validate status + $this->seeStatusCode(201); + + // validate data present in database + $this->seeInDatabase('users', array_merge($data, $header)); + + // update user with data + $this->delete("api/v1/user", $data, $header); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure(['status']); + + // validate data + $this->seeJson(['status' => 'deleted']); + + // validate data present in database + $this->notSeeInDatabase('users', array_merge($data, $header)); + } + + /** + * @test + * + * @return void + */ + public function should_not_delete_user_using_name() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1']; + + $data = [ + 'name' => 'Bob', + 'accepted_disclaimer' => 1, + 'accepted_terms' => 1, + ]; + + // create user + $this->post("api/v1/user", $data, $header); + + // validate status + $this->seeStatusCode(201); + + // validate data present in database + $this->seeInDatabase('users', array_merge($data, $header)); + + // delete user using unique name + $this->delete("api/v1/user", [], $data); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + + // validate data still present in database + $this->seeInDatabase('users', array_merge($data, $header)); + } + + /** + * @test + * + * @return void + */ + public function should_delete_user_and_create_with_same_name() + { + + $header1 = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A2']; + $header2 = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A3']; + + // create user1 + $this->post("api/v1/user", ['name' => 'Ashly', 'accepted_disclaimer' => 1, 'accepted_terms' => 1], $header1) + ->seeStatusCode(201); + + // delete user1 + $this->delete("api/v1/user", [], $header1) + ->seeStatusCode(200); + + // validate data deleted from database + $this->notSeeInDatabase('users', $header1); + + // create user2 + $this->post("api/v1/user", ['name' => 'Ashly', 'accepted_disclaimer' => 1, 'accepted_terms' => 1], $header2) + ->seeStatusCode(201); + + // validate data present in database + $this->seeInDatabase('users', array_merge(['name' => 'Ashly', 'accepted_disclaimer' => 1, 'accepted_terms' => 1], $header2)); + + } +} diff --git a/rest/tests/user/UserReadTest.php b/rest/tests/user/UserReadTest.php new file mode 100644 index 00000000..443f27ef --- /dev/null +++ b/rest/tests/user/UserReadTest.php @@ -0,0 +1,218 @@ +get("api/v1/user", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate response + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_user_with_invalid_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + $this->get("api/v1/user", $header); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_user_with_non_existing_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A6']; + $data = ['name' => 'John Nash']; + + // create user + $this->post("api/v1/user", ['accepted_disclaimer' => 1, 'accepted_terms' => 1], $header)->seeStatusCode(201); + + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A5'; // non-existing wallet address + + $this->get("api/v1/user", [], ['wallet' => $wallet]) + ->seeStatusCode(404); + } + + /** + * @test + * + * @return void + */ + public function should_read_user_with_all_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AA']; + + $data = [ + 'name' => 'Alice', + 'email' => 'alice007@gmail.com', + 'gender' => 'female', + 'location' => 'New York', + 'birth_date' => '1989-10-08', + 'category' => 'General', + 'show_fullname' => 1, + 'accepted_disclaimer' => 1, + 'accepted_terms' => 1, + ]; + + // create user + $this->post("api/v1/user", $data, $header); + + // validate status + $this->seeStatusCode(201); + + // read user with data + $this->get("api/v1/user", $header); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'user' => + [ + 'id', + 'wallet', + 'name', + 'email', + 'gender', + 'location', + 'birth_date', + 'category', + 'show_fullname', + 'accepted_terms', + 'accepted_disclaimer', + 'updated_at', + 'created_at', + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_user_registration_status_without_wallet() + { + // check user registration status + $this->get("api/v1/user/checking", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_read_user_registration_status_with_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AE']; + + // check user registration status + $this->get("api/v1/user/checking", $header); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure(['status', 'user']); + + // validate data + $this->seeJson( + [ + 'status' => 'false', + 'user' => [], + ] + ); + + // create the user + $this->post("api/v1/user", ['accepted_disclaimer' => 1, 'accepted_terms' => 1], $header); + + // validate status + $this->seeStatusCode(201); + + // check user registration status + $this->get("api/v1/user/checking", $header); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure(['status', 'user']); + + // validate data + $this->seeJson( + [ + 'status' => 'true', + 'user' => [ + 'id', + 'wallet', + 'accepted_terms', + 'accepted_disclaimer', + 'updated_at', + 'created_at', + ], + ] + ); + } +} diff --git a/rest/tests/user/UserUpdateTest.php b/rest/tests/user/UserUpdateTest.php new file mode 100644 index 00000000..178e6240 --- /dev/null +++ b/rest/tests/user/UserUpdateTest.php @@ -0,0 +1,267 @@ +put("api/v1/user", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_update_user_name_using_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7']; + $data = ['name' => 'John Nash']; + + // create user + $this->post("api/v1/user", ['accepted_disclaimer' => 1, 'accepted_terms' => 1], $header); + + // validate status of create + $this->seeStatusCode(201); + + // update existing user's name + $this->put("api/v1/user", $data, $header); + + // validate status of update + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'user' => + [ + 'id', + 'name', + 'wallet', + 'updated_at', + 'created_at', + ], + ] + ); + + // validate data present in database + $this->seeInDatabase('users', array_merge($data, $header)); + } + + /** + * @test + * + * @return void + */ + public function should_not_update_user_with_invalid_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']; // invalid wallet address (missing last charecter) + + $this->put("api/v1/user", [], $header); + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_update_user_with_non_existing_wallet() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A6']; + $data = ['name' => 'John Nash']; + + // create user + $this->post("api/v1/user", ['accepted_disclaimer' => 1, 'accepted_terms' => 1], $header)->seeStatusCode(201); + + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A5'; // non-existing wallet address + + $this->put("api/v1/user", [], ['wallet' => $wallet]) + ->seeStatusCode(404); + } + + /** + * @test + * + * @return void + */ + public function should_update_user_with_valid_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616AA']; + + $data = [ + 'name' => 'Alice', + 'email' => 'alice007@gmail.com', + 'gender' => 'female', + 'location' => 'New York', + 'birth_date' => '1989-10-08', + 'category' => 'General', + 'show_fullname' => 1, + ]; + + // create user + $this->post("api/v1/user", ['accepted_disclaimer' => 1, 'accepted_terms' => 1], $header); + + // validate status + $this->seeStatusCode(201); + + // update user with data + $this->put("api/v1/user", $data, $header); + + // validate status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'user' => + [ + 'id', + 'wallet', + 'name', + 'email', + 'gender', + 'location', + 'birth_date', + 'category', + 'show_fullname', + 'accepted_terms', + 'accepted_disclaimer', + 'updated_at', + 'created_at', + ], + ] + + ); + + // validate data present in database + $this->seeInDatabase('users', array_merge($data, $header)); + } + + /** + * @test + * + * @return void + */ + public function should_not_update_user_with_invalid_data() + { + $header = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A1']; + + $data = [ + 'name' => 'Bob', + 'email' => 'bob', // invalid email + 'gender' => 'feale', // invalid gender (accept only male,femail and other) + 'location' => 'New York', + 'birth_date' => '1989-30-08', // invalid date + 'category' => 'General', + 'show_fullname' => 'yes', // invalid data type + 'accepted_terms' => 'no', // invalid data type + 'accepted_disclaimer' => 'no', // invalid data type + ]; + + // create user + $this->post("api/v1/user", ['accepted_disclaimer' => 1, 'accepted_terms' => 1], $header); + + // validate status + $this->seeStatusCode(201); + + // update user with data + $this->put("api/v1/user", $data, $header); + + // validate status + $this->seeStatusCode(422); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'errors' => + [ + 'email', + 'gender', + 'birth_date', + 'show_fullname', + 'accepted_terms', + 'accepted_disclaimer', + ], + ] + ); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'email' => ['Email is not valid'], + 'gender' => ['Gender is not valid'], + 'birth_date' => ['Birth Date is an invalid date'], + 'show_fullname' => ['Show Fullname is not valid'], + 'accepted_terms' => ['Accepted Terms is not valid'], + 'accepted_disclaimer' => ['Accepted Disclaimer is not valid'], + ], + ] + ); + + // validate data not present in database + $this->notSeeInDatabase('users', $header); + } + + /** + * @test + * + * @return void + */ + public function should_not_update_user_without_unique_name() + { + + $header1 = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A2']; + $header2 = ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A3']; + + // create user1 + $this->post("api/v1/user", ['name' => 'Ashly', 'accepted_disclaimer' => 1, 'accepted_terms' => 1], $header1) + ->seeStatusCode(201); + + // create user2 + $this->post("api/v1/user", ['name' => 'Johny', 'accepted_disclaimer' => 1, 'accepted_terms' => 1], $header2) + ->seeStatusCode(201); + + // name should be unique for update + $this->put("api/v1/user", ['name' => 'Ashly'], $header2) + ->seeStatusCode(422); + } +} diff --git a/rest/tests/vote/VoteCreateTest.php b/rest/tests/vote/VoteCreateTest.php new file mode 100644 index 00000000..75247ec5 --- /dev/null +++ b/rest/tests/vote/VoteCreateTest.php @@ -0,0 +1,154 @@ +create([ + 'wallet' => $wallet, + ]); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // create dispute + $this->post("api/v1/contracts/disputes/{$id}", ['code' => 35], ['wallet' => $wallet]); + + // validate status + $this->seeStatusCode(200); + + $data = [ + 'contract_id' => $id, + 'amount' => 10, + 'oracle_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'wallet_part' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'message' => 'hello', + 'hash' => 123, + ]; + + // create vote + $this->post("api/v1/votes", $data, []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate data + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_create_vote_only_with_wallets() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7'; + + // create user + $user = factory(App\Models\User::class)->create([ + 'wallet' => $wallet, + ]); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // create dispute + $this->post("api/v1/contracts/disputes/{$id}", ['code' => 35], ['wallet' => $wallet]); + + // validate status + $this->seeStatusCode(200); + + $data = [ + 'contract_id' => $id, + 'amount' => 10, + 'oracle_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'wallet_part' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'message' => 'hello', + 'hash' => 123, + ]; + + // create vote + $this->post("api/v1/votes", [], ['wallet' => $wallet]); + + // validate status + $this->seeStatusCode(422); + } + + /** + * @test + * + * @return void + */ + public function should_create_contract_with_valid_data() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7'; + + // create user + $user = factory(App\Models\User::class)->create([ + 'wallet' => $wallet, + ]); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // create dispute + $this->post("api/v1/contracts/disputes/{$id}", ['code' => 35], ['wallet' => $wallet]); + + // validate status + $this->seeStatusCode(200); + + $data = [ + 'contract_id' => $id, + 'amount' => 10, + 'oracle_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'wallet_part' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'message' => 'hello', + 'hash' => 123, + ]; + + // create vote + $this->post("api/v1/votes", $data, ['wallet' => $wallet]); + + // validate status + $this->seeStatusCode(200); + } +} diff --git a/rest/tests/vote/VoteReadAllTest.php b/rest/tests/vote/VoteReadAllTest.php new file mode 100644 index 00000000..058fe17d --- /dev/null +++ b/rest/tests/vote/VoteReadAllTest.php @@ -0,0 +1,251 @@ +create([ + 'wallet' => $wallet, + ]); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // create dispute + $this->post("api/v1/contracts/disputes/{$id}", ['code' => 35], ['wallet' => $wallet]); + + // validate status + $this->seeStatusCode(200); + + $data = [ + 'contract_id' => $id, + 'amount' => 10, + 'oracle_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'wallet_part' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'message' => 'hello', + 'hash' => 123, + ]; + + // create vote + $this->post("api/v1/votes", $data, ['wallet' => $wallet]); + + // validate status + $this->seeStatusCode(200); + + // create vote + $this->get("api/v1/votes/{$id}", []); + + // validate status + $this->seeStatusCode(401); + + // validate stucture of data + $this->seeJsonStructure(['errors']); + + // validate response + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is missing.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_vote_with_invalid_wallet() + { + + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7'; + + // create user + $user = factory(App\Models\User::class)->create([ + 'wallet' => $wallet, + ]); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // create dispute + $this->post("api/v1/contracts/disputes/{$id}", ['code' => 35], ['wallet' => $wallet]); + + // validate status + $this->seeStatusCode(200); + + $data = [ + 'contract_id' => $id, + 'amount' => 10, + 'oracle_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'wallet_part' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'message' => 'hello', + 'hash' => 123, + ]; + + // create vote + $this->post("api/v1/votes", $data, ['wallet' => $wallet]); + + // validate status + $this->seeStatusCode(200); + + // create vote + $this->get("api/v1/votes/{$id}", ['wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A']); // invalid wallet address (missing last charecter) + + // validate status + $this->seeStatusCode(422); + + // validate error details + $this->seeJson( + [ + 'errors' => + [ + 'wallet' => ['The wallet is not valid.'], + ], + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_not_read_vote_with_non_existing_wallet() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7'; + + // create user + $user = factory(App\Models\User::class)->create([ + 'wallet' => $wallet, + ]); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + $nonwallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A5'; // non-existing wallet address + + // create vote + $this->get("api/v1/votes/{$id}", ['wallet' => $nonwallet]); + + // see the status + $this->seeStatusCode(401); + } + + /** + * @test + * + * @return void + */ + public function should_read_vote_without_data() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7'; + + // create user + $user = factory(App\Models\User::class)->create([ + 'wallet' => $wallet, + ]); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // create vote + $this->get("api/v1/votes/{$id}", ['wallet' => $wallet]); + + // see the status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'data', + 'meta', + ] + ); + } + + /** + * @test + * + * @return void + */ + public function should_read_vote_with_data() + { + $wallet = '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7'; + + // create user + $user = factory(App\Models\User::class)->create([ + 'wallet' => $wallet, + ]); + + // create a contract + $contract = factory(App\Models\Contract::class)->create([ + 'user_id' => $user->id, + ]); + + // get encoded id + $id = encodeId($contract->id); + + // create dispute + $this->post("api/v1/contracts/disputes/{$id}", ['code' => 35], ['wallet' => $wallet]); + + $data = [ + 'contract_id' => $id, + 'amount' => 10, + 'oracle_wallet' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'wallet_part' => '0xdab6AbeF495D2eeE6E4C40174c3b52D3Bc9616A7', + 'message' => 'hello', + 'hash' => 123, + ]; + + // create vote + $this->post("api/v1/votes", $data, ['wallet' => $wallet]); + + // create vote + $this->get("api/v1/votes/{$id}", ['wallet' => $wallet]); + + // see the status + $this->seeStatusCode(200); + + // validate stucture of data + $this->seeJsonStructure( + [ + 'data', + ] + ); + } +}