Permalink
Show file tree
Hide file tree
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
NEXT-15183 - Add Dangerfile
- Loading branch information
1 parent
5a5f000
commit b5c3ce3
Showing
6 changed files
with
341 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,54 @@ | ||
| const GitlabClient = require('gitlab'); | ||
|
|
||
| const api = new GitlabClient.Gitlab({ | ||
| token: process.env['DANGER_GITLAB_API_TOKEN'], | ||
| host: process.env['DANGER_GITLAB_HOST'] | ||
| }); | ||
|
|
||
| const addLabel = (labels) => { | ||
| const currentLabels = danger.gitlab.mr.labels; | ||
|
|
||
| for (const label of labels) { | ||
| currentLabels.push(label); | ||
| } | ||
|
|
||
| api.MergeRequests.edit(1, process.env['CI_MERGE_REQUEST_IID'], { | ||
| 'labels': currentLabels.join(',') | ||
| }) | ||
| }; | ||
|
|
||
| const removeLabel = (labels) => { | ||
| const currentLabels = danger.gitlab.mr.labels; | ||
|
|
||
| for (const label of labels) { | ||
| const index = currentLabels.indexOf(label); | ||
| if (index > -1) { | ||
| currentLabels.splice(index, 1); | ||
| } | ||
|
|
||
| api.MergeRequests.edit(1, process.env['CI_MERGE_REQUEST_IID'], { | ||
| 'labels': currentLabels.join(',') | ||
| }) | ||
| } | ||
| }; | ||
|
|
||
| const hasStoreApiRouteChanges = () => { | ||
| for (let file of danger.git.modified_files) { | ||
| if (file.includes('SalesChannel') && file.includes('Route.php') && !file.includes('/Test/')) { | ||
| return true; | ||
| } | ||
| } | ||
|
|
||
| for (let file of danger.git.created_files) { | ||
| if (file.includes('SalesChannel') && file.includes('Route.php') && !file.includes('/Test/')) { | ||
| return true; | ||
| } | ||
| } | ||
|
|
||
| return false; | ||
| } | ||
|
|
||
| if (hasStoreApiRouteChanges()) { | ||
| warn('Store-API Route has been modified. @Reviewers please review carefully!') | ||
| addLabel(['Security-Audit Required']); | ||
| } |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
229 changes: 229 additions & 0 deletions
229
src/Core/Checkout/Test/Order/SalesChannel/CancelOrderRouteTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,229 @@ | ||
| <?php declare(strict_types=1); | ||
|
|
||
| namespace Shopware\Core\Checkout\Test\Order\SalesChannel; | ||
|
|
||
| use PHPUnit\Framework\TestCase; | ||
| use Shopware\Core\Checkout\Cart\LineItem\LineItem; | ||
| use Shopware\Core\Checkout\Cart\Price\Struct\CalculatedPrice; | ||
| use Shopware\Core\Checkout\Cart\Price\Struct\CartPrice; | ||
| use Shopware\Core\Checkout\Cart\Price\Struct\QuantityPriceDefinition; | ||
| use Shopware\Core\Checkout\Cart\Tax\Struct\CalculatedTaxCollection; | ||
| use Shopware\Core\Checkout\Cart\Tax\Struct\TaxRuleCollection; | ||
| use Shopware\Core\Checkout\Order\OrderEntity; | ||
| use Shopware\Core\Checkout\Test\Customer\SalesChannel\CustomerTestTrait; | ||
| use Shopware\Core\Defaults; | ||
| use Shopware\Core\Framework\Context; | ||
| use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface; | ||
| use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; | ||
| use Shopware\Core\Framework\Test\IdsCollection; | ||
| use Shopware\Core\Framework\Test\TestCaseBase\IntegrationTestBehaviour; | ||
| use Shopware\Core\Framework\Test\TestDataCollection; | ||
| use Shopware\Core\Framework\Uuid\Uuid; | ||
| use Symfony\Bundle\FrameworkBundle\KernelBrowser; | ||
| use Symfony\Component\HttpFoundation\Response; | ||
|
|
||
| class CancelOrderRouteTest extends TestCase | ||
| { | ||
| use IntegrationTestBehaviour; | ||
| use CustomerTestTrait; | ||
|
|
||
| private KernelBrowser $browser; | ||
|
|
||
| private EntityRepositoryInterface $customerRepository; | ||
|
|
||
| private IdsCollection $ids; | ||
|
|
||
| protected function setUp(): void | ||
| { | ||
| parent::setUp(); | ||
|
|
||
| $this->customerRepository = $this->getContainer()->get('customer.repository'); | ||
| $this->ids = new TestDataCollection(); | ||
|
|
||
| $this->browser = $this->createCustomSalesChannelBrowser([ | ||
| 'id' => $this->ids->create('sales-channel'), | ||
| ]); | ||
|
|
||
| $this->assignSalesChannelContext($this->browser); | ||
|
|
||
| $email = Uuid::randomHex() . '@example.com'; | ||
| $customerId = $this->createCustomer('shopware', $email); | ||
|
|
||
| $this->ids->set('order-1', $this->createOrder($this->ids, $customerId)); | ||
| $this->ids->set('order-2', $this->createOrder($this->ids, $this->createCustomer('test', 'test-other@test.de'))); | ||
|
|
||
| $this->browser | ||
| ->request( | ||
| 'POST', | ||
| '/store-api/account/login', | ||
| [ | ||
| 'email' => $email, | ||
| 'password' => 'shopware', | ||
| ] | ||
| ); | ||
|
|
||
| $response = json_decode($this->browser->getResponse()->getContent(), true); | ||
|
|
||
| $this->browser->setServerParameter('HTTP_SW_CONTEXT_TOKEN', $response['contextToken']); | ||
| } | ||
|
|
||
| public function testCancelMyOwnOrder(): void | ||
| { | ||
| $this->browser | ||
| ->request( | ||
| 'POST', | ||
| '/store-api/order/state/cancel', | ||
| [ | ||
| 'orderId' => $this->ids->get('order-1'), | ||
| ] | ||
| ); | ||
|
|
||
| $response = json_decode($this->browser->getResponse()->getContent(), true); | ||
|
|
||
| static::assertSame(Response::HTTP_OK, $this->browser->getResponse()->getStatusCode()); | ||
| static::assertSame('cancelled', $response['technicalName']); | ||
|
|
||
| $criteria = new Criteria([$this->ids->get('order-1')]); | ||
| $criteria->addAssociation('stateMachineState'); | ||
|
|
||
| /** @var OrderEntity $order */ | ||
| $order = $this->getContainer()->get('order.repository')->search($criteria, Context::createDefaultContext())->first(); | ||
|
|
||
| static::assertSame('cancelled', $order->getStateMachineState()->getTechnicalName()); | ||
| } | ||
|
|
||
| public function testCancelRandomOrder(): void | ||
| { | ||
| $this->browser | ||
| ->request( | ||
| 'POST', | ||
| '/store-api/order/state/cancel', | ||
| [ | ||
| 'orderId' => Uuid::randomHex(), | ||
| ] | ||
| ); | ||
|
|
||
| $response = json_decode($this->browser->getResponse()->getContent(), true); | ||
|
|
||
| static::assertSame(Response::HTTP_NOT_FOUND, $this->browser->getResponse()->getStatusCode()); | ||
| static::assertSame('FRAMEWORK__ENTITY_NOT_FOUND', $response['errors'][0]['code']); | ||
| } | ||
|
|
||
| public function testCancelOtherUsersOrder(): void | ||
| { | ||
| $this->browser | ||
| ->request( | ||
| 'POST', | ||
| '/store-api/order/state/cancel', | ||
| [ | ||
| 'orderId' => $this->ids->get('order-2'), | ||
| ] | ||
| ); | ||
|
|
||
| $response = json_decode($this->browser->getResponse()->getContent(), true); | ||
|
|
||
| static::assertSame(Response::HTTP_NOT_FOUND, $this->browser->getResponse()->getStatusCode()); | ||
| static::assertSame('FRAMEWORK__ENTITY_NOT_FOUND', $response['errors'][0]['code']); | ||
| } | ||
|
|
||
| public function testCancelWithoutLogin(): void | ||
| { | ||
| $this->browser = $this->createCustomSalesChannelBrowser([ | ||
| 'id' => Uuid::randomHex(), | ||
| ]); | ||
|
|
||
| $this->browser | ||
| ->request( | ||
| 'POST', | ||
| '/store-api/order/state/cancel', | ||
| [ | ||
| 'orderId' => $this->ids->get('order-2'), | ||
| ] | ||
| ); | ||
|
|
||
| $response = json_decode($this->browser->getResponse()->getContent(), true); | ||
|
|
||
| static::assertSame(Response::HTTP_FORBIDDEN, $this->browser->getResponse()->getStatusCode()); | ||
| static::assertSame('CHECKOUT__CUSTOMER_NOT_LOGGED_IN', $response['errors'][0]['code']); | ||
| } | ||
|
|
||
| private function createOrder(IdsCollection $ids, string $customerId): string | ||
| { | ||
| $id = Uuid::randomHex(); | ||
|
|
||
| $this->getContainer()->get('order.repository')->create( | ||
| [[ | ||
| 'id' => $id, | ||
| 'orderDateTime' => (new \DateTimeImmutable())->format(Defaults::STORAGE_DATE_TIME_FORMAT), | ||
| 'price' => new CartPrice(10, 10, 10, new CalculatedTaxCollection(), new TaxRuleCollection(), CartPrice::TAX_STATE_NET), | ||
| 'shippingCosts' => new CalculatedPrice(10, 10, new CalculatedTaxCollection(), new TaxRuleCollection()), | ||
| 'orderCustomer' => [ | ||
| 'customerId' => $customerId, | ||
| 'email' => 'test@example.com', | ||
| 'salutationId' => $this->getValidSalutationId(), | ||
| 'firstName' => 'Max', | ||
| 'lastName' => 'Mustermann', | ||
| ], | ||
| 'stateId' => $this->getStateMachineState(), | ||
| 'paymentMethodId' => $this->getValidPaymentMethodId(), | ||
| 'currencyId' => Defaults::CURRENCY, | ||
| 'currencyFactor' => 1.0, | ||
| 'salesChannelId' => Defaults::SALES_CHANNEL, | ||
| 'billingAddressId' => $billingAddressId = Uuid::randomHex(), | ||
| 'addresses' => [ | ||
| [ | ||
| 'id' => $billingAddressId, | ||
| 'salutationId' => $this->getValidSalutationId(), | ||
| 'firstName' => 'Max', | ||
| 'lastName' => 'Mustermann', | ||
| 'street' => 'Ebbinghoff 10', | ||
| 'zipcode' => '48624', | ||
| 'city' => 'Schöppingen', | ||
| 'countryId' => $this->getValidCountryId(), | ||
| ], | ||
| ], | ||
| 'lineItems' => [ | ||
| [ | ||
| 'id' => $ids->get('VoucherA'), | ||
| 'type' => LineItem::PROMOTION_LINE_ITEM_TYPE, | ||
| 'code' => $ids->get('VoucherA'), | ||
| 'identifier' => $ids->get('VoucherA'), | ||
| 'quantity' => 1, | ||
| 'payload' => ['promotionId' => $ids->get('voucherA')], | ||
| 'label' => 'label', | ||
| 'price' => new CalculatedPrice(200, 200, new CalculatedTaxCollection(), new TaxRuleCollection()), | ||
| 'priceDefinition' => new QuantityPriceDefinition(200, new TaxRuleCollection(), 2), | ||
| ], | ||
| [ | ||
| 'id' => $ids->get('VoucherC'), | ||
| 'type' => LineItem::PROMOTION_LINE_ITEM_TYPE, | ||
| 'code' => $ids->get('VoucherC'), | ||
| 'identifier' => $ids->get('VoucherC'), | ||
| 'payload' => ['promotionId' => $ids->get('voucherB')], | ||
| 'quantity' => 1, | ||
| 'label' => 'label', | ||
| 'price' => new CalculatedPrice(200, 200, new CalculatedTaxCollection(), new TaxRuleCollection()), | ||
| 'priceDefinition' => new QuantityPriceDefinition(200, new TaxRuleCollection(), 2), | ||
| ], | ||
| [ | ||
| 'id' => $ids->get('VoucherB'), | ||
| 'type' => LineItem::PROMOTION_LINE_ITEM_TYPE, | ||
| 'code' => $ids->get('VoucherB'), | ||
| 'identifier' => $ids->get('VoucherB'), | ||
| 'payload' => ['promotionId' => $ids->get('voucherB')], | ||
| 'quantity' => 1, | ||
| 'label' => 'label', | ||
| 'price' => new CalculatedPrice(200, 200, new CalculatedTaxCollection(), new TaxRuleCollection()), | ||
| 'priceDefinition' => new QuantityPriceDefinition(200, new TaxRuleCollection(), 2), | ||
| ], | ||
| ], | ||
| 'deliveries' => [], | ||
| 'context' => '{}', | ||
| 'payload' => '{}', | ||
| ]], | ||
| Context::createDefaultContext() | ||
| ); | ||
|
|
||
| return $id; | ||
| } | ||
| } |
Oops, something went wrong.