longyi 5 سال پیش
کامیت
5ed87756cf
100فایلهای تغییر یافته به همراه31278 افزوده شده و 0 حذف شده
  1. 7 0
      .github/.htaccess
  2. 46 0
      .github/CODE_OF_CONDUCT.md
  3. 36 0
      .github/CONTRIBUTING.md
  4. 36 0
      .github/ISSUE_TEMPLATE.md
  5. 34 0
      .github/ISSUE_TEMPLATE/bug_report.md
  6. 19 0
      .github/ISSUE_TEMPLATE/developer-experience-issue.md
  7. 21 0
      .github/ISSUE_TEMPLATE/feature_request.md
  8. 38 0
      .github/PULL_REQUEST_TEMPLATE.md
  9. 67 0
      .gitignore
  10. 425 0
      .htaccess
  11. 402 0
      .htaccess.sample
  12. 49 0
      .php_cs.dist
  13. 68 0
      .travis.yml
  14. 6139 0
      CHANGELOG.md
  15. 9 0
      COPYING.txt
  16. 109 0
      Gruntfile.js.sample
  17. 48 0
      LICENSE.txt
  18. 48 0
      LICENSE_AFL.txt
  19. 8 0
      app/.htaccess
  20. 40 0
      app/autoload.php
  21. 75 0
      app/bootstrap.php
  22. 33 0
      app/etc/NonComposerComponentRegistration.php
  23. 210 0
      app/etc/config.php
  24. 17 0
      app/etc/db_schema.xml
  25. 1759 0
      app/etc/di.xml
  26. 19 0
      app/etc/registration_globlist.php
  27. 5 0
      app/etc/vendor_path.php
  28. 27 0
      app/functions.php
  29. 11 0
      auth.json.sample
  30. 8 0
      bin/.htaccess
  31. 32 0
      bin/magento
  32. 72 0
      composer.json
  33. 19832 0
      composer.lock
  34. 8 0
      dev/.htaccess
  35. 11 0
      dev/tests/acceptance/.gitignore
  36. 11 0
      dev/tests/acceptance/.htaccess.sample
  37. 9 0
      dev/tests/acceptance/tests/_bootstrap.php
  38. BIN
      dev/tests/acceptance/tests/_data/LargerThan2MB.jpg
  39. BIN
      dev/tests/acceptance/tests/_data/adobe-base.jpg
  40. BIN
      dev/tests/acceptance/tests/_data/adobe-small.jpg
  41. BIN
      dev/tests/acceptance/tests/_data/adobe-thumb.jpg
  42. BIN
      dev/tests/acceptance/tests/_data/bmp.bmp
  43. 4 0
      dev/tests/acceptance/tests/_data/catalog_products.csv
  44. 1 0
      dev/tests/acceptance/tests/_data/dump.sql
  45. 0 0
      dev/tests/acceptance/tests/_data/empty.jpg
  46. BIN
      dev/tests/acceptance/tests/_data/gif.gif
  47. BIN
      dev/tests/acceptance/tests/_data/ico.ico
  48. 4 0
      dev/tests/acceptance/tests/_data/import_updated.csv
  49. BIN
      dev/tests/acceptance/tests/_data/jpg.jpg
  50. BIN
      dev/tests/acceptance/tests/_data/large.jpg
  51. BIN
      dev/tests/acceptance/tests/_data/lorem_ipsum.docx
  52. 9 0
      dev/tests/acceptance/tests/_data/lorem_ipsum.txt
  53. BIN
      dev/tests/acceptance/tests/_data/m-logo.gif
  54. BIN
      dev/tests/acceptance/tests/_data/magento-again.jpg
  55. BIN
      dev/tests/acceptance/tests/_data/magento-logo.png
  56. BIN
      dev/tests/acceptance/tests/_data/magento.jpg
  57. BIN
      dev/tests/acceptance/tests/_data/magento2.jpg
  58. BIN
      dev/tests/acceptance/tests/_data/magento3.jpg
  59. BIN
      dev/tests/acceptance/tests/_data/magentoStage.jpg
  60. BIN
      dev/tests/acceptance/tests/_data/medium.jpg
  61. BIN
      dev/tests/acceptance/tests/_data/png.png
  62. BIN
      dev/tests/acceptance/tests/_data/small.jpg
  63. 20 0
      dev/tests/acceptance/tests/_data/svg.svg
  64. BIN
      dev/tests/acceptance/tests/_data/test-IMAGE_123,456.789.jpg
  65. 23 0
      dev/tests/acceptance/tests/_suite/WYSIWYGDisabledSuite.xml
  66. 25 0
      dev/tests/acceptance/tests/_suite/suite.xml.sample
  67. 48 0
      dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductCatalogSearch/LICENSE.txt
  68. 48 0
      dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductCatalogSearch/LICENSE_AFL.txt
  69. 3 0
      dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductCatalogSearch/README.md
  70. 30 0
      dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductCatalogSearch/Test/EndToEndB2CGuestUserTest.xml
  71. 30 0
      dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductCatalogSearch/Test/EndToEndB2CLoggedInUserTest.xml
  72. 35 0
      dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductWishlist/ActionGroup/StorefrontCustomerWishlistActionGroup.xml
  73. 48 0
      dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductWishlist/LICENSE.txt
  74. 48 0
      dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductWishlist/LICENSE_AFL.txt
  75. 3 0
      dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductWishlist/README.md
  76. 29 0
      dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductWishlist/Test/EndToEndB2CLoggedInUserTest.xml
  77. 3 0
      dev/tests/api-functional/.gitignore
  78. 78 0
      dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester.php
  79. 25 0
      dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/DeleteCookie.php
  80. 53 0
      dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetPublicCookie.php
  81. 37 0
      dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetSensitiveCookie.php
  82. 106 0
      dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/AllSoapAndRest.php
  83. 51 0
      dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/AllSoapAndRestInterface.php
  84. 64 0
      dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/Item.php
  85. 86 0
      dev/tests/api-functional/_files/Magento/TestModule1/Service/V2/AllSoapAndRest.php
  86. 52 0
      dev/tests/api-functional/_files/Magento/TestModule1/Service/V2/AllSoapAndRestInterface.php
  87. 60 0
      dev/tests/api-functional/_files/Magento/TestModule1/Service/V2/Entity/Item.php
  88. 20 0
      dev/tests/api-functional/_files/Magento/TestModule1/etc/acl.xml
  89. 23 0
      dev/tests/api-functional/_files/Magento/TestModule1/etc/di.xml
  90. 17 0
      dev/tests/api-functional/_files/Magento/TestModule1/etc/extension_attributes.xml
  91. 14 0
      dev/tests/api-functional/_files/Magento/TestModule1/etc/frontend/routes.xml
  92. 10 0
      dev/tests/api-functional/_files/Magento/TestModule1/etc/module.xml
  93. 106 0
      dev/tests/api-functional/_files/Magento/TestModule1/etc/webapi.xml
  94. 12 0
      dev/tests/api-functional/_files/Magento/TestModule1/registration.php
  95. 43 0
      dev/tests/api-functional/_files/Magento/TestModule2/Service/V1/Entity/Item.php
  96. 61 0
      dev/tests/api-functional/_files/Magento/TestModule2/Service/V1/NoWebApiXml.php
  97. 42 0
      dev/tests/api-functional/_files/Magento/TestModule2/Service/V1/NoWebApiXmlInterface.php
  98. 69 0
      dev/tests/api-functional/_files/Magento/TestModule2/Service/V1/SubsetRest.php
  99. 50 0
      dev/tests/api-functional/_files/Magento/TestModule2/Service/V1/SubsetRestInterface.php
  100. 0 0
      dev/tests/api-functional/_files/Magento/TestModule2/etc/acl.xml

+ 7 - 0
.github/.htaccess

@@ -0,0 +1,7 @@
+<IfVersion < 2.4>
+    Order deny,allow
+    Deny from all
+</IfVersion>
+<IfVersion >= 2.4>
+    Require all denied
+</IfVersion>

+ 46 - 0
.github/CODE_OF_CONDUCT.md

@@ -0,0 +1,46 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at engcom@magento.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
+
+[homepage]: http://contributor-covenant.org
+[version]: http://contributor-covenant.org/version/1/4/

+ 36 - 0
.github/CONTRIBUTING.md

@@ -0,0 +1,36 @@
+# Contributing to Magento 2 code
+
+Contributions to the Magento 2 codebase are done using the fork & pull model.
+This contribution model has contributors maintaining their own copy of the forked codebase (which can easily be synced with the main copy). The forked repository is then used to submit a request to the base repository to “pull” a set of changes. For more information on pull requests please refer to [GitHub Help](https://help.github.com/articles/about-pull-requests/).
+
+Contributions can take the form of new components or features, changes to existing features, tests, documentation (such as developer guides, user guides, examples, or specifications), bug fixes or optimizations.
+
+The Magento 2 development team will review all issues and contributions submitted by the community of developers in the first in, first out order. During the review we might require clarifications from the contributor. If there is no response from the contributor within two weeks, the pull request will be closed.
+
+
+## Contribution requirements
+
+1. Contributions must adhere to the [Magento coding standards](https://devdocs.magento.com/guides/v2.2/coding-standards/bk-coding-standards.html).
+2. Pull requests (PRs) must be accompanied by a meaningful description of their purpose. Comprehensive descriptions increase the chances of a pull request being merged quickly and without additional clarification requests.
+3. Commits must be accompanied by meaningful commit messages. Please see the [Magento Pull Request Template](https://github.com/magento/magento2/blob/2.2-develop/.github/PULL_REQUEST_TEMPLATE.md) for more information.
+4. PRs which include bug fixes must be accompanied with a step-by-step description of how to reproduce the bug.
+3. PRs which include new logic or new features must be submitted along with:
+* Unit/integration test coverage
+* Proposed [documentation](https://devdocs.magento.com) updates. Documentation contributions can be submitted via the [devdocs GitHub](https://github.com/magento/devdocs).
+4. For larger features or changes, please [open an issue](https://github.com/magento/magento2/issues) to discuss the proposed changes prior to development. This may prevent duplicate or unnecessary effort and allow other contributors to provide input.
+5. All automated tests must pass (all builds on [Travis CI](https://travis-ci.org/magento/magento2) must be green).
+
+## Contribution process
+
+If you are a new GitHub user, we recommend that you create your own [free github account](https://github.com/signup/free). This will allow you to collaborate with the Magento 2 development team, fork the Magento 2 project and send pull requests.
+
+1. Search current [listed issues](https://github.com/magento/magento2/issues) (open or closed) for similar proposals of intended contribution before starting work on a new contribution.
+2. Review the [Contributor License Agreement](https://magento.com/legaldocuments/mca) if this is your first time contributing.
+3. Create and test your work.
+4. Fork the Magento 2 repository according to the [Fork A Repository instructions](https://devdocs.magento.com/guides/v2.2/contributor-guide/contributing.html#fork) and when you are ready to send us a pull request – follow the [Create A Pull Request instructions](https://devdocs.magento.com/guides/v2.2/contributor-guide/contributing.html#pull_request).
+5. Once your contribution is received the Magento 2 development team will review the contribution and collaborate with you as needed.
+
+## Code of Conduct
+
+Please note that this project is released with a Contributor Code of Conduct. We expect you to agree to its terms when participating in this project.
+The full text is available in the repository [Wiki](https://github.com/magento/magento2/wiki/Magento-Code-of-Conduct).

+ 36 - 0
.github/ISSUE_TEMPLATE.md

@@ -0,0 +1,36 @@
+<!---
+    Thank you for contributing to Magento.
+    To help us process this issue we recommend that you add the following information:
+     - Summary of the issue,
+     - Information on your environment,
+     - Steps to reproduce,
+     - Expected and actual results,
+    Fields marked with (*) are required. Please don't remove the template.
+
+    Please also have a look at our guidelines article before adding a new issue https://github.com/magento/magento2/wiki/Issue-reporting-guidelines
+-->
+
+### Preconditions (*)
+<!---
+    Please provide as detailed information about your environment as possible.
+    For example Magento version, tag, HEAD, PHP & MySQL version, etc..
+-->
+1. 
+2. 
+
+### Steps to reproduce (*)
+<!---
+    It is important to provide a set of clear steps to reproduce this bug.
+    If relevant please include code samples
+-->
+1. 
+2. 
+3. 
+
+### Expected result (*)
+<!--- Tell us what should happen -->
+1. [Screenshots, logs or description]
+
+### Actual result (*)
+<!--- Tell us what happens instead -->
+1. [Screenshots, logs or description]

+ 34 - 0
.github/ISSUE_TEMPLATE/bug_report.md

@@ -0,0 +1,34 @@
+---
+name: Bug report
+about: Technical issue with the Magento 2 core components
+
+---
+
+<!---
+Please review our guidelines before adding a new issue: https://github.com/magento/magento2/wiki/Issue-reporting-guidelines
+Fields marked with (*) are required. Please don't remove the template.
+-->
+
+### Preconditions (*)
+<!---
+Provide the exact Magento version (example: 2.2.5) and any important information on the environment where bug is reproducible.
+-->
+1.
+2.
+
+### Steps to reproduce (*)
+<!---
+Important: Provide a set of clear steps to reproduce this bug. We can not provide support without clear instructions on how to reproduce.
+-->
+1.
+2.
+
+### Expected result (*)
+<!--- Tell us what do you expect to happen. -->
+1. [Screenshots, logs or description]
+2.
+
+### Actual result (*)
+<!--- Tell us what happened instead. Include error messages and issues. -->
+1. [Screenshots, logs or description]
+2.

+ 19 - 0
.github/ISSUE_TEMPLATE/developer-experience-issue.md

@@ -0,0 +1,19 @@
+---
+name: Developer experience issue
+about: Issues related to customization, extensibility, modularity
+
+---
+
+<!---
+Please review our guidelines before adding a new issue: https://github.com/magento/magento2/wiki/Issue-reporting-guidelines
+Fields marked with (*) are required. Please don't remove the template.
+-->
+
+### Summary (*)
+<!--- Describe the issue you are experiencing. Include general information, error messages, environments, and so on. -->
+
+### Examples (*)
+<!--- Provide code examples or a patch with a test (recommended) to clearly indicate the problem. -->
+
+### Proposed solution
+<!--- Suggest your potential solutions for this issue. -->

+ 21 - 0
.github/ISSUE_TEMPLATE/feature_request.md

@@ -0,0 +1,21 @@
+---
+name: Feature request
+about: Please consider reporting directly to https://github.com/magento/community-features
+
+---
+
+<!---
+Important: This repository is intended only for Magento 2 Technical Issues. Enter Feature Requests at https://github.com/magento/community-features. Project stakeholders monitor and manage requests. Feature requests entered using this form may be moved to the forum. Fields marked with (*) are required. Please don't remove the template.
+-->
+
+### Description (*)
+<!--- Describe the feature you would like to add. -->
+
+### Expected behavior (*)
+<!--- What is the expected behavior of this feature? How is it going to work? -->
+
+### Benefits
+<!--- How do you think this feature would improve Magento? -->
+
+### Additional information
+<!--- What other information can you provide about the desired feature? -->

+ 38 - 0
.github/PULL_REQUEST_TEMPLATE.md

@@ -0,0 +1,38 @@
+<!---
+    Thank you for contributing to Magento.
+    To help us process this pull request we recommend that you add the following information:
+     - Summary of the pull request,
+     - Issue(s) related to the changes made,
+     - Manual testing scenarios
+    Fields marked with (*) are required. Please don't remove the template.
+-->
+
+<!--- Please provide a general summary of the Pull Request in the Title above -->
+
+### Description (*)
+<!---
+    Please provide a description of the changes proposed in the pull request.
+    Letting us know what has changed and why it needed changing will help us validate this pull request.
+-->
+
+### Fixed Issues (if relevant)
+<!---
+    If relevant, please provide a list of fixed issues in the format magento/magento2#<issue_number>.
+    There could be 1 or more issues linked here and it will help us find some more information about the reasoning behind this change.
+-->
+1. magento/magento2#<issue_number>: Issue title
+2. ...
+
+### Manual testing scenarios (*)
+<!---
+    Please provide a set of unambiguous steps to test the proposed code change.
+    Giving us manual testing scenarios will help with the processing and validation process.
+-->
+1. ...
+2. ...
+
+### Contribution checklist (*)
+ - [ ] Pull request has a meaningful description of its purpose
+ - [ ] All commits are accompanied by meaningful commit messages
+ - [ ] All new or changed code is covered with unit/integration tests (if applicable)
+ - [ ] All automated tests passed successfully (all builds on Travis CI are green)

+ 67 - 0
.gitignore

@@ -0,0 +1,67 @@
+/.buildpath
+/.cache
+/.metadata
+/.project
+/.settings
+/.vscode
+atlassian*
+/nbproject
+/robots.txt
+/pub/robots.txt
+/sitemap
+/sitemap.xml
+/pub/sitemap
+/pub/sitemap.xml
+/.idea
+/.gitattributes
+/app/config_sandbox
+/app/etc/env.php
+/app/code/Magento/TestModule*
+/lib/internal/flex/uploader/.actionScriptProperties
+/lib/internal/flex/uploader/.flexProperties
+/lib/internal/flex/uploader/.project
+/lib/internal/flex/uploader/.settings
+/lib/internal/flex/varien/.actionScriptProperties
+/lib/internal/flex/varien/.flexLibProperties
+/lib/internal/flex/varien/.project
+/lib/internal/flex/varien/.settings
+/node_modules
+/.grunt
+/Gruntfile.js
+/package.json
+/.php_cs
+/.php_cs.cache
+/grunt-config.json
+/pub/media/*.*
+!/pub/media/.htaccess
+/pub/media/attribute/*
+!/pub/media/attribute/.htaccess
+/pub/media/analytics/*
+/pub/media/catalog/*
+!/pub/media/catalog/.htaccess
+/pub/media/customer/*
+!/pub/media/customer/.htaccess
+/pub/media/downloadable/*
+!/pub/media/downloadable/.htaccess
+/pub/media/favicon/*
+/pub/media/import/*
+!/pub/media/import/.htaccess
+/pub/media/logo/*
+/pub/media/theme/*
+/pub/media/theme_customization/*
+!/pub/media/theme_customization/.htaccess
+/pub/media/wysiwyg/*
+!/pub/media/wysiwyg/.htaccess
+/pub/media/tmp/*
+!/pub/media/tmp/.htaccess
+/pub/media/captcha/*
+/pub/static/*
+!/pub/static/.htaccess
+
+/var/*
+!/var/.htaccess
+/vendor/*
+!/vendor/.htaccess
+/generated/*
+!/generated/.htaccess
+.DS_Store

+ 425 - 0
.htaccess

@@ -0,0 +1,425 @@
+############################################
+## overrides deployment configuration mode value
+## use command bin/magento deploy:mode:set to switch modes
+
+#   SetEnv MAGE_MODE developer
+
+############################################
+## uncomment these lines for CGI mode
+## make sure to specify the correct cgi php binary file name
+## it might be /cgi-bin/php-cgi
+
+#    Action php5-cgi /cgi-bin/php5-cgi
+#    AddHandler php5-cgi .php
+
+############################################
+## GoDaddy specific options
+
+#   Options -MultiViews
+
+## you might also need to add this line to php.ini
+##     cgi.fix_pathinfo = 1
+## if it still doesn't work, rename php.ini to php5.ini
+
+############################################
+## this line is specific for 1and1 hosting
+
+    #AddType x-mapp-php5 .php
+    #AddHandler x-mapp-php5 .php
+
+############################################
+## enable usage of methods arguments in backtrace
+
+    SetEnv MAGE_DEBUG_SHOW_ARGS 1
+
+############################################
+## default index file
+
+    DirectoryIndex index.php
+
+<IfModule mod_php5.c>
+############################################
+## adjust memory limit
+
+    php_value memory_limit 756M
+    php_value max_execution_time 18000
+
+############################################
+## disable automatic session start
+## before autoload was initialized
+
+    php_flag session.auto_start off
+
+############################################
+## enable resulting html compression
+
+    #php_flag zlib.output_compression on
+
+###########################################
+## disable user agent verification to not break multiple image upload
+
+    php_flag suhosin.session.cryptua off
+</IfModule>
+<IfModule mod_php7.c>
+############################################
+## adjust memory limit
+
+    php_value memory_limit 756M
+    php_value max_execution_time 18000
+
+############################################
+## disable automatic session start
+## before autoload was initialized
+
+    php_flag session.auto_start off
+
+############################################
+## enable resulting html compression
+
+    #php_flag zlib.output_compression on
+
+###########################################
+## disable user agent verification to not break multiple image upload
+
+    php_flag suhosin.session.cryptua off
+</IfModule>
+<IfModule mod_security.c>
+###########################################
+## disable POST processing to not break multiple image upload
+
+    SecFilterEngine Off
+    SecFilterScanPOST Off
+</IfModule>
+
+<IfModule mod_deflate.c>
+
+############################################
+## enable apache served files compression
+## http://developer.yahoo.com/performance/rules.html#gzip
+
+    # Insert filter on all content
+    ###SetOutputFilter DEFLATE
+    # Insert filter on selected content types only
+    #AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json image/svg+xml
+
+    # Netscape 4.x has some problems...
+    #BrowserMatch ^Mozilla/4 gzip-only-text/html
+
+    # Netscape 4.06-4.08 have some more problems
+    #BrowserMatch ^Mozilla/4\.0[678] no-gzip
+
+    # MSIE masquerades as Netscape, but it is fine
+    #BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
+
+    # Don't compress images
+    #SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
+
+    # Make sure proxies don't deliver the wrong content
+    #Header append Vary User-Agent env=!dont-vary
+
+</IfModule>
+
+<IfModule mod_ssl.c>
+
+############################################
+## make HTTPS env vars available for CGI mode
+
+    SSLOptions StdEnvVars
+
+</IfModule>
+
+############################################
+## workaround for Apache 2.4.6 CentOS build when working via ProxyPassMatch with HHVM (or any other)
+## Please, set it on virtual host configuration level
+
+##    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
+############################################
+
+<IfModule mod_rewrite.c>
+
+############################################
+## enable rewrites
+
+    Options +FollowSymLinks
+    RewriteEngine on
+
+############################################
+## you can put here your magento root folder
+## path relative to web root
+
+    #RewriteBase /magento/
+
+############################################
+## workaround for HTTP authorization
+## in CGI environment
+
+    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+############################################
+## TRACE and TRACK HTTP methods disabled to prevent XSS attacks
+
+    RewriteCond %{REQUEST_METHOD} ^TRAC[EK]
+    RewriteRule .* - [L,R=405]
+
+############################################
+## redirect for mobile user agents
+
+    #RewriteCond %{REQUEST_URI} !^/mobiledirectoryhere/.*$
+    #RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
+    #RewriteRule ^(.*)$ /mobiledirectoryhere/ [L,R=302]
+
+############################################
+## never rewrite for existing files, directories and links
+
+    RewriteCond %{REQUEST_FILENAME} !-f
+    RewriteCond %{REQUEST_FILENAME} !-d
+    RewriteCond %{REQUEST_FILENAME} !-l
+
+############################################
+## rewrite everything else to index.php
+
+    RewriteRule .* index.php [L]
+
+</IfModule>
+
+
+############################################
+## Prevent character encoding issues from server overrides
+## If you still have problems, use the second line instead
+
+    AddDefaultCharset Off
+    #AddDefaultCharset UTF-8
+    AddType 'text/html; charset=UTF-8' html
+
+<IfModule mod_expires.c>
+
+############################################
+## Add default Expires header
+## http://developer.yahoo.com/performance/rules.html#expires
+
+    ExpiresDefault "access plus 1 year"
+    ExpiresByType text/html A0
+    ExpiresByType text/plain A0
+
+</IfModule>
+
+###########################################
+## Deny access to root files to hide sensitive application information
+    RedirectMatch 403 /\.git
+
+    <Files composer.json>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files composer.lock>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .gitignore>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .htaccess>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .htaccess.sample>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .php_cs.dist>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .travis.yml>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files CHANGELOG.md>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files COPYING.txt>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files Gruntfile.js>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files LICENSE.txt>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files LICENSE_AFL.txt>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files nginx.conf.sample>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files package.json>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files php.ini.sample>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files README.md>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files magento_umask>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files auth.json>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .user.ini>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+
+# For 404s and 403s that aren't handled by the application, show plain 404 response
+ErrorDocument 404 /pub/errors/404.php
+ErrorDocument 403 /pub/errors/404.php
+
+################################
+## If running in cluster environment, uncomment this
+## http://developer.yahoo.com/performance/rules.html#etags
+
+    #FileETag none
+
+# ######################################################################
+# # INTERNET EXPLORER                                                  #
+# ######################################################################
+
+# ----------------------------------------------------------------------
+# | Document modes                                                     |
+# ----------------------------------------------------------------------
+
+# Force Internet Explorer 8/9/10 to render pages in the highest mode
+# available in the various cases when it may not.
+#
+# https://hsivonen.fi/doctype/#ie8
+#
+# (!) Starting with Internet Explorer 11, document modes are deprecated.
+# If your business still relies on older web apps and services that were
+# designed for older versions of Internet Explorer, you might want to
+# consider enabling `Enterprise Mode` throughout your company.
+#
+# https://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode
+# http://blogs.msdn.com/b/ie/archive/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11.aspx
+
+<IfModule mod_headers.c>
+
+    Header set X-UA-Compatible "IE=edge"
+
+    # `mod_headers` cannot match based on the content-type, however,
+    # the `X-UA-Compatible` response header should be send only for
+    # HTML documents and not for the other resources.
+
+    <FilesMatch "\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|webmanifest|woff2?|xloc|xml|xpi)$">
+        Header unset X-UA-Compatible
+    </FilesMatch>
+
+</IfModule>

+ 402 - 0
.htaccess.sample

@@ -0,0 +1,402 @@
+############################################
+## overrides deployment configuration mode value
+## use command bin/magento deploy:mode:set to switch modes
+
+#   SetEnv MAGE_MODE developer
+
+############################################
+## uncomment these lines for CGI mode
+## make sure to specify the correct cgi php binary file name
+## it might be /cgi-bin/php-cgi
+
+#    Action php5-cgi /cgi-bin/php5-cgi
+#    AddHandler php5-cgi .php
+
+############################################
+## GoDaddy specific options
+
+#   Options -MultiViews
+
+## you might also need to add this line to php.ini
+##     cgi.fix_pathinfo = 1
+## if it still doesn't work, rename php.ini to php5.ini
+
+############################################
+## this line is specific for 1and1 hosting
+
+    #AddType x-mapp-php5 .php
+    #AddHandler x-mapp-php5 .php
+
+############################################
+## enable usage of methods arguments in backtrace
+
+    SetEnv MAGE_DEBUG_SHOW_ARGS 1
+
+############################################
+## default index file
+
+    DirectoryIndex index.php
+
+############################################
+## adjust memory limit
+
+    php_value memory_limit 756M
+    php_value max_execution_time 18000
+
+############################################
+## disable automatic session start
+## before autoload was initialized
+
+    php_flag session.auto_start off
+
+############################################
+## enable resulting html compression
+
+    #php_flag zlib.output_compression on
+
+###########################################
+## disable user agent verification to not break multiple image upload
+
+    php_flag suhosin.session.cryptua off
+
+<IfModule mod_security.c>
+###########################################
+## disable POST processing to not break multiple image upload
+
+    SecFilterEngine Off
+    SecFilterScanPOST Off
+</IfModule>
+
+<IfModule mod_deflate.c>
+
+############################################
+## enable apache served files compression
+## http://developer.yahoo.com/performance/rules.html#gzip
+
+    # Insert filter on all content
+    ###SetOutputFilter DEFLATE
+    # Insert filter on selected content types only
+    #AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript application/x-javascript application/json image/svg+xml
+
+    # Netscape 4.x has some problems...
+    #BrowserMatch ^Mozilla/4 gzip-only-text/html
+
+    # Netscape 4.06-4.08 have some more problems
+    #BrowserMatch ^Mozilla/4\.0[678] no-gzip
+
+    # MSIE masquerades as Netscape, but it is fine
+    #BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
+
+    # Don't compress images
+    #SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
+
+    # Make sure proxies don't deliver the wrong content
+    #Header append Vary User-Agent env=!dont-vary
+
+</IfModule>
+
+<IfModule mod_ssl.c>
+
+############################################
+## make HTTPS env vars available for CGI mode
+
+    SSLOptions StdEnvVars
+
+</IfModule>
+
+############################################
+## workaround for Apache 2.4.6 CentOS build when working via ProxyPassMatch with HHVM (or any other)
+## Please, set it on virtual host configuration level
+
+##    SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
+############################################
+
+<IfModule mod_rewrite.c>
+
+############################################
+## enable rewrites
+
+    # The following line has better security but add some performance overhead - see https://httpd.apache.org/docs/2.4/en/misc/perf-tuning.html
+    Options -FollowSymLinks +SymLinksIfOwnerMatch
+    RewriteEngine on
+
+############################################
+## you can put here your magento root folder
+## path relative to web root
+
+    #RewriteBase /magento/
+
+############################################
+## workaround for HTTP authorization
+## in CGI environment
+
+    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+############################################
+## TRACE and TRACK HTTP methods disabled to prevent XSS attacks
+
+    RewriteCond %{REQUEST_METHOD} ^TRAC[EK]
+    RewriteRule .* - [L,R=405]
+
+############################################
+## redirect for mobile user agents
+
+    #RewriteCond %{REQUEST_URI} !^/mobiledirectoryhere/.*$
+    #RewriteCond %{HTTP_USER_AGENT} "android|blackberry|ipad|iphone|ipod|iemobile|opera mobile|palmos|webos|googlebot-mobile" [NC]
+    #RewriteRule ^(.*)$ /mobiledirectoryhere/ [L,R=302]
+
+############################################
+## never rewrite for existing files, directories and links
+
+    RewriteCond %{REQUEST_FILENAME} !-f
+    RewriteCond %{REQUEST_FILENAME} !-d
+    RewriteCond %{REQUEST_FILENAME} !-l
+
+############################################
+## rewrite everything else to index.php
+
+    RewriteRule .* index.php [L]
+
+</IfModule>
+
+
+############################################
+## Prevent character encoding issues from server overrides
+## If you still have problems, use the second line instead
+
+    AddDefaultCharset Off
+    #AddDefaultCharset UTF-8
+    AddType 'text/html; charset=UTF-8' html
+
+<IfModule mod_expires.c>
+
+############################################
+## Add default Expires header
+## http://developer.yahoo.com/performance/rules.html#expires
+
+    ExpiresDefault "access plus 1 year"
+    ExpiresByType text/html A0
+    ExpiresByType text/plain A0
+
+</IfModule>
+
+###########################################
+## Deny access to root files to hide sensitive application information
+    RedirectMatch 403 /\.git
+
+    <Files composer.json>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files composer.lock>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .gitignore>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .htaccess>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .htaccess.sample>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .php_cs.dist>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .travis.yml>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files CHANGELOG.md>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files COPYING.txt>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files Gruntfile.js>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files LICENSE.txt>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files LICENSE_AFL.txt>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files nginx.conf.sample>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files package.json>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files php.ini.sample>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files README.md>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files magento_umask>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files auth.json>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+    <Files .user.ini>
+        <IfVersion < 2.4>
+            order allow,deny
+            deny from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all denied
+        </IfVersion>
+    </Files>
+
+# For 404s and 403s that aren't handled by the application, show plain 404 response
+ErrorDocument 404 /pub/errors/404.php
+ErrorDocument 403 /pub/errors/404.php
+
+################################
+## If running in cluster environment, uncomment this
+## http://developer.yahoo.com/performance/rules.html#etags
+
+    #FileETag none
+
+# ######################################################################
+# # INTERNET EXPLORER                                                  #
+# ######################################################################
+
+# ----------------------------------------------------------------------
+# | Document modes                                                     |
+# ----------------------------------------------------------------------
+
+# Force Internet Explorer 8/9/10 to render pages in the highest mode
+# available in the various cases when it may not.
+#
+# https://hsivonen.fi/doctype/#ie8
+#
+# (!) Starting with Internet Explorer 11, document modes are deprecated.
+# If your business still relies on older web apps and services that were
+# designed for older versions of Internet Explorer, you might want to
+# consider enabling `Enterprise Mode` throughout your company.
+#
+# https://msdn.microsoft.com/en-us/library/ie/bg182625.aspx#docmode
+# http://blogs.msdn.com/b/ie/archive/2014/04/02/stay-up-to-date-with-enterprise-mode-for-internet-explorer-11.aspx
+
+<IfModule mod_headers.c>
+
+    Header set X-UA-Compatible "IE=edge"
+
+    # `mod_headers` cannot match based on the content-type, however,
+    # the `X-UA-Compatible` response header should be send only for
+    # HTML documents and not for the other resources.
+
+    <FilesMatch "\.(appcache|atom|bbaw|bmp|crx|css|cur|eot|f4[abpv]|flv|geojson|gif|htc|ico|jpe?g|js|json(ld)?|m4[av]|manifest|map|mp4|oex|og[agv]|opus|otf|pdf|png|rdf|rss|safariextz|svgz?|swf|topojson|tt[cf]|txt|vcard|vcf|vtt|webapp|web[mp]|webmanifest|woff2?|xloc|xml|xpi)$">
+        Header unset X-UA-Compatible
+    </FilesMatch>
+
+</IfModule>

+ 49 - 0
.php_cs.dist

@@ -0,0 +1,49 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/**
+ * PHP Coding Standards fixer configuration
+ */
+
+$finder = PhpCsFixer\Finder::create()
+    ->name('*.phtml')
+    ->exclude('dev/tests/functional/generated')
+    ->exclude('dev/tests/functional/var')
+    ->exclude('dev/tests/functional/vendor')
+    ->exclude('dev/tests/integration/tmp')
+    ->exclude('dev/tests/integration/var')
+    ->exclude('lib/internal/Cm')
+    ->exclude('lib/internal/Credis')
+    ->exclude('lib/internal/Less')
+    ->exclude('lib/internal/LinLibertineFont')
+    ->exclude('pub/media')
+    ->exclude('pub/static')
+    ->exclude('setup/vendor')
+    ->exclude('var');
+
+return PhpCsFixer\Config::create()
+    ->setFinder($finder)
+    ->setRules([
+        '@PSR2' => true,
+        'array_syntax' => ['syntax' => 'short'],
+        'concat_space' => ['spacing' => 'one'],
+        'include' => true,
+        'new_with_braces' => true,
+        'no_empty_statement' => true,
+        'no_extra_consecutive_blank_lines' => true,
+        'no_leading_import_slash' => true,
+        'no_leading_namespace_whitespace' => true,
+        'no_multiline_whitespace_around_double_arrow' => true,
+        'no_multiline_whitespace_before_semicolons' => true,
+        'no_singleline_whitespace_before_semicolons' => true,
+        'no_trailing_comma_in_singleline_array' => true,
+        'no_unused_imports' => true,
+        'no_whitespace_in_blank_line' => true,
+        'object_operator_without_whitespace' => true,
+        'ordered_imports' => true,
+        'standardize_not_equals' => true,
+        'ternary_operator_spaces' => true,
+    ]);

+ 68 - 0
.travis.yml

@@ -0,0 +1,68 @@
+sudo: required
+dist: trusty
+group: edge
+addons:
+  apt:
+    packages:
+    - mysql-server-5.6
+    - mysql-client-core-5.6
+    - mysql-client-5.6
+    - postfix
+  firefox: "46.0"
+  hosts:
+      - magento2.travis
+services:
+  - rabbitmq
+  - elasticsearch
+language: php
+php:
+  - 7.1
+  - 7.2
+env:
+  global:
+    - COMPOSER_BIN_DIR=~/bin
+    - INTEGRATION_SETS=3
+    - NODE_JS_VERSION=8
+    - MAGENTO_HOST_NAME="magento2.travis"
+  matrix:
+    - TEST_SUITE=unit
+    - TEST_SUITE=static
+    - TEST_SUITE=js GRUNT_COMMAND=spec
+    - TEST_SUITE=js GRUNT_COMMAND=static
+    - TEST_SUITE=integration INTEGRATION_INDEX=1
+    - TEST_SUITE=integration INTEGRATION_INDEX=2
+    - TEST_SUITE=integration INTEGRATION_INDEX=3
+    - TEST_SUITE=functional
+    - TEST_SUITE=graphql-api-functional
+matrix:
+  exclude:
+    - php: 7.1
+      env: TEST_SUITE=static
+    - php: 7.1
+      env: TEST_SUITE=js GRUNT_COMMAND=spec
+    - php: 7.1
+      env: TEST_SUITE=js GRUNT_COMMAND=static
+    - php: 7.1
+      env: TEST_SUITE=functional
+    - php: 7.1
+      env: TEST_SUITE=graphql-api-functional
+cache:
+  apt: true
+  directories:
+    - $HOME/.composer/cache
+    - $HOME/.nvm
+    - $HOME/node_modules
+    - $HOME/yarn.lock
+before_install:
+  - ./dev/travis/before_install.sh
+install: composer install --no-interaction
+before_script: ./dev/travis/before_script.sh
+script:
+  # Set arguments for variants of phpunit based tests; '|| true' prevents failing script when leading test fails
+  - test $TEST_SUITE = "functional" && TEST_FILTER='dev/tests/functional/testsuites/Magento/Mtf/TestSuite/InjectableTests.php' || true
+
+  # The scripts for grunt/phpunit type tests
+  - if [ $TEST_SUITE == "functional" ]; then dev/tests/functional/vendor/phpunit/phpunit/phpunit -c dev/tests/$TEST_SUITE $TEST_FILTER; fi
+  - if [ $TEST_SUITE != "functional" ] && [ $TEST_SUITE != "js" ] && [ $TEST_SUITE != "graphql-api-functional" ]; then phpunit -c dev/tests/$TEST_SUITE $TEST_FILTER; fi
+  - if [ $TEST_SUITE == "js" ]; then grunt $GRUNT_COMMAND; fi
+  - if [ $TEST_SUITE == "graphql-api-functional" ]; then phpunit -c dev/tests/api-functional; fi

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 6139 - 0
CHANGELOG.md


+ 9 - 0
COPYING.txt

@@ -0,0 +1,9 @@
+Copyright © 2013-present Magento, Inc.
+
+Each Magento source file included in this distribution is licensed under OSL 3.0 or the Magento Enterprise Edition (MEE) license
+
+http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
+Please see LICENSE.txt for the full text of the OSL 3.0 license or contact license@magentocommerce.com for a copy.
+
+Subject to Licensee's payment of fees and compliance with the terms and conditions of the MEE License, the MEE License supersedes the OSL 3.0 license for each source file.
+Please see LICENSE_EE.txt for the full text of the MEE License or visit http://magento.com/legal/terms/enterprise.

+ 109 - 0
Gruntfile.js.sample

@@ -0,0 +1,109 @@
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+// For performance use one level down: 'name/{,*/}*.js'
+// If you want to recursively match all subfolders, use: 'name/**/*.js'
+
+module.exports = function (grunt) {
+    'use strict';
+
+    var _ = require('underscore'),
+        path = require('path'),
+        filesRouter = require('./dev/tools/grunt/tools/files-router'),
+        configDir = './dev/tools/grunt/configs',
+        tasks = grunt.file.expand('./dev/tools/grunt/tasks/*'),
+        themes;
+
+        filesRouter.set('themes', 'dev/tools/grunt/configs/themes');
+        themes = filesRouter.get('themes');
+
+    tasks = _.map(tasks, function(task){ return task.replace('.js', '') });
+    tasks.push('time-grunt');
+    tasks.forEach(function (task) {
+        require(task)(grunt);
+    });
+
+    require('load-grunt-config')(grunt, {
+        configPath: path.join(__dirname, configDir),
+        init: true,
+        jitGrunt: {
+            staticMappings: {
+                usebanner: 'grunt-banner'
+            }
+        }
+    });
+
+    _.each({
+        /**
+         * Assembling tasks.
+         * ToDo: define default tasks.
+         */
+        default: function () {
+            grunt.log.subhead('I\'m default task and at the moment I\'m empty, sorry :/');
+        },
+
+        /**
+         * Production preparation task.
+         */
+        prod: function (component) {
+            var tasks = [
+                'less',
+                'autoprefixer',
+                'cssmin',
+                'usebanner'
+            ].map(function(task){
+                return task + ':' + component;
+            });
+
+            if (typeof component === 'undefined') {
+                grunt.log.subhead('Tip: Please make sure that u specify prod subtask. By default prod task do nothing');
+            } else {
+                grunt.task.run(tasks);
+            }
+        },
+
+        /**
+         * Refresh themes.
+         */
+        refresh: function () {
+            var tasks = [
+                'clean',
+                'exec:all'
+            ];
+            _.each(themes, function(theme, name) {
+                tasks.push('less:' + name);
+            });
+            grunt.task.run(tasks);
+        },
+
+        /**
+         * Documentation
+         */
+        documentation: [
+            'replace:documentation',
+            'less:documentation',
+            'styledocco:documentation',
+            'usebanner:documentationCss',
+            'usebanner:documentationLess',
+            'usebanner:documentationHtml',
+            'clean:var',
+            'clean:pub'
+        ],
+
+        'legacy-build': [
+            'mage-minify:legacy'
+        ],
+
+        spec: function (theme) {
+            var runner = require('./dev/tests/js/jasmine/spec_runner');
+
+            runner.init(grunt, { theme: theme });
+
+            grunt.task.run(runner.getTasks());
+        }
+    }, function (task, name) {
+        grunt.registerTask(name, task);
+    });
+};

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 48 - 0
LICENSE.txt


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 48 - 0
LICENSE_AFL.txt


+ 8 - 0
app/.htaccess

@@ -0,0 +1,8 @@
+<IfVersion < 2.4>
+    order allow,deny
+    deny from all
+</IfVersion>
+<IfVersion >= 2.4>
+    Require all denied
+</IfVersion>
+

+ 40 - 0
app/autoload.php

@@ -0,0 +1,40 @@
+<?php
+/**
+ * Register basic autoloader that uses include path
+ *
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+use Magento\Framework\Autoload\AutoloaderRegistry;
+use Magento\Framework\Autoload\ClassLoaderWrapper;
+
+/**
+ * Shortcut constant for the root directory
+ */
+define('BP', dirname(__DIR__));
+
+define('VENDOR_PATH', BP . '/app/etc/vendor_path.php');
+
+if (!file_exists(VENDOR_PATH)) {
+    throw new \Exception(
+        'We can\'t read some files that are required to run the Magento application. '
+         . 'This usually means file permissions are set incorrectly.'
+    );
+}
+
+$vendorDir = require VENDOR_PATH;
+$vendorAutoload = BP . "/{$vendorDir}/autoload.php";
+
+/* 'composer install' validation */
+if (file_exists($vendorAutoload)) {
+    $composerAutoloader = include $vendorAutoload;
+} else if (file_exists("{$vendorDir}/autoload.php")) {
+	$vendorAutoload = "{$vendorDir}/autoload.php";
+	$composerAutoloader = include $vendorAutoload;
+} else {
+    throw new \Exception(
+        'Vendor autoload is not found. Please run \'composer install\' under application root directory.'
+    );
+}
+
+AutoloaderRegistry::registerAutoloader(new ClassLoaderWrapper($composerAutoloader));

+ 75 - 0
app/bootstrap.php

@@ -0,0 +1,75 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/**
+ * Environment initialization
+ */
+error_reporting(E_ALL);
+stream_wrapper_unregister('phar');
+#ini_set('display_errors', 1);
+
+/* PHP version validation */
+if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 70103) {
+    if (PHP_SAPI == 'cli') {
+        echo 'Magento supports PHP 7.1.3 or later. ' .
+            'Please read https://devdocs.magento.com/guides/v2.3/install-gde/system-requirements-tech.html';
+    } else {
+        echo <<<HTML
+<div style="font:12px/1.35em arial, helvetica, sans-serif;">
+    <p>Magento supports PHP 7.1.3 or later. Please read
+    <a target="_blank" href="https://devdocs.magento.com/guides/v2.3/install-gde/system-requirements-tech.html">
+    Magento System Requirements</a>.
+</div>
+HTML;
+    }
+    exit(1);
+}
+
+require_once __DIR__ . '/autoload.php';
+// Sets default autoload mappings, may be overridden in Bootstrap::create
+\Magento\Framework\App\Bootstrap::populateAutoloader(BP, []);
+
+/* Custom umask value may be provided in optional mage_umask file in root */
+$umaskFile = BP . '/magento_umask';
+$mask = file_exists($umaskFile) ? octdec(file_get_contents($umaskFile)) : 002;
+umask($mask);
+
+if (empty($_SERVER['ENABLE_IIS_REWRITES']) || ($_SERVER['ENABLE_IIS_REWRITES'] != 1)) {
+    /*
+     * Unset headers used by IIS URL rewrites.
+     */
+    unset($_SERVER['HTTP_X_REWRITE_URL']);
+    unset($_SERVER['HTTP_X_ORIGINAL_URL']);
+    unset($_SERVER['IIS_WasUrlRewritten']);
+    unset($_SERVER['UNENCODED_URL']);
+    unset($_SERVER['ORIG_PATH_INFO']);
+}
+
+if (
+    (!empty($_SERVER['MAGE_PROFILER']) || file_exists(BP . '/var/profiler.flag'))
+    && isset($_SERVER['HTTP_ACCEPT'])
+    && strpos($_SERVER['HTTP_ACCEPT'], 'text/html') !== false
+) {
+    $profilerConfig = isset($_SERVER['MAGE_PROFILER']) && strlen($_SERVER['MAGE_PROFILER'])
+        ? $_SERVER['MAGE_PROFILER']
+        : trim(file_get_contents(BP . '/var/profiler.flag'));
+
+    if ($profilerConfig) {
+        $profilerConfig = json_decode($profilerConfig, true) ?: $profilerConfig;
+    }
+
+    Magento\Framework\Profiler::applyConfig(
+        $profilerConfig,
+        BP,
+        !empty($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest'
+    );
+}
+
+date_default_timezone_set('UTC');
+
+/*  For data consistency between displaying (printing) and serialization a float number */
+ini_set('precision', 14);
+ini_set('serialize_precision', 14);

+ 33 - 0
app/etc/NonComposerComponentRegistration.php

@@ -0,0 +1,33 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+//Register components (via a list of glob patterns)
+namespace Magento\NonComposerComponentRegistration;
+
+use RuntimeException;
+
+/**
+ * Include files from a list of glob patterns
+ *
+ * @throws RuntimeException
+ * @return void
+ */
+function main()
+{
+    $globPatterns = require __DIR__ . '/registration_globlist.php';
+    $baseDir = dirname(dirname(__DIR__)) . '/';
+
+    foreach ($globPatterns as $globPattern) {
+        // Sorting is disabled intentionally for performance improvement
+        $files = glob($baseDir . $globPattern, GLOB_NOSORT);
+        if ($files === false) {
+            throw new RuntimeException("glob(): error with '$baseDir$globPattern'");
+        }
+        array_map(function ($file) { require_once $file; }, $files);
+    }
+}
+
+main();

+ 210 - 0
app/etc/config.php

@@ -0,0 +1,210 @@
+<?php
+return [
+    'modules' => [
+        'Magento_Store' => 1,
+        'Magento_Directory' => 1,
+        'Magento_Theme' => 1,
+        'Magento_Backend' => 1,
+        'Magento_Variable' => 1,
+        'Magento_Eav' => 1,
+        'Magento_AdminNotification' => 1,
+        'MSP_ReCaptcha' => 1,
+        'Magento_Config' => 1,
+        'Magento_Indexer' => 1,
+        'Magento_AdvancedPricingImportExport' => 1,
+        'Magento_Search' => 1,
+        'Magento_Amqp' => 1,
+        'Magento_Security' => 1,
+        'Magento_User' => 1,
+        'Magento_Authorization' => 1,
+        'Magento_Customer' => 1,
+        'Magento_Cms' => 1,
+        'Magento_Quote' => 1,
+        'Magento_Backup' => 1,
+        'Magento_Rule' => 1,
+        'Magento_Catalog' => 1,
+        'Magento_GraphQl' => 1,
+        'Magento_BundleImportExport' => 1,
+        'Magento_CacheInvalidate' => 1,
+        'Magento_CatalogRule' => 1,
+        'Magento_SalesSequence' => 1,
+        'Magento_Integration' => 1,
+        'Magento_EavGraphQl' => 1,
+        'Magento_CatalogImportExport' => 1,
+        'Magento_Payment' => 1,
+        'Magento_CatalogInventory' => 1,
+        'Magento_Cron' => 1,
+        'Magento_Msrp' => 1,
+        'Magento_CatalogSearch' => 1,
+        'Magento_CatalogUrlRewrite' => 1,
+        'Magento_StoreGraphQl' => 1,
+        'Magento_Widget' => 1,
+        'Magento_Sales' => 1,
+        'Magento_Checkout' => 1,
+        'Magento_Vault' => 1,
+        'Magento_CmsGraphQl' => 1,
+        'Magento_CmsUrlRewrite' => 1,
+        'Magento_CmsUrlRewriteGraphQl' => 1,
+        'MSP_TwoFactorAuth' => 1,
+        'Magento_ConfigurableProduct' => 1,
+        'Magento_CatalogRuleConfigurable' => 1,
+        'Magento_CatalogGraphQl' => 1,
+        'Magento_ConfigurableProductSales' => 1,
+        'Magento_Contact' => 1,
+        'Magento_Cookie' => 1,
+        'Magento_Email' => 1,
+        'Magento_CurrencySymbol' => 1,
+        'Magento_Paypal' => 1,
+        'Magento_Analytics' => 1,
+        'Magento_CustomerGraphQl' => 1,
+        'Magento_CustomerImportExport' => 1,
+        'Magento_Deploy' => 1,
+        'Magento_Developer' => 1,
+        'Magento_Dhl' => 1,
+        'Amazon_Core' => 1,
+        'Magento_DirectoryGraphQl' => 1,
+        'Magento_Downloadable' => 1,
+        'Magento_DownloadableGraphQl' => 1,
+        'Magento_ImportExport' => 1,
+        'Magento_Authorizenet' => 1,
+        'Magento_BundleGraphQl' => 1,
+        'Magento_AdvancedSearch' => 1,
+        'Magento_Elasticsearch' => 1,
+        'Magento_Newsletter' => 1,
+        'Magento_EncryptionKey' => 1,
+        'Magento_Fedex' => 1,
+        'Magento_GiftMessage' => 1,
+        'Magento_GoogleAdwords' => 1,
+        'Magento_GoogleAnalytics' => 1,
+        'Magento_Ui' => 1,
+        'Magento_UrlRewriteGraphQl' => 1,
+        'Magento_GroupedProduct' => 1,
+        'Magento_GroupedImportExport' => 1,
+        'Magento_GroupedCatalogInventory' => 1,
+        'Magento_GroupedProductGraphQl' => 1,
+        'Magento_DownloadableImportExport' => 1,
+        'Magento_AuthorizenetAcceptjs' => 1,
+        'Magento_InstantPurchase' => 1,
+        'Magento_CatalogAnalytics' => 1,
+        'Magento_Inventory' => 1,
+        'Magento_InventoryAdminUi' => 1,
+        'Magento_InventoryApi' => 1,
+        'Magento_InventoryBundleProduct' => 1,
+        'Magento_InventoryBundleProductAdminUi' => 1,
+        'Magento_InventoryCatalog' => 1,
+        'Magento_InventorySales' => 1,
+        'Magento_InventoryCatalogAdminUi' => 1,
+        'Magento_InventoryCatalogApi' => 1,
+        'Magento_InventoryCatalogSearch' => 1,
+        'Magento_InventoryConfigurableProduct' => 1,
+        'Magento_InventoryConfigurableProductAdminUi' => 1,
+        'Magento_InventoryConfigurableProductIndexer' => 1,
+        'Magento_InventoryConfiguration' => 1,
+        'Magento_InventoryConfigurationApi' => 1,
+        'Magento_InventoryDistanceBasedSourceSelection' => 1,
+        'Magento_InventoryDistanceBasedSourceSelectionAdminUi' => 1,
+        'Magento_InventoryDistanceBasedSourceSelectionApi' => 1,
+        'Magento_InventoryElasticsearch' => 1,
+        'Magento_InventoryGroupedProduct' => 1,
+        'Magento_InventoryGroupedProductAdminUi' => 1,
+        'Magento_InventoryGroupedProductIndexer' => 1,
+        'Magento_InventoryImportExport' => 1,
+        'Magento_InventoryIndexer' => 1,
+        'Magento_InventoryLowQuantityNotification' => 1,
+        'Magento_InventoryLowQuantityNotificationAdminUi' => 1,
+        'Magento_InventoryLowQuantityNotificationApi' => 1,
+        'Magento_InventoryMultiDimensionalIndexerApi' => 1,
+        'Magento_InventoryProductAlert' => 1,
+        'Magento_InventoryReservations' => 1,
+        'Magento_InventoryReservationsApi' => 1,
+        'Magento_InventoryCache' => 1,
+        'Magento_InventorySalesAdminUi' => 1,
+        'Magento_InventorySalesApi' => 1,
+        'Magento_InventorySalesFrontendUi' => 1,
+        'Magento_InventorySetupFixtureGenerator' => 1,
+        'Magento_InventoryShipping' => 1,
+        'Magento_Shipping' => 1,
+        'Magento_InventorySourceDeductionApi' => 1,
+        'Magento_InventorySourceSelection' => 1,
+        'Magento_InventorySourceSelectionApi' => 1,
+        'Magento_LayeredNavigation' => 1,
+        'Magento_Marketplace' => 1,
+        'Magento_MediaStorage' => 1,
+        'Magento_MessageQueue' => 1,
+        'Magento_ConfigurableImportExport' => 1,
+        'Magento_MsrpConfigurableProduct' => 1,
+        'Magento_MsrpGroupedProduct' => 1,
+        'Magento_Multishipping' => 1,
+        'Magento_MysqlMq' => 1,
+        'Magento_NewRelicReporting' => 1,
+        'Magento_Captcha' => 1,
+        'Magento_OfflinePayments' => 1,
+        'Magento_SalesRule' => 1,
+        'Magento_PageCache' => 1,
+        'Magento_ProductAlert' => 1,
+        'Magento_Braintree' => 1,
+        'Magento_Persistent' => 1,
+        'Magento_Reports' => 1,
+        'Magento_ProductVideo' => 1,
+        'Klarna_Core' => 1,
+        'Magento_QuoteAnalytics' => 1,
+        'Magento_QuoteGraphQl' => 1,
+        'Magento_ReleaseNotification' => 1,
+        'Magento_Review' => 1,
+        'Magento_RequireJs' => 1,
+        'Magento_SendFriend' => 1,
+        'Magento_ReviewAnalytics' => 1,
+        'Magento_Robots' => 1,
+        'Magento_Rss' => 1,
+        'Amazon_Login' => 1,
+        'Amazon_Payment' => 1,
+        'Magento_SalesAnalytics' => 1,
+        'Magento_SalesGraphQl' => 1,
+        'Magento_SalesInventory' => 1,
+        'Magento_OfflineShipping' => 1,
+        'Klarna_Ordermanagement' => 1,
+        'Magento_UrlRewrite' => 1,
+        'Magento_Elasticsearch6' => 1,
+        'Magento_CustomerAnalytics' => 1,
+        'Magento_Wishlist' => 1,
+        'Magento_SendFriendGraphQl' => 1,
+        'Magento_InventoryShippingAdminUi' => 1,
+        'Magento_Signifyd' => 1,
+        'Magento_Sitemap' => 1,
+        'Magento_CatalogInventoryGraphQl' => 1,
+        'Magento_ConfigurableProductGraphQl' => 1,
+        'Magento_Webapi' => 1,
+        'Magento_SwaggerWebapi' => 1,
+        'Magento_SwaggerWebapiAsync' => 1,
+        'Magento_Swatches' => 1,
+        'Magento_SwatchesGraphQl' => 1,
+        'Magento_SwatchesLayeredNavigation' => 1,
+        'Magento_Tax' => 1,
+        'Magento_TaxGraphQl' => 1,
+        'Magento_TaxImportExport' => 1,
+        'Magento_CheckoutAgreements' => 1,
+        'Magento_ThemeGraphQl' => 1,
+        'Magento_Tinymce3' => 1,
+        'Magento_Translation' => 1,
+        'Magento_GoogleOptimizer' => 1,
+        'Magento_Ups' => 1,
+        'Magento_SampleData' => 1,
+        'Magento_CatalogUrlRewriteGraphQl' => 1,
+        'Magento_AsynchronousOperations' => 1,
+        'Magento_Usps' => 1,
+        'Magento_Bundle' => 1,
+        'Klarna_Kp' => 1,
+        'Magento_Version' => 1,
+        'Magento_Swagger' => 1,
+        'Magento_WebapiAsync' => 1,
+        'Magento_WebapiSecurity' => 1,
+        'Magento_Weee' => 1,
+        'Magento_WeeeGraphQl' => 1,
+        'Magento_CatalogWidget' => 1,
+        'Dotdigitalgroup_Email' => 1,
+        'Magento_WishlistAnalytics' => 1,
+        'Magento_WishlistGraphQl' => 1,
+        'Temando_Shipping' => 1,
+        'Vertex_Tax' => 1
+    ]
+];

+ 17 - 0
app/etc/db_schema.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
+    <table name="patch_list" resource="default" comment="List of data/schema patches">
+        <column xsi:type="int" name="patch_id" identity="true" comment="Patch Auto Increment" />
+        <column xsi:type="varchar" name="patch_name" length="1024" nullable="false" comment="Patch Class Name" />
+        <constraint xsi:type="primary" referenceId="PRIMARY">
+            <column name="patch_id" />
+        </constraint>
+    </table>
+</schema>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 1759 - 0
app/etc/di.xml


+ 19 - 0
app/etc/registration_globlist.php

@@ -0,0 +1,19 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/**
+ * Glob patterns relative to the project root directory, used by
+ * registration.php to generate a list of includes.
+ */
+return [
+    'app/code/*/*/cli_commands.php',
+    'app/code/*/*/registration.php',
+    'app/design/*/*/*/registration.php',
+    'app/i18n/*/*/registration.php',
+    'lib/internal/*/*/registration.php',
+    'lib/internal/*/*/*/registration.php',
+    'setup/src/*/*/registration.php'
+];

+ 5 - 0
app/etc/vendor_path.php

@@ -0,0 +1,5 @@
+<?php
+/**
+ * Path to Composer vendor directory
+ */
+return './vendor';

+ 27 - 0
app/functions.php

@@ -0,0 +1,27 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+/**
+ * Create value-object \Magento\Framework\Phrase
+ * @deprecated The global function __() is now loaded via Magento Framework, the below require is only
+ *             for backwards compatibility reasons and this file will be removed in a future version
+ * @see        Magento\Framework\Phrase\__.php
+ * @SuppressWarnings(PHPMD.ShortMethodName)
+ * @return \Magento\Framework\Phrase
+ */
+if (!function_exists('__')) {
+    function __()
+    {
+        $argc = func_get_args();
+
+        $text = array_shift($argc);
+        if (!empty($argc) && is_array($argc[0])) {
+            $argc = $argc[0];
+        }
+
+        return new \Magento\Framework\Phrase($text, $argc);
+    }
+}

+ 11 - 0
auth.json.sample

@@ -0,0 +1,11 @@
+{
+    "github-oauth": {
+        "github.com": "<github-personal-access-token>"
+    },
+    "http-basic": {
+        "repo.magento.com": {
+            "username": "<public-key>",
+            "password": "<private-key>"
+        }
+    }
+}

+ 8 - 0
bin/.htaccess

@@ -0,0 +1,8 @@
+<IfVersion < 2.4>
+    order allow,deny
+    deny from all
+</IfVersion>
+<IfVersion >= 2.4>
+    Require all denied
+</IfVersion>
+

+ 32 - 0
bin/magento

@@ -0,0 +1,32 @@
+#!/usr/bin/env php
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+if (PHP_SAPI !== 'cli') {
+    echo 'bin/magento must be run as a CLI application';
+    exit(1);
+}
+
+try {
+    require __DIR__ . '/../app/bootstrap.php';
+} catch (\Exception $e) {
+    echo 'Autoload error: ' . $e->getMessage();
+    exit(1);
+}
+try {
+    $handler = new \Magento\Framework\App\ErrorHandler();
+    set_error_handler([$handler, 'handler']);
+    $application = new Magento\Framework\Console\Cli('Magento CLI');
+    $application->run();
+} catch (\Exception $e) {
+    while ($e) {
+        echo $e->getMessage();
+        echo $e->getTraceAsString();
+        echo "\n\n";
+        $e = $e->getPrevious();
+    }
+    exit(Magento\Framework\Console\Cli::RETURN_FAILURE);
+}

+ 72 - 0
composer.json

@@ -0,0 +1,72 @@
+{
+    "name": "magento/project-community-edition",
+    "description": "eCommerce Platform for Growth (Community Edition)",
+    "type": "project",
+    "license": [
+        "OSL-3.0",
+        "AFL-3.0"
+    ],
+    "config": {
+        "preferred-install": "dist",
+        "sort-packages": true
+    },
+    "require": {
+        "magento/product-community-edition": "2.3.1"
+    },
+    "require-dev": {
+        "friendsofphp/php-cs-fixer": "~2.13.0",
+        "lusitanian/oauth": "~0.8.10",
+        "magento/magento2-functional-testing-framework": "~2.3.13",
+        "pdepend/pdepend": "2.5.2",
+        "phpmd/phpmd": "@stable",
+        "phpunit/phpunit": "~6.5.0",
+        "sebastian/phpcpd": "~3.0.0",
+        "squizlabs/php_codesniffer": "3.3.1",
+        "allure-framework/allure-phpunit": "~1.2.0"
+    },
+    "conflict": {
+        "gene/bluefoot": "*"
+    },
+    "autoload": {
+        "psr-4": {
+            "Magento\\Framework\\": "lib/internal/Magento/Framework/",
+            "Magento\\Setup\\": "setup/src/Magento/Setup/",
+            "Magento\\": "app/code/Magento/",
+            "Zend\\Mvc\\Controller\\": "setup/src/Zend/Mvc/Controller/"
+        },
+        "psr-0": {
+            "": [
+                "app/code/",
+                "generated/code/"
+            ]
+        },
+        "files": [
+            "app/etc/NonComposerComponentRegistration.php"
+        ],
+        "exclude-from-classmap": [
+            "**/dev/**",
+            "**/update/**",
+            "**/Test/**"
+        ]
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Magento\\Sniffs\\": "dev/tests/static/framework/Magento/Sniffs/",
+            "Magento\\Tools\\": "dev/tools/Magento/Tools/",
+            "Magento\\Tools\\Sanity\\": "dev/build/publication/sanity/Magento/Tools/Sanity/",
+            "Magento\\TestFramework\\Inspection\\": "dev/tests/static/framework/Magento/TestFramework/Inspection/",
+            "Magento\\TestFramework\\Utility\\": "dev/tests/static/framework/Magento/TestFramework/Utility/"
+        }
+    },
+    "version": "2.3.1",
+    "minimum-stability": "stable",
+    "repositories": [
+        {
+            "type": "composer",
+            "url": "https://repo.magento.com/"
+        }
+    ],
+    "extra": {
+        "magento-force": "override"
+    }
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 19832 - 0
composer.lock


+ 8 - 0
dev/.htaccess

@@ -0,0 +1,8 @@
+<IfVersion < 2.4>
+    order allow,deny
+    deny from all
+</IfVersion>
+<IfVersion >= 2.4>
+    Require all denied
+</IfVersion>
+

+ 11 - 0
dev/tests/acceptance/.gitignore

@@ -0,0 +1,11 @@
+.idea
+.env
+.htaccess
+codeception.yml
+tests/_output/*
+tests/functional.suite.yml
+tests/functional/Magento/FunctionalTest/_generated
+vendor/*
+mftf.log
+/.credentials.example
+/utils/

+ 11 - 0
dev/tests/acceptance/.htaccess.sample

@@ -0,0 +1,11 @@
+##############################################
+## Allow access to command.php
+    <FilesMatch "command.php">
+        <IfVersion < 2.4>
+            order allow,deny
+            allow from all
+        </IfVersion>
+        <IfVersion >= 2.4>
+            Require all granted
+        </IfVersion>
+    </FilesMatch>

+ 9 - 0
dev/tests/acceptance/tests/_bootstrap.php

@@ -0,0 +1,9 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+//TODO remove this file once MFTF is fully decoupled from Magento
+// Need to load in the root level autload file
+require_once realpath(dirname(__DIR__) . "/../../../vendor/autoload.php");

BIN
dev/tests/acceptance/tests/_data/LargerThan2MB.jpg


BIN
dev/tests/acceptance/tests/_data/adobe-base.jpg


BIN
dev/tests/acceptance/tests/_data/adobe-small.jpg


BIN
dev/tests/acceptance/tests/_data/adobe-thumb.jpg


BIN
dev/tests/acceptance/tests/_data/bmp.bmp


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 4 - 0
dev/tests/acceptance/tests/_data/catalog_products.csv


+ 1 - 0
dev/tests/acceptance/tests/_data/dump.sql

@@ -0,0 +1 @@
+/* Replace this file with actual dump of your database */

+ 0 - 0
dev/tests/acceptance/tests/_data/empty.jpg


BIN
dev/tests/acceptance/tests/_data/gif.gif


BIN
dev/tests/acceptance/tests/_data/ico.ico


+ 4 - 0
dev/tests/acceptance/tests/_data/import_updated.csv

@@ -0,0 +1,4 @@
+product_websites,store_view_code,attribute_set_code,product_type,categories,sku,price,name,url_key
+base,,Default,simple,Default Category/category-admin,productformagetwo68980,123,productformagetwo68980,productformagetwo68980
+,en,Default,simple,,productformagetwo68980,,productformagetwo68980-english,productformagetwo68980-english
+,nl,Default,simple,,productformagetwo68980,,productformagetwo68980-dutch,productformagetwo68980-dutch

BIN
dev/tests/acceptance/tests/_data/jpg.jpg


BIN
dev/tests/acceptance/tests/_data/large.jpg


BIN
dev/tests/acceptance/tests/_data/lorem_ipsum.docx


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 9 - 0
dev/tests/acceptance/tests/_data/lorem_ipsum.txt


BIN
dev/tests/acceptance/tests/_data/m-logo.gif


BIN
dev/tests/acceptance/tests/_data/magento-again.jpg


BIN
dev/tests/acceptance/tests/_data/magento-logo.png


BIN
dev/tests/acceptance/tests/_data/magento.jpg


BIN
dev/tests/acceptance/tests/_data/magento2.jpg


BIN
dev/tests/acceptance/tests/_data/magento3.jpg


BIN
dev/tests/acceptance/tests/_data/magentoStage.jpg


BIN
dev/tests/acceptance/tests/_data/medium.jpg


BIN
dev/tests/acceptance/tests/_data/png.png


BIN
dev/tests/acceptance/tests/_data/small.jpg


+ 20 - 0
dev/tests/acceptance/tests/_data/svg.svg

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 16.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 width="298.367px" height="298.365px" viewBox="0 0 298.367 298.365" enable-background="new 0 0 298.367 298.365"
+	 xml:space="preserve">
+<g>
+	<path fill="#13110C" d="M131.233,193.113H75.177c-24.224,0-43.931-19.708-43.931-43.932s19.707-43.93,43.931-43.93h56.056v-30
+		H75.177c-40.831,0-73.931,33.1-73.931,73.93c0,40.832,33.1,73.932,73.931,73.932h56.056V193.113z"/>
+	<path fill="#13110C" d="M224.222,75.252h-57.088v30h57.088c24.224,0,43.931,19.706,43.931,43.93s-19.707,43.932-43.931,43.932
+		h-57.088v30h57.088c40.831,0,73.931-33.1,73.931-73.932C298.152,108.351,265.053,75.252,224.222,75.252z"/>
+</g>
+<g>
+	<path fill="#13110C" d="M192.391,164.182h-86.414c-8.284,0-15-6.716-15-15s6.716-15,15-15h86.414c8.284,0,15,6.716,15,15
+		S200.675,164.182,192.391,164.182z"/>
+</g>
+<script type="text/javascript">
+    alert('This app is probably vulnerable to XSS attacks!');
+  </script>
+</svg>

BIN
dev/tests/acceptance/tests/_data/test-IMAGE_123,456.789.jpg


+ 23 - 0
dev/tests/acceptance/tests/_suite/WYSIWYGDisabledSuite.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+<suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Suite/etc/suiteSchema.xsd">
+    <suite name="WYSIWYGDisabledSuite">
+        <before>
+            <magentoCLI stepKey="disableWYSYWYG" command="config:set cms/wysiwyg/enabled disabled" />
+        </before>
+        <include>
+            <group name="WYSIWYGDisabled"/>
+        </include>
+        <exclude>
+            <group name="skip"/>
+        </exclude>
+        <after>
+            <magentoCLI stepKey="disableWYSYWYG" command="config:set cms/wysiwyg/enabled enabled" />
+        </after>
+    </suite>
+</suites>

+ 25 - 0
dev/tests/acceptance/tests/_suite/suite.xml.sample

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+<suites xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Suite/etc/suiteSchema.xsd">
+    <suite name="sample">
+        <before>
+            <createData entity="defaultCategory" stepKey="createCategory"/>
+        </before>
+        <after>
+            <deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
+        </after>
+        <include>
+            <module name="Catalog" />
+            <group name="login" />
+        </include>
+        <exclude>
+            <test name="AddImageToWYSIWYGCatalogEditor"/>
+            <module name="Catalog" file="AdminCreateCategoryTest.xml" />
+        </exclude>
+    </suite>
+</suites>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 48 - 0
dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductCatalogSearch/LICENSE.txt


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 48 - 0
dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductCatalogSearch/LICENSE_AFL.txt


+ 3 - 0
dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductCatalogSearch/README.md

@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_ConfigurableProductCatalogSearch** Module.

+ 30 - 0
dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductCatalogSearch/Test/EndToEndB2CGuestUserTest.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
+    <test name="EndToEndB2CGuestUserTest">
+        <!-- Search configurable product -->
+        <comment userInput="Search configurable product" stepKey="commentSearchConfigurableProduct" after="searchAssertSimpleProduct2ImageNotDefault" />
+        <actionGroup ref="StorefrontCheckCategoryConfigurableProduct" stepKey="searchAssertFilterCategoryConfigProduct" after="commentSearchConfigurableProduct">
+            <argument name="product" value="$$createConfigProduct$$"/>
+            <argument name="optionProduct" value="$$createConfigChildProduct1$$"/>
+        </actionGroup>
+        <!-- @TODO: Move Image check to action group after MQE-697 is fixed -->
+        <grabAttributeFrom selector="{{StorefrontCategoryProductSection.ProductImageByName($$createConfigProduct.name$$)}}" userInput="src" stepKey="searchGrabConfigProductImageSrc" after="searchAssertFilterCategoryConfigProduct"/>
+        <assertNotRegExp expected="'/placeholder\/small_image\.jpg/'" actual="$searchGrabConfigProductImageSrc" stepKey="searchAssertConfigProductImageNotDefault" after="searchGrabConfigProductImageSrc"/>
+        <click selector="{{StorefrontCategoryProductSection.ProductTitleByName($$createConfigProduct.name$$)}}" stepKey="searchClickConfigProductView" after="searchAssertConfigProductImageNotDefault"/>
+        <actionGroup ref="StorefrontCheckConfigurableProduct" stepKey="searchAssertConfigProductPage" after="searchClickConfigProductView">
+            <argument name="product" value="$$createConfigProduct$$"/>
+            <argument name="optionProduct" value="$$createConfigChildProduct1$$"/>
+        </actionGroup>
+        <!-- @TODO: Move Image check to action group after MQE-697 is fixed -->
+        <grabAttributeFrom selector="{{StorefrontProductInfoMainSection.productImage}}" userInput="src" stepKey="searchGrabConfigProductPageImageSrc" after="searchAssertConfigProductPage"/>
+        <assertNotRegExp expected="'/placeholder\/image\.jpg/'" actual="$searchGrabConfigProductPageImageSrc" stepKey="searchAssertConfigProductPageImageNotDefault" after="searchGrabConfigProductPageImageSrc"/>
+    </test>
+</tests>

+ 30 - 0
dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductCatalogSearch/Test/EndToEndB2CLoggedInUserTest.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
+    <test name="EndToEndB2CLoggedInUserTest">
+        <!-- Search configurable product -->
+        <comment userInput="Search configurable product" stepKey="commentSearchConfigurableProduct" after="searchAssertSimpleProduct2ImageNotDefault" />
+        <actionGroup ref="StorefrontCheckCategoryConfigurableProduct" stepKey="searchAssertFilterCategoryConfigProduct" after="commentSearchConfigurableProduct">
+            <argument name="product" value="$$createConfigProduct$$"/>
+            <argument name="optionProduct" value="$$createConfigChildProduct1$$"/>
+        </actionGroup>
+        <!-- @TODO: Move Image check to action group after MQE-697 is fixed -->
+        <grabAttributeFrom selector="{{StorefrontCategoryProductSection.ProductImageByName($$createConfigProduct.name$$)}}" userInput="src" stepKey="searchGrabConfigProductImageSrc" after="searchAssertFilterCategoryConfigProduct"/>
+        <assertNotRegExp expected="'/placeholder\/small_image\.jpg/'" actual="$searchGrabConfigProductImageSrc" stepKey="searchAssertConfigProductImageNotDefault" after="searchGrabConfigProductImageSrc"/>
+        <click selector="{{StorefrontCategoryProductSection.ProductTitleByName($$createConfigProduct.name$$)}}" stepKey="searchClickConfigProductView" after="searchAssertConfigProductImageNotDefault"/>
+        <actionGroup ref="StorefrontCheckConfigurableProduct" stepKey="searchAssertConfigProductPage" after="searchClickConfigProductView">
+            <argument name="product" value="$$createConfigProduct$$"/>
+            <argument name="optionProduct" value="$$createConfigChildProduct1$$"/>
+        </actionGroup>
+        <!-- @TODO: Move Image check to action group after MQE-697 is fixed -->
+        <grabAttributeFrom selector="{{StorefrontProductInfoMainSection.productImage}}" userInput="src" stepKey="searchGrabConfigProductPageImageSrc" after="searchAssertConfigProductPage"/>
+        <assertNotRegExp expected="'/placeholder\/image\.jpg/'" actual="$searchGrabConfigProductPageImageSrc" stepKey="searchAssertConfigProductPageImageNotDefault" after="searchGrabConfigProductPageImageSrc"/>
+    </test>
+</tests>

+ 35 - 0
dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductWishlist/ActionGroup/StorefrontCustomerWishlistActionGroup.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+              xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/actionGroupSchema.xsd">
+    <!-- Check configurable product in wishlist -->
+    <actionGroup name="StorefrontCustomerCheckConfigurableProductInWishlist">
+        <arguments>
+            <argument name="productVar"/>
+            <argument name="optionProductVar" />
+        </arguments>
+        <waitForElement selector="{{StorefrontCustomerWishlistProductSection.ProductTitleByName(productVar.name)}}" time="30" stepKey="assertWishlistProductName"/>
+        <see userInput="${{optionProductVar.price}}.00" selector="{{StorefrontCustomerWishlistProductSection.ProductPriceByName(productVar.name)}}" stepKey="AssertWishlistProductPrice"/>
+        <moveMouseOver selector="{{StorefrontCustomerWishlistProductSection.ProductInfoByName(productVar.name)}}" stepKey="wishlistMoveMouseOverProduct" />
+        <seeElement selector="{{StorefrontCustomerWishlistProductSection.ProductAddToCartByName(productVar.name)}}" stepKey="AssertWishlistAddToCart" />
+        <seeElement selector="{{StorefrontCustomerWishlistProductSection.ProductImageByName(productVar.name)}}" stepKey="AssertWishlistProductImage" />
+    </actionGroup>
+
+    <!-- Check configurable product in wishlist sidebar -->
+    <actionGroup name="StorefrontCustomerCheckConfigurableProductInWishlistSidebar">
+        <arguments>
+            <argument name="productVar"/>
+            <argument name="optionProductVar" />
+        </arguments>
+        <waitForElement selector="{{StorefrontCustomerWishlistSidebarSection.ProductTitleByName(productVar.name)}}" time="30" stepKey="assertWishlistSidebarProductName"/>
+        <see userInput="${{optionProductVar.price}}.00" selector="{{StorefrontCustomerWishlistSidebarSection.ProductPriceByName(productVar.name)}}" stepKey="AssertWishlistSidebarProductPrice"/>
+        <seeElement selector="{{StorefrontCustomerWishlistSidebarSection.ProductAddToCartByName(productVar.name)}}" stepKey="AssertWishlistSidebarAddToCart" />
+        <seeElement selector="{{StorefrontCustomerWishlistSidebarSection.ProductImageByName(productVar.name)}}" stepKey="AssertWishlistSidebarProductImage" />
+    </actionGroup>
+</actionGroups>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 48 - 0
dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductWishlist/LICENSE.txt


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 48 - 0
dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductWishlist/LICENSE_AFL.txt


+ 3 - 0
dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductWishlist/README.md

@@ -0,0 +1,3 @@
+# Magento 2 Functional Tests
+
+The Functional Tests Module for **Magento_ConfigurableProduct** and **Magento_Wishlist** Modules.

+ 29 - 0
dev/tests/acceptance/tests/functional/Magento/FunctionalTest/ConfigurableProductWishlist/Test/EndToEndB2CLoggedInUserTest.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ /**
+  * Copyright © Magento, Inc. All rights reserved.
+  * See COPYING.txt for license details.
+  */
+-->
+
+<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
+    <test name="EndToEndB2CLoggedInUserTest">
+        <!-- Step 5: Add products to wishlist -->
+        <!-- Add Configurable Product to wishlist -->
+        <comment userInput="Add Configurable Product to wishlist" stepKey="commentAddConfigurableProductToWishlist" before="endOfAddingProductsToWishlist" />
+        <click selector="{{StorefrontHeaderSection.NavigationCategoryByName($$createCategory.name$$)}}" after="commentAddConfigurableProductToWishlist" stepKey="wishlistGotoCategory3"/>
+        <click selector="{{StorefrontCategoryProductSection.ProductTitleByName($$createConfigProduct.name$$)}}" after="wishlistGotoCategory3" stepKey="wishlistClickConfigurableProduct"/>
+        <actionGroup ref="StorefrontCustomerAddProductToWishlistActionGroup" after="wishlistClickConfigurableProduct" stepKey="wishlistAddConfigurableProductToWishlist">
+            <argument name="productVar" value="$$createConfigProduct$$"/>
+        </actionGroup>
+        <actionGroup ref="StorefrontCustomerCheckConfigurableProductInWishlist" after="wishlistAddConfigurableProductToWishlist" stepKey="wishlistCheckConfigurableProductInWishlist">
+            <argument name="productVar" value="$$createConfigProduct$$"/>
+            <argument name="optionProductVar" value="$$createConfigChildProduct1$$"/>
+        </actionGroup>
+        <actionGroup ref="StorefrontCustomerCheckConfigurableProductInWishlistSidebar" after="wishlistCheckConfigurableProductInWishlist" stepKey="wishlistCheckConfigurableProductInWishlistSidebar">
+            <argument name="productVar" value="$$createConfigProduct$$"/>
+            <argument name="optionProductVar" value="$$createConfigChildProduct1$$"/>
+        </actionGroup>
+    </test>
+</tests>

+ 3 - 0
dev/tests/api-functional/.gitignore

@@ -0,0 +1,3 @@
+/*.xml
+/var/
+/config/*.php

+ 78 - 0
dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester.php

@@ -0,0 +1,78 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule1\Controller;
+
+use Magento\Framework\App\RequestInterface;
+use Magento\Framework\Stdlib\Cookie\CookieMetadataFactory;
+use Magento\Framework\Stdlib\Cookie\PhpCookieManager;
+
+/**
+ * Controller for testing the CookieManager.
+ *
+ */
+abstract class CookieTester implements \Magento\Framework\App\ActionInterface
+{
+    /** @var PhpCookieManager */
+    protected $cookieManager;
+
+    /** @var  CookieMetadataFactory */
+    protected $cookieMetadataFactory;
+
+    /**
+     * @var \Magento\Framework\App\ResponseInterface
+     */
+    protected $_response;
+
+    /**
+     * @var
+     */
+    protected $request;
+
+    /**
+     * @param \Magento\Framework\App\Action\Context $context
+     * @param PhpCookieManager $cookieManager
+     * @param CookieMetadataFactory $cookieMetadataFactory
+     */
+    public function __construct(
+        \Magento\Framework\App\Action\Context $context,
+        PhpCookieManager $cookieManager,
+        CookieMetadataFactory $cookieMetadataFactory
+    ) {
+        $this->cookieManager = $cookieManager;
+        $this->cookieMetadataFactory = $cookieMetadataFactory;
+        $this->_response = $context->getResponse();
+        $this->request = $context->getRequest();
+    }
+
+    /**
+     * Retrieve cookie metadata factory
+     */
+    protected function getCookieMetadataFactory()
+    {
+        return $this->cookieMetadataFactory;
+    }
+
+    /**
+     * Retrieve cookie metadata factory
+     */
+    protected function getCookieManager()
+    {
+        return $this->cookieManager;
+    }
+
+    /**
+     * Dispatch request
+     *
+     * @param RequestInterface $request
+     * @return \Magento\Framework\App\ResponseInterface
+     */
+    public function dispatch(RequestInterface $request)
+    {
+        $this->request = $request;
+        $result = $this->execute();
+        return $result ? $result : $this->_response;
+    }
+}

+ 25 - 0
dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/DeleteCookie.php

@@ -0,0 +1,25 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule1\Controller\CookieTester;
+
+use \Magento\Framework\App\RequestInterface;
+
+/**
+ * Controller to test deletion of a cookie
+ */
+class DeleteCookie extends \Magento\TestModule1\Controller\CookieTester
+{
+    /**
+     *
+     * @return \Magento\Framework\App\ResponseInterface
+     */
+    public function execute()
+    {
+        $cookieName = $this->request->getParam('cookie_name');
+        $this->getCookieManager()->deleteCookie($cookieName);
+        return $this->_response;
+    }
+}

+ 53 - 0
dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetPublicCookie.php

@@ -0,0 +1,53 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule1\Controller\CookieTester;
+
+use \Magento\Framework\App\RequestInterface;
+
+/**
+ */
+class SetPublicCookie extends \Magento\TestModule1\Controller\CookieTester
+{
+    /**
+     * Sets a public cookie with data from url parameters
+     *
+     * @return \Magento\Framework\App\ResponseInterface
+     */
+    public function execute()
+    {
+        $publicCookieMetadata = $this->getCookieMetadataFactory()->createPublicCookieMetadata();
+
+        $cookieDomain = $this->request->getParam('cookie_domain');
+        if ($cookieDomain !== null) {
+            $publicCookieMetadata->setDomain($cookieDomain);
+        }
+
+        $cookiePath = $this->request->getParam('cookie_path');
+        if ($cookiePath !== null) {
+            $publicCookieMetadata->setPath($cookiePath);
+        }
+
+        $cookieDuration = $this->request->getParam('cookie_duration');
+        if ($cookieDuration !== null) {
+            $publicCookieMetadata->setDuration($cookieDuration);
+        }
+
+        $httpOnly = $this->request->getParam('cookie_httponly');
+        if ($httpOnly !== null) {
+            $publicCookieMetadata->setHttpOnly($httpOnly);
+        }
+
+        $secure = $this->request->getParam('cookie_secure');
+        if ($secure !== null) {
+            $publicCookieMetadata->setSecure($secure);
+        }
+
+        $cookieName = $this->request->getParam('cookie_name');
+        $cookieValue = $this->request->getParam('cookie_value');
+        $this->getCookieManager()->setPublicCookie($cookieName, $cookieValue, $publicCookieMetadata);
+        return $this->_response;
+    }
+}

+ 37 - 0
dev/tests/api-functional/_files/Magento/TestModule1/Controller/CookieTester/SetSensitiveCookie.php

@@ -0,0 +1,37 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule1\Controller\CookieTester;
+
+use \Magento\Framework\App\RequestInterface;
+
+/**
+ */
+class SetSensitiveCookie extends \Magento\TestModule1\Controller\CookieTester
+{
+    /**
+     * Sets a sensitive cookie with data from url parameters
+     *
+     * @return \Magento\Framework\App\ResponseInterface
+     */
+    public function execute()
+    {
+        $sensitiveCookieMetadata = $this->getCookieMetadataFactory()->createSensitiveCookieMetadata();
+
+        $cookieDomain = $this->request->getParam('cookie_domain');
+        if ($cookieDomain !== null) {
+            $sensitiveCookieMetadata->setDomain($cookieDomain);
+        }
+        $cookiePath = $this->request->getParam('cookie_domain');
+        if ($cookiePath !== null) {
+            $sensitiveCookieMetadata->setPath($cookiePath);
+        }
+
+        $cookieName = $this->request->getParam('cookie_name');
+        $cookieValue = $this->request->getParam('cookie_value');
+        $this->getCookieManager()->setSensitiveCookie($cookieName, $cookieValue, $sensitiveCookieMetadata);
+        return $this->_response;
+    }
+}

+ 106 - 0
dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/AllSoapAndRest.php

@@ -0,0 +1,106 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule1\Service\V1;
+
+use Magento\TestModuleMSC\Model\Data\CustomAttributeDataObjectFactory;
+use Magento\TestModule1\Service\V1\Entity\Item;
+use Magento\TestModule1\Service\V1\Entity\ItemFactory;
+
+class AllSoapAndRest implements \Magento\TestModule1\Service\V1\AllSoapAndRestInterface
+{
+    /**
+     * @var ItemFactory
+     */
+    protected $itemFactory;
+
+    /**
+     * @var CustomAttributeDataObjectFactory
+     */
+    protected $customAttributeDataObjectFactory;
+
+    /**
+     * @param ItemFactory $itemFactory
+     * @param CustomAttributeDataObjectFactory $customAttributeNestedDataObjectFactory
+     */
+    public function __construct(
+        ItemFactory $itemFactory,
+        CustomAttributeDataObjectFactory $customAttributeNestedDataObjectFactory
+    ) {
+        $this->itemFactory = $itemFactory;
+        $this->customAttributeDataObjectFactory = $customAttributeNestedDataObjectFactory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function item($itemId)
+    {
+        return $this->itemFactory->create()->setItemId($itemId)->setName('testProduct1');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function items()
+    {
+        $result1 = $this->itemFactory->create()->setItemId(1)->setName('testProduct1');
+        $result2 = $this->itemFactory->create()->setItemId(2)->setName('testProduct2');
+
+        return [$result1, $result2];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function create($name)
+    {
+        return $this->itemFactory->create()->setItemId(rand())->setName($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function update(Item $entityItem)
+    {
+        return $this->itemFactory->create()->setItemId($entityItem->getItemId())
+            ->setName('Updated' . $entityItem->getName());
+    }
+
+    public function testOptionalParam($name = null)
+    {
+        if ($name === null) {
+            return $this->itemFactory->create()->setItemId(3)->setName('No Name');
+        } else {
+            return $this->itemFactory->create()->setItemId(3)->setName($name);
+        }
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function itemAnyType(Item $item)
+    {
+        return $item;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getPreconfiguredItem()
+    {
+        $customAttributeDataObject = $this->customAttributeDataObjectFactory->create()
+            ->setName('nameValue')
+            ->setCustomAttribute('custom_attribute_int', 1);
+
+        $item = $this->itemFactory->create()
+            ->setItemId(1)
+            ->setName('testProductAnyType')
+            ->setCustomAttribute('custom_attribute_data_object', $customAttributeDataObject)
+            ->setCustomAttribute('custom_attribute_string', 'someStringValue');
+
+        return $item;
+    }
+}

+ 51 - 0
dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/AllSoapAndRestInterface.php

@@ -0,0 +1,51 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule1\Service\V1;
+
+use Magento\TestModule1\Service\V1\Entity\Item;
+
+interface AllSoapAndRestInterface
+{
+    /**
+     * @param int $itemId
+     * @return \Magento\TestModule1\Service\V1\Entity\Item
+     */
+    public function item($itemId);
+
+    /**
+     * @param string $name
+     * @return \Magento\TestModule1\Service\V1\Entity\Item
+     */
+    public function create($name);
+
+    /**
+     * @param \Magento\TestModule1\Service\V1\Entity\Item $entityItem
+     * @return \Magento\TestModule1\Service\V1\Entity\Item
+     */
+    public function update(Item $entityItem);
+
+    /**
+     * @return \Magento\TestModule1\Service\V1\Entity\Item[]
+     */
+    public function items();
+
+    /**
+     * @param string $name
+     * @return \Magento\TestModule1\Service\V1\Entity\Item
+     */
+    public function testOptionalParam($name = null);
+
+    /**
+     * @param \Magento\TestModule1\Service\V1\Entity\Item $entityItem
+     * @return \Magento\TestModule1\Service\V1\Entity\Item
+     */
+    public function itemAnyType(Item $entityItem);
+
+    /**
+     * @return \Magento\TestModule1\Service\V1\Entity\Item
+     */
+    public function getPreconfiguredItem();
+}

+ 64 - 0
dev/tests/api-functional/_files/Magento/TestModule1/Service/V1/Entity/Item.php

@@ -0,0 +1,64 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule1\Service\V1\Entity;
+
+class Item extends \Magento\Framework\Api\AbstractExtensibleObject
+{
+    /**#@+
+     * Custom attribute code constants
+     */
+    const CUSTOM_ATTRIBUTE_1 = 'custom_attribute1';
+    const CUSTOM_ATTRIBUTE_2 = 'custom_attribute2';
+    const CUSTOM_ATTRIBUTE_3 = 'custom_attribute3';
+    /**#@-*/
+
+    /**
+     * @return int
+     */
+    public function getItemId()
+    {
+        return $this->_data['item_id'];
+    }
+
+    /**
+     * @param int $itemId
+     * @return $this
+     */
+    public function setItemId($itemId)
+    {
+        return $this->setData('item_id', $itemId);
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->_data['name'];
+    }
+
+    /**
+     * @param string $name
+     * @return $this
+     */
+    public function setName($name)
+    {
+        return $this->setData('name', $name);
+    }
+
+    /**
+     * Template method used to configure the attribute codes for the custom attributes
+     *
+     * @return string[]
+     */
+    protected function getCustomAttributesCodes()
+    {
+        return array_merge(
+            parent::getCustomAttributesCodes(),
+            [self::CUSTOM_ATTRIBUTE_1, self::CUSTOM_ATTRIBUTE_2, self::CUSTOM_ATTRIBUTE_3]
+        );
+    }
+}

+ 86 - 0
dev/tests/api-functional/_files/Magento/TestModule1/Service/V2/AllSoapAndRest.php

@@ -0,0 +1,86 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule1\Service\V2;
+
+use Magento\TestModule1\Service\V2\Entity\Item;
+use Magento\TestModule1\Service\V2\Entity\ItemFactory;
+
+class AllSoapAndRest implements \Magento\TestModule1\Service\V2\AllSoapAndRestInterface
+{
+    /**
+     * @var ItemFactory
+     */
+    protected $itemFactory;
+
+    /**
+     * @param ItemFactory $itemFactory
+     */
+    public function __construct(ItemFactory $itemFactory)
+    {
+        $this->itemFactory = $itemFactory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function item($id)
+    {
+        return $this->itemFactory->create()->setId($id)->setName('testProduct1')->setPrice('1');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function items($filters = [], $sortOrder = 'ASC')
+    {
+        $result = [];
+        $firstItem = $this->itemFactory->create()->setId(1)->setName('testProduct1')->setPrice('1');
+        $secondItem = $this->itemFactory->create()->setId(2)->setName('testProduct2')->setPrice('2');
+
+        /** Simple filtration implementation */
+        if (!empty($filters)) {
+            /** @var \Magento\Framework\Api\Filter $filter */
+            foreach ($filters as $filter) {
+                if ('id' == $filter->getField() && $filter->getValue() == 1) {
+                    $result[] = $firstItem;
+                } elseif ('id' == $filter->getField() && $filter->getValue() == 2) {
+                    $result[] = $secondItem;
+                }
+            }
+        } else {
+            /** No filter is specified. */
+            $result = [$firstItem, $secondItem];
+        }
+        return $result;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function create($name)
+    {
+        return $this->itemFactory->create()->setId(rand())->setName($name)->setPrice('10');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function update(Item $entityItem)
+    {
+        return $this->itemFactory->create()
+            ->setId($entityItem->getId())
+            ->setName('Updated' . $entityItem->getName())
+            ->setPrice('5');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function delete($id)
+    {
+        return $this->itemFactory->create()->setId($id)->setName('testProduct1')->setPrice('1');
+    }
+}

+ 52 - 0
dev/tests/api-functional/_files/Magento/TestModule1/Service/V2/AllSoapAndRestInterface.php

@@ -0,0 +1,52 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule1\Service\V2;
+
+use Magento\TestModule1\Service\V2\Entity\Item;
+
+interface AllSoapAndRestInterface
+{
+    /**
+     * Get item.
+     *
+     * @param int $id
+     * @return \Magento\TestModule1\Service\V2\Entity\Item
+     */
+    public function item($id);
+
+    /**
+     * Create item.
+     *
+     * @param string $name
+     * @return \Magento\TestModule1\Service\V2\Entity\Item
+     */
+    public function create($name);
+
+    /**
+     * Update item.
+     *
+     * @param \Magento\TestModule1\Service\V2\Entity\Item $entityItem
+     * @return \Magento\TestModule1\Service\V2\Entity\Item
+     */
+    public function update(Item $entityItem);
+
+    /**
+     * Retrieve a list of items.
+     *
+     * @param \Magento\Framework\Api\Filter[] $filters
+     * @param string $sortOrder
+     * @return \Magento\TestModule1\Service\V2\Entity\Item[]
+     */
+    public function items($filters = [], $sortOrder = 'ASC');
+
+    /**
+     * Delete an item.
+     *
+     * @param int $id
+     * @return \Magento\TestModule1\Service\V2\Entity\Item
+     */
+    public function delete($id);
+}

+ 60 - 0
dev/tests/api-functional/_files/Magento/TestModule1/Service/V2/Entity/Item.php

@@ -0,0 +1,60 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule1\Service\V2\Entity;
+
+class Item extends \Magento\Framework\Api\AbstractExtensibleObject
+{
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->_data['id'];
+    }
+
+    /**
+     * @param int $id
+     * @return $this
+     */
+    public function setId($id)
+    {
+        return $this->setData('id', $id);
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->_data['name'];
+    }
+
+    /**
+     * @param string $name
+     * @return $this
+     */
+    public function setName($name)
+    {
+        return $this->setData('name', $name);
+    }
+
+    /**
+     * @return string
+     */
+    public function getPrice()
+    {
+        return $this->_data['price'];
+    }
+
+    /**
+     * @param string $price
+     * @return $this
+     */
+    public function setPrice($price)
+    {
+        return $this->setData('price', $price);
+    }
+}

+ 20 - 0
dev/tests/api-functional/_files/Magento/TestModule1/etc/acl.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Acl/etc/acl.xsd">
+    <acl>
+        <resources>
+            <resource id="Magento_Backend::admin">
+                <resource id="Magento_TestModule1::all" title="TestModule1" sortOrder="1">
+                    <resource id="Magento_TestModule1::resource1" title="Resource1" sortOrder="20"/>
+                    <resource id="Magento_TestModule1::resource2" title="Resource2" sortOrder="10"/>
+                    <resource id="Magento_TestModule1::resource3" title="Resource3" sortOrder="30"/>
+                </resource>
+            </resource>
+        </resources>
+    </acl>
+</config>

+ 23 - 0
dev/tests/api-functional/_files/Magento/TestModule1/etc/di.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
+    <preference for="Magento\TestModule1\Service\V1\AllSoapAndRestInterface" type="Magento\TestModule1\Service\V1\AllSoapAndRest" />
+    <preference for="Magento\TestModule1\Service\V2\AllSoapAndRestInterface" type="Magento\TestModule1\Service\V2\AllSoapAndRest" />
+
+    <virtualType name="Magento\TestModule1\Service\Config\TestModule1MetadataConfig" type="Magento\Framework\Api\ExtensionAttribute\Config\MetadataConfig">
+        <arguments>
+            <argument name="attributeMetadataBuilder" xsi:type="object">Magento\TestModuleMSC\Model\Data\Eav\AttributeMetadataBuilder</argument>
+            <argument name="dataObjectClassName" xsi:type="string">Magento\TestModule1\Service\V1\Entity\Item</argument>
+        </arguments>
+    </virtualType>
+    <type name="Magento\TestModule1\Service\V1\Entity\ItemBuilder">
+        <arguments>
+            <argument name="metadataService" xsi:type="object">Magento\TestModule1\Service\Config\TestModule1MetadataConfig</argument>
+        </arguments>
+    </type>
+</config>

+ 17 - 0
dev/tests/api-functional/_files/Magento/TestModule1/etc/extension_attributes.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Api/etc/extension_attributes.xsd">
+    <extension_attributes for="Magento\TestModule1\Service\V1\Entity\Item">
+        <attribute code="custom_attribute_data_object" type="Magento\TestModuleMSC\Model\Data\CustomAttributeDataObject" />
+        <attribute code="custom_attribute_string" type="string" />
+    </extension_attributes>
+    <extension_attributes for="Magento\TestModuleMSC\Model\Data\CustomAttributeDataObject">
+        <attribute code="custom_attribute_nested" type="Magento\TestModuleMSC\Model\Data\CustomAttributeNestedDataObject" />
+        <attribute code="custom_attribute_int" type="int" />
+    </extension_attributes>
+</config>

+ 14 - 0
dev/tests/api-functional/_files/Magento/TestModule1/etc/frontend/routes.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
+    <router id="standard">
+        <route id="testmoduleone" frontName="testmoduleone">
+            <module name="Magento_TestModule1" />
+        </route>
+    </router>
+</config>

+ 10 - 0
dev/tests/api-functional/_files/Magento/TestModule1/etc/module.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
+    <module name="Magento_TestModule1" />
+</config>

+ 106 - 0
dev/tests/api-functional/_files/Magento/TestModule1/etc/webapi.xml

@@ -0,0 +1,106 @@
+<?xml version="1.0"?>
+<!--
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+-->
+<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
+
+    <route method="GET" url="/V1/testmodule1/overwritten">
+        <service class="Magento\TestModule1\Service\V1\AllSoapAndRestInterface" method="item" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource1" />
+        </resources>
+        <data>
+            <parameter name="itemId" force="true">-55</parameter>
+        </data>
+    </route>
+
+    <route method="POST" url="/V1/testmodule1/testOptionalParam">
+        <service class="Magento\TestModule1\Service\V1\AllSoapAndRestInterface" method="testOptionalParam" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource1" />
+        </resources>
+        <data>
+            <parameter name="name">Default Name</parameter>
+        </data>
+    </route>
+
+    <route method="GET" url="/V1/testmodule1/:itemId">
+        <service class="Magento\TestModule1\Service\V1\AllSoapAndRestInterface" method="item" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource1" />
+        </resources>
+    </route>
+    <route method="GET" url="/V1/testmodule1">
+        <service class="Magento\TestModule1\Service\V1\AllSoapAndRestInterface" method="items" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource2" />
+        </resources>
+    </route>
+    <route method="POST" url="/V1/testmodule1">
+        <service class="Magento\TestModule1\Service\V1\AllSoapAndRestInterface" method="create" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource3" />
+        </resources>
+    </route>
+    <route method="PUT" url="/V1/testmodule1/:itemId">
+        <service class="Magento\TestModule1\Service\V1\AllSoapAndRestInterface" method="update" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource1" />
+            <resource ref="Magento_TestModule1::resource2" />
+        </resources>
+    </route>
+    <route method="GET" url="/V1/testmodule1/resource1/:itemId">
+        <service class="Magento\TestModule1\Service\V1\AllSoapAndRestInterface" method="item" />
+        <resources>
+            <resource ref="anonymous" />
+        </resources>
+    </route>
+    <route method="POST" url="/V1/testmodule1/itemAnyType">
+        <service class="Magento\TestModule1\Service\V1\AllSoapAndRestInterface" method="itemAnyType" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource1" />
+            <resource ref="Magento_TestModule1::resource2" />
+        </resources>
+    </route>
+    <route method="GET" url="/V1/testmodule1/itemPreconfigured">
+        <service class="Magento\TestModule1\Service\V1\AllSoapAndRestInterface" method="getPreconfiguredItem" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource1" />
+            <resource ref="Magento_TestModule1::resource2" />
+        </resources>
+    </route>
+    <route method="GET" url="/V2/testmodule1/:id">
+        <service class="Magento\TestModule1\Service\V2\AllSoapAndRestInterface" method="item" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource1" />
+        </resources>
+    </route>
+    <route method="GET" url="/V2/testmodule1">
+        <service class="Magento\TestModule1\Service\V2\AllSoapAndRestInterface" method="items" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource2" />
+        </resources>
+    </route>
+    <route method="POST" url="/V2/testmodule1">
+        <service class="Magento\TestModule1\Service\V2\AllSoapAndRestInterface" method="create" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource3" />
+        </resources>
+    </route>
+    <route method="PUT" url="/V2/testmodule1/:id">
+        <service class="Magento\TestModule1\Service\V2\AllSoapAndRestInterface" method="update" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource1" />
+            <resource ref="Magento_TestModule1::resource2" />
+        </resources>
+    </route>
+    <route method="DELETE" url="/V2/testmodule1/:id">
+        <service class="Magento\TestModule1\Service\V2\AllSoapAndRestInterface" method="delete" />
+        <resources>
+            <resource ref="Magento_TestModule1::resource1" />
+        </resources>
+    </route>
+</routes>

+ 12 - 0
dev/tests/api-functional/_files/Magento/TestModule1/registration.php

@@ -0,0 +1,12 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+use Magento\Framework\Component\ComponentRegistrar;
+
+$registrar = new ComponentRegistrar();
+if ($registrar->getPath(ComponentRegistrar::MODULE, 'Magento_TestModule1') === null) {
+    ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Magento_TestModule1', __DIR__);
+}

+ 43 - 0
dev/tests/api-functional/_files/Magento/TestModule2/Service/V1/Entity/Item.php

@@ -0,0 +1,43 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule2\Service\V1\Entity;
+
+class Item extends \Magento\Framework\Api\AbstractExtensibleObject
+{
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->_data['id'];
+    }
+
+    /**
+     * @param int $id
+     * @return $this
+     */
+    public function setId($id)
+    {
+        return $this->setData('id', $id);
+    }
+
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->_data['name'];
+    }
+
+    /**
+     * @param string $name
+     * @return $this
+     */
+    public function setName($name)
+    {
+        return $this->setData('name', $name);
+    }
+}

+ 61 - 0
dev/tests/api-functional/_files/Magento/TestModule2/Service/V1/NoWebApiXml.php

@@ -0,0 +1,61 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule2\Service\V1;
+
+use Magento\TestModule2\Service\V1\Entity\Item;
+use Magento\TestModule2\Service\V1\Entity\ItemFactory;
+
+class NoWebApiXml implements \Magento\TestModule2\Service\V1\NoWebApiXmlInterface
+{
+    /**
+     * @var ItemFactory
+     */
+    protected $itemFactory;
+
+    /**
+     * @param ItemFactory $itemFactory
+     */
+    public function __construct(ItemFactory $itemFactory)
+    {
+        $this->itemFactory = $itemFactory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function item($id)
+    {
+        return $this->itemFactory->create()->setId($id)->setName('testProduct1');
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function items()
+    {
+        $result1 = $this->itemFactory->create()->setId(1)->setName('testProduct1');
+
+        $result2 = $this->itemFactory->create()->setId(2)->setName('testProduct2');
+
+        return [$result1, $result2];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function create($name)
+    {
+        return $this->itemFactory->create()->setId(rand())->setName($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function update(Item $item)
+    {
+        return $this->itemFactory->create()->setId($item->getId())->setName('Updated' . $item->getName());
+    }
+}

+ 42 - 0
dev/tests/api-functional/_files/Magento/TestModule2/Service/V1/NoWebApiXmlInterface.php

@@ -0,0 +1,42 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule2\Service\V1;
+
+use Magento\TestModule2\Service\V1\Entity\Item;
+
+interface NoWebApiXmlInterface
+{
+    /**
+     * Get an item.
+     *
+     * @param int $id
+     * @return \Magento\TestModule2\Service\V1\Entity\Item
+     */
+    public function item($id);
+
+    /**
+     * Create an item.
+     *
+     * @param string $name
+     * @return \Magento\TestModule2\Service\V1\Entity\Item
+     */
+    public function create($name);
+
+    /**
+     * Update an item.
+     *
+     * @param \Magento\TestModule2\Service\V1\Entity\Item $item
+     * @return \Magento\TestModule2\Service\V1\Entity\Item
+     */
+    public function update(Item $item);
+
+    /**
+     * Retrieve a list of items.
+     *
+     * @return \Magento\TestModule2\Service\V1\Entity\Item[]
+     */
+    public function items();
+}

+ 69 - 0
dev/tests/api-functional/_files/Magento/TestModule2/Service/V1/SubsetRest.php

@@ -0,0 +1,69 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule2\Service\V1;
+
+use Magento\TestModule2\Service\V1\Entity\Item;
+use Magento\TestModule2\Service\V1\Entity\ItemFactory;
+
+class SubsetRest implements \Magento\TestModule2\Service\V1\SubsetRestInterface
+{
+    /**
+     * @var ItemFactory
+     */
+    protected $itemFactory;
+
+    /**
+     * @param ItemFactory $itemFactory
+     */
+    public function __construct(ItemFactory $itemFactory)
+    {
+        $this->itemFactory = $itemFactory;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function item($id)
+    {
+        return $this->itemFactory->create()->setId($id)->setName('testItem' . $id);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function items()
+    {
+        $result1 = $this->itemFactory->create()->setId(1)->setName('testItem1');
+
+        $result2 = $this->itemFactory->create()->setId(2)->setName('testItem2');
+
+        return [$result1, $result2];
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function create($name)
+    {
+        return $this->itemFactory->create()->setId(rand())->setName($name);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function update(Item $item)
+    {
+        return $this->itemFactory->create()->setId($item->getId())->setName('Updated' . $item->getName());
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function remove($id)
+    {
+        return $this->itemFactory->create()->setId(1);
+    }
+}

+ 50 - 0
dev/tests/api-functional/_files/Magento/TestModule2/Service/V1/SubsetRestInterface.php

@@ -0,0 +1,50 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+namespace Magento\TestModule2\Service\V1;
+
+use Magento\TestModule2\Service\V1\Entity\Item;
+
+interface SubsetRestInterface
+{
+    /**
+     * Return a single item.
+     *
+     * @param int $id
+     * @return \Magento\TestModule2\Service\V1\Entity\Item
+     */
+    public function item($id);
+
+    /**
+     * Return multiple items.
+     *
+     * @return \Magento\TestModule2\Service\V1\Entity\Item[]
+     */
+    public function items();
+
+    /**
+     * Create an item.
+     *
+     * @param string $name
+     * @return \Magento\TestModule2\Service\V1\Entity\Item
+     */
+    public function create($name);
+
+    /**
+     * Update an item.
+     *
+     * @param \Magento\TestModule2\Service\V1\Entity\Item $item
+     * @return \Magento\TestModule2\Service\V1\Entity\Item
+     */
+    public function update(Item $item);
+
+    /**
+     * Delete an item.
+     *
+     * @param int $id
+     * @return \Magento\TestModule2\Service\V1\Entity\Item
+     */
+    public function remove($id);
+}

+ 0 - 0
dev/tests/api-functional/_files/Magento/TestModule2/etc/acl.xml


برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است