From 1c1e69df624e2e59de686a5163af086120b64431 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Mon, 17 Mar 2025 22:44:39 +0200 Subject: [PATCH 01/34] 1263: Added UI tests for MarkDirectoryAsMagentoContentRoot Added a null project check in `MarkDirectoryAsMagentoContentRoot` to prevent potential NPEs. Replaced `ServiceManager` with the modern `project.getService` for retrieving `Settings` instances. Additionally, updated workflows to run tests via a script and introduced new test fixtures for UI testing. --- .github/workflows/gradle.yml | 6 +- .gitignore | 3 +- build.gradle.kts | 4 + runTests.sh | 16 + .../MarkDirectoryAsMagentoContentRot.java | 2 +- .../UnmarkDirectoryAsMagentoContentRot.java | 2 +- .../dialog/CreateAPluginDialog.form | 4 +- .../idea/magento2plugin/project/Settings.java | 3 +- .../pages/WelcomeFrameFixture.java | 36 + .../content/MarkDirectoryAsMagentoRootTest.kt | 203 + .../pages/ContextMenuFixture.kt | 27 + .../pages/CreateAPluginDialogFixture.kt | 31 + .../magento2plugin/pages/DialogFixture.kt | 38 + .../pages/FilteredComboBoxFixture.kt | 19 + .../idea/magento2plugin/pages/IdeaFrame.kt | 59 + .../idea/magento2plugin/pages/WelcomeFrame.kt | 21 + .../utils/RemoteRobotExtension.kt | 136 + .../idea/magento2plugin/utils/StepsLogger.kt | 16 + testData/project/magento2/composer.json | 85 + testData/project/magento2/composer.lock | 28817 ++++++++++++++++ 20 files changed, 29519 insertions(+), 9 deletions(-) create mode 100644 runTests.sh create mode 100644 src/test/java/com/magento/idea/magento2plugin/pages/WelcomeFrameFixture.java create mode 100644 src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt create mode 100644 src/test/kotlin/com/magento/idea/magento2plugin/pages/ContextMenuFixture.kt create mode 100644 src/test/kotlin/com/magento/idea/magento2plugin/pages/CreateAPluginDialogFixture.kt create mode 100644 src/test/kotlin/com/magento/idea/magento2plugin/pages/DialogFixture.kt create mode 100644 src/test/kotlin/com/magento/idea/magento2plugin/pages/FilteredComboBoxFixture.kt create mode 100644 src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt create mode 100644 src/test/kotlin/com/magento/idea/magento2plugin/pages/WelcomeFrame.kt create mode 100644 src/test/kotlin/com/magento/idea/magento2plugin/utils/RemoteRobotExtension.kt create mode 100644 src/test/kotlin/com/magento/idea/magento2plugin/utils/StepsLogger.kt create mode 100644 testData/project/magento2/composer.json create mode 100644 testData/project/magento2/composer.lock diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index bf210056a..04228d6dc 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -32,7 +32,7 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run automated tests - run: ./gradlew test --no-daemon + run: sh runTests.sh build-windows: runs-on: windows-latest @@ -58,7 +58,7 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run automated tests - run: ./gradlew test --no-daemon + run: sh runTests.sh build-macos: runs-on: macos-latest @@ -84,7 +84,7 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run automated tests - run: ./gradlew test --no-daemon + run: sh runTests.sh static-tests: runs-on: ubuntu-latest diff --git a/.gitignore b/.gitignore index 80e4be5e2..6af12fe4b 100644 --- a/.gitignore +++ b/.gitignore @@ -36,4 +36,5 @@ out .gradle .idea-sandbox build -.intellijPlatform/* \ No newline at end of file +.intellijPlatform/* +video/* \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index e319a0e3d..005927c3d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -42,6 +42,10 @@ dependencies { implementation("com.googlecode.json-simple:json-simple:1.1.1") implementation("org.codehaus.plexus:plexus-utils:3.4.0") + testImplementation("com.automation-remarks:video-recorder-junit5:2.0") + testImplementation("com.intellij.remoterobot:remote-robot:0.11.23") + testImplementation("com.intellij.remoterobot:remote-fixtures:0.11.23") + testImplementation("com.squareup.okhttp3:logging-interceptor:4.12.0") intellijPlatform { create(providers.gradleProperty("platformType"), providers.gradleProperty("platformVersion")) diff --git a/runTests.sh b/runTests.sh new file mode 100644 index 000000000..03ac9ad22 --- /dev/null +++ b/runTests.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +./gradlew clean +./gradlew runIdeForUiTests & +RUN_IDE_PID=$! + +sleep 10 + +./gradlew test --no-daemon + +# run certain test +#./gradlew test --tests "com.magento.idea.magento2plugin.actions.content.MarkDirectoryAsMagentoRootTest.testMarkDirectoryAsMagentoRoot" --scan + +kill $RUN_IDE_PID + +wait $RUN_IDE_PID 2>/dev/null \ No newline at end of file diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java index 4ca1c305e..d42dea893 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java @@ -61,7 +61,7 @@ public void update(@NotNull final AnActionEvent event) { project = module.getProject(); } - if (targetElement instanceof PsiDirectory) { + if (targetElement instanceof PsiDirectory && project != null) { final Settings settings = Settings.getInstance(project); final String magentoPathUrl = MagentoPathUrlUtil.execute(project); final String directoryUrl = ((PsiDirectory) targetElement).getVirtualFile().getUrl(); diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java index 67216c2df..0d9bcfbaa 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java @@ -58,7 +58,7 @@ public void update(@NotNull AnActionEvent event) { project = module.getProject(); } - if (targetElement instanceof PsiDirectory) { + if (targetElement instanceof PsiDirectory && project != null) { Settings settings = Settings.getInstance(project); String magentoPathUrl = MagentoPathUrlUtil.execute(project); String directoryUrl = ((PsiDirectory) targetElement).getVirtualFile().getUrl(); diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAPluginDialog.form b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAPluginDialog.form index 12308c5b1..d4a02c695 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAPluginDialog.form +++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/CreateAPluginDialog.form @@ -65,7 +65,9 @@ - + + + diff --git a/src/main/java/com/magento/idea/magento2plugin/project/Settings.java b/src/main/java/com/magento/idea/magento2plugin/project/Settings.java index a3ad1d46a..f5a132746 100644 --- a/src/main/java/com/magento/idea/magento2plugin/project/Settings.java +++ b/src/main/java/com/magento/idea/magento2plugin/project/Settings.java @@ -7,7 +7,6 @@ import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.components.PersistentStateComponent; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.components.State; import com.intellij.openapi.components.Storage; import com.intellij.openapi.project.Project; @@ -153,7 +152,7 @@ public interface MagentoModuleDataListener extends EventListener { } public static Settings getInstance(final Project project) { - return ServiceManager.getService(project, Settings.class); + return project.getService(Settings.class); } public static boolean isEnabled(final @NotNull Project project) { diff --git a/src/test/java/com/magento/idea/magento2plugin/pages/WelcomeFrameFixture.java b/src/test/java/com/magento/idea/magento2plugin/pages/WelcomeFrameFixture.java new file mode 100644 index 000000000..9d0d51a1c --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/pages/WelcomeFrameFixture.java @@ -0,0 +1,36 @@ +package com.magento.idea.magento2plugin.pages; + +import com.intellij.remoterobot.RemoteRobot; +import com.intellij.remoterobot.data.RemoteComponent; +import com.intellij.remoterobot.fixtures.*; +import org.jetbrains.annotations.NotNull; + +import static com.intellij.remoterobot.search.locators.Locators.byXpath; +import static com.intellij.remoterobot.utils.UtilsKt.hasAnyComponent; + + +@DefaultXpath(by = "FlatWelcomeFrame type", xpath = "//div[@class='FlatWelcomeFrame']") +@FixtureName(name = "Welcome Frame") +public class WelcomeFrameFixture extends CommonContainerFixture { + public WelcomeFrameFixture(@NotNull RemoteRobot remoteRobot, @NotNull RemoteComponent remoteComponent) { + super(remoteRobot, remoteComponent); + } + + public ComponentFixture createNewProjectLink() { + return welcomeFrameLink("New Project"); + } + + public ComponentFixture importProjectLink() { + return welcomeFrameLink("Get from VCS"); + } + + private ComponentFixture welcomeFrameLink(String text) { + if (hasAnyComponent(this, byXpath("//div[@class='NewRecentProjectPanel']"))) { + return find(ComponentFixture.class, byXpath("//div[@class='JBOptionButton' and @text='" + text + "']")); + } + return find( + ComponentFixture.class, + byXpath("//div[(@class='MainButton' and @text='"+ text +"') or (@accessiblename='"+ text +"' and @class='JButton')]") + ); + } +} diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt new file mode 100644 index 000000000..3ebf43f5b --- /dev/null +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -0,0 +1,203 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.content + +import com.automation.remarks.junit5.Video +import org.assertj.swing.core.MouseButton +import com.intellij.remoterobot.RemoteRobot +import com.intellij.remoterobot.fixtures.ContainerFixture +import com.intellij.remoterobot.search.locators.byXpath +import com.intellij.remoterobot.steps.CommonSteps +import com.intellij.remoterobot.stepsProcessing.step +import com.intellij.remoterobot.utils.keyboard +import com.intellij.remoterobot.utils.waitFor +import com.intellij.remoterobot.utils.waitForIgnoringError +import com.magento.idea.magento2plugin.pages.* +import com.magento.idea.magento2plugin.utils.RemoteRobotExtension +import com.magento.idea.magento2plugin.utils.StepsLogger +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith +import java.awt.event.KeyEvent.* +import java.io.File +import java.time.Duration.ofMinutes +import kotlin.io.path.createTempDirectory + +@ExtendWith(RemoteRobotExtension::class) +class MarkDirectoryAsMagentoRootTest { + private lateinit var tempProjectDir: File + + init { + StepsLogger.init() + } + + @BeforeEach + fun setup() { + // Create a temporary directory + val sourceDir = File("testData/project/magento2") + tempProjectDir = createTempDirectory("intellij-test-project").toFile() + + // Copy the test data to the temporary directory + sourceDir.copyRecursively( + target = tempProjectDir, + overwrite = true + ) + } + + + @BeforeEach + fun waitForIde(remoteRobot: RemoteRobot) { + waitForIgnoringError(ofMinutes(3)) { remoteRobot.callJs("true") } + } + + @AfterEach + fun closeProject(remoteRobot: RemoteRobot) = with(remoteRobot) { + CommonSteps(remoteRobot).closeProject() + } + + @Test + @Video + fun testMarkDirectoryAsMagentoRoot(remoteRobot: RemoteRobot) = with(remoteRobot) { + + welcomeFrame { + createNewProjectFromExistingFilesLink.click() + dialog("Open File or Project") { + // Set the path for the copied test data + val comboBox = find(byXpath("//div[@class='BorderlessTextField']")) + comboBox.click() // Focus on the comboBox + comboBox.keyboard { + hotKey(VK_CONTROL, VK_A) // Select all text + key(VK_DELETE) // Delete selected text + enterText(tempProjectDir.path) + } + + button("OK").click() + trustProjectLink.click() + } + } + idea { + step("Enable Magento Integration") { + waitFor(ofMinutes(1)) { isDumbMode().not() } + enableSupportLink.click(java.awt.Point(1, 1)) + waitFor(ofMinutes(1)) { isDumbMode().not() } + + with(projectViewTree) { + if (hasText("vendor").not()) { + findText(projectName).doubleClick() + waitFor { hasText("src") } + } + findText("vendor").doubleClick() + findText("module-catalog").doubleClick() + findText("Block").doubleClick() + findText("Navigation.php").doubleClick() + } + + createAPluginWithoutMagentoRootInVendor(this@idea, remoteRobot) + + with(projectViewTree) { + //add magento code to project + findText("magento").click(MouseButton.RIGHT_BUTTON) + contextMenu("Mark Directory as").click() + contextMenuItem("Sources Root").click() + + findText("module-catalog").click(MouseButton.RIGHT_BUTTON) + contextMenu("Mark Directory as").click() + contextMenuItem("Mark Directory As Magento Code Root").click() + } + + with(textEditor()) { + step("Create a new Plugin with marking as code root") { + Thread.sleep(1_000) + editor.findText("someMethod").click(MouseButton.RIGHT_BUTTON) + contextMenuItem("Create a new Plugin").click() + + createAPluginDialog { + step("Ensure target module includes 'Magento_Catalog'") { + pluginName.click() + pluginName.keyboard { + enterText("test_plugin") + } + className.click() + className.keyboard { + enterText("TestPlugin") + } + + targetModule.click() + targetModule.keyboard { + hotKey(VK_CONTROL, VK_A) // Select all text + key(VK_DELETE) // Delete selected text + enterText("Magento_Catalog") + button("OK").click() + } + } + } + } + } + + with(projectViewTree) { + findText("Plugin").doubleClick() + findText("TestPlugin.php").doubleClick() + } + + with(textEditor()) { + step("Check created files") { + editor.findText("beforeSomeMethod") + } + } + + with(projectViewTree) { + findText("module-catalog").click(MouseButton.RIGHT_BUTTON) + contextMenu("Mark Directory as").click() + contextMenuItem("Unmark Directory As Magento Code Root").click() + findText("Navigation.php").doubleClick() + } + + createAPluginWithoutMagentoRootInVendor(this@idea, remoteRobot) + } + } + } + + private fun createAPluginWithoutMagentoRootInVendor( + ideaFrame: IdeaFrame, + remoteRobot1: RemoteRobot + ) { + with(ideaFrame.textEditor()) { + step("Create a new Plugin without marking as code root") { + Thread.sleep(1_000) + editor.findText("someMethod").click(MouseButton.RIGHT_BUTTON) + remoteRobot1.contextMenuItem("Create a new Plugin").click() + + remoteRobot1.createAPluginDialog { + step("Ensure target module does not include 'Magento_Catalog'") { + pluginName.click() + pluginName.keyboard { + enterText("test_plugin") + } + className.click() + className.keyboard { + enterText("TestPlugin") + } + + targetModule.click() + targetModule.keyboard { + hotKey(VK_CONTROL, VK_A) // Select all text + key(VK_DELETE) // Delete selected text + enterText("Magento_Catalog") + button("OK").click() + + errorDialog { + button("OK").click() + } + + button("Cancel").click() + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/ContextMenuFixture.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/ContextMenuFixture.kt new file mode 100644 index 000000000..d372d193a --- /dev/null +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/ContextMenuFixture.kt @@ -0,0 +1,27 @@ +package com.magento.idea.magento2plugin.pages + +import com.intellij.remoterobot.RemoteRobot +import com.intellij.remoterobot.data.RemoteComponent +import com.intellij.remoterobot.fixtures.ComponentFixture +import com.intellij.remoterobot.fixtures.FixtureName +import com.intellij.remoterobot.search.locators.byXpath +import com.intellij.remoterobot.utils.waitFor + +fun RemoteRobot.contextMenuItem(text: String): ContextMenuItemFixture { + val xpath = byXpath("text '$text'", "//div[@class='ActionMenuItem' and @text='$text']") + waitFor { + findAll(xpath).isNotEmpty() + } + return findAll(xpath).first() +} + +fun RemoteRobot.contextMenu(text: String): ContextMenuItemFixture { + val xpath = byXpath("text '$text'", "//div[@class='ActionMenu' and @text='$text']") + waitFor { + findAll(xpath).isNotEmpty() + } + return findAll(xpath).first() +} + +@FixtureName("ContextMenuItem") +class ContextMenuItemFixture(remoteRobot: RemoteRobot, remoteComponent: RemoteComponent) : ComponentFixture(remoteRobot, remoteComponent) \ No newline at end of file diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/CreateAPluginDialogFixture.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/CreateAPluginDialogFixture.kt new file mode 100644 index 000000000..169a0f1ec --- /dev/null +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/CreateAPluginDialogFixture.kt @@ -0,0 +1,31 @@ + +package com.magento.idea.magento2plugin.pages + +import com.intellij.remoterobot.RemoteRobot +import com.intellij.remoterobot.data.RemoteComponent +import com.intellij.remoterobot.fixtures.CommonContainerFixture +import com.intellij.remoterobot.fixtures.DefaultXpath +import com.intellij.remoterobot.fixtures.FixtureName +import com.intellij.remoterobot.fixtures.JTextFieldFixture +import com.intellij.remoterobot.search.locators.byXpath +import java.time.Duration + +fun RemoteRobot.createAPluginDialog(function: CreateAPluginDialogFixture.() -> Unit) { + find(timeout = Duration.ofSeconds(10)).apply(function) +} + +@FixtureName("CreateAPluginDialog") +@DefaultXpath("CreateAPluginDialog type", "//div[@class='CreateAPluginDialog']") +class CreateAPluginDialogFixture( + remoteRobot: RemoteRobot, + remoteComponent: RemoteComponent) : CommonContainerFixture(remoteRobot, remoteComponent) { + + val targetModule + get() = find(byXpath("FilteredComboBox", "//div[@class='FilteredComboBox']")) + + val className + get() = find(byXpath("FilteredComboBox", "//div[@name='Class Name']")) + + val pluginName + get() = find(byXpath("FilteredComboBox", "//div[@tooltiptext='Plugin name in di.xml']")) +} \ No newline at end of file diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/DialogFixture.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/DialogFixture.kt new file mode 100644 index 000000000..9f2448d0e --- /dev/null +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/DialogFixture.kt @@ -0,0 +1,38 @@ + +package com.magento.idea.magento2plugin.pages + +import com.intellij.remoterobot.RemoteRobot +import com.intellij.remoterobot.data.RemoteComponent +import com.intellij.remoterobot.fixtures.CommonContainerFixture +import com.intellij.remoterobot.fixtures.ContainerFixture +import com.intellij.remoterobot.fixtures.FixtureName +import com.intellij.remoterobot.search.locators.byXpath +import com.intellij.remoterobot.stepsProcessing.step +import java.time.Duration + +fun ContainerFixture.dialog( + title: String, + timeout: Duration = Duration.ofSeconds(20), + function: DialogFixture.() -> Unit = {}): DialogFixture = step("Search for dialog with title $title") { + find(DialogFixture.byTitle(title), timeout).apply(function) +} + +fun ContainerFixture.errorDialog( + timeout: Duration = Duration.ofSeconds(20), + function: DialogFixture.() -> Unit = {}): DialogFixture = step("Search for error dialog") { + find(DialogFixture.getJDialog("Error"), timeout).apply(function) +} + +@FixtureName("Dialog") +class DialogFixture( + remoteRobot: RemoteRobot, + remoteComponent: RemoteComponent) : CommonContainerFixture(remoteRobot, remoteComponent) { + + companion object { + @JvmStatic + fun byTitle(title: String) = byXpath("title $title", "//div[@title='$title' and @class='MyDialog']") + + @JvmStatic + fun getJDialog(title: String) = byXpath("title $title", "//div[@title='$title' and @class='JDialog']") + } +} \ No newline at end of file diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/FilteredComboBoxFixture.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/FilteredComboBoxFixture.kt new file mode 100644 index 000000000..f321a6212 --- /dev/null +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/FilteredComboBoxFixture.kt @@ -0,0 +1,19 @@ +package com.magento.idea.magento2plugin.pages + +import com.intellij.remoterobot.RemoteRobot +import com.intellij.remoterobot.data.RemoteComponent +import com.intellij.remoterobot.fixtures.ComponentFixture +import com.intellij.remoterobot.fixtures.DefaultXpath +import com.intellij.remoterobot.fixtures.FixtureName +import com.intellij.remoterobot.fixtures.JLabelFixture +import com.intellij.remoterobot.search.locators.Locator +import com.intellij.remoterobot.stepsProcessing.step +import com.intellij.remoterobot.utils.Locators +import com.intellij.remoterobot.utils.RelativeLocators +import com.magento.idea.magento2plugin.ui.FilteredComboBox + +@DefaultXpath(by = "FilteredComboBox type", xpath = "//div[@class='FilteredComboBox']") +@FixtureName("FilteredComboBoxFixture") +open class FilteredComboBoxFixture(remoteRobot: RemoteRobot, remoteComponent: RemoteComponent) : + ComponentFixture(remoteRobot, remoteComponent) { +} diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt new file mode 100644 index 000000000..0ca9531fb --- /dev/null +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt @@ -0,0 +1,59 @@ + +package com.magento.idea.magento2plugin.pages + +import com.intellij.remoterobot.RemoteRobot +import com.intellij.remoterobot.data.RemoteComponent +import com.intellij.remoterobot.fixtures.* +import com.intellij.remoterobot.search.locators.byXpath +import com.intellij.remoterobot.stepsProcessing.step +import com.intellij.remoterobot.utils.waitFor +import java.time.Duration + + +fun RemoteRobot.idea(function: IdeaFrame.() -> Unit) { + find(timeout = Duration.ofSeconds(10)).apply(function) +} + +@FixtureName("Idea frame") +@DefaultXpath("IdeFrameImpl type", "//div[@class='IdeFrameImpl']") +class IdeaFrame(remoteRobot: RemoteRobot, remoteComponent: RemoteComponent) : + CommonContainerFixture(remoteRobot, remoteComponent) { + + val enableSupportLink + get() = actionLink(byXpath("//div[@accessiblename='Enable Magento support for this project?' and @class='JEditorPane']")) + + val projectViewTree + get() = find(byXpath("ProjectViewTree", "//div[@class='ProjectViewTree']")) + + val projectName + get() = step("Get project name") { return@step callJs("component.getProject().getName()") } + + @JvmOverloads + fun dumbAware(timeout: Duration = Duration.ofMinutes(5), function: () -> Unit) { + step("Wait for smart mode") { + waitFor(duration = timeout, interval = Duration.ofSeconds(5)) { + runCatching { isDumbMode().not() }.getOrDefault(false) + } + function() + step("..wait for smart mode again") { + waitFor(duration = timeout, interval = Duration.ofSeconds(5)) { + isDumbMode().not() + } + } + } + } + + fun isDumbMode(): Boolean { + return callJs( + """ + const frameHelper = com.intellij.openapi.wm.impl.ProjectFrameHelper.getFrameHelper(component) + if (frameHelper) { + const project = frameHelper.getProject() + project ? com.intellij.openapi.project.DumbService.isDumb(project) : true + } else { + true + } + """, true + ) + } +} \ No newline at end of file diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/WelcomeFrame.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/WelcomeFrame.kt new file mode 100644 index 000000000..cf66bdb30 --- /dev/null +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/WelcomeFrame.kt @@ -0,0 +1,21 @@ + +package com.magento.idea.magento2plugin.pages + +import com.intellij.remoterobot.RemoteRobot +import com.intellij.remoterobot.data.RemoteComponent +import com.intellij.remoterobot.fixtures.* +import com.intellij.remoterobot.search.locators.byXpath +import java.time.Duration + +fun RemoteRobot.welcomeFrame(function: WelcomeFrame.()-> Unit) { + find(WelcomeFrame::class.java, Duration.ofSeconds(10)).apply(function) +} + +@FixtureName("Welcome Frame") +@DefaultXpath("type", "//div[@class='FlatWelcomeFrame']") +class WelcomeFrame(remoteRobot: RemoteRobot, remoteComponent: RemoteComponent) : CommonContainerFixture(remoteRobot, remoteComponent) { + val createNewProjectFromExistingFilesLink + get() = actionLink(byXpath("//div[@defaulticon='open.svg']")) + val trustProjectLink + get() = actionLink(byXpath("//div[@text='Trust Project']")) +} \ No newline at end of file diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/utils/RemoteRobotExtension.kt b/src/test/kotlin/com/magento/idea/magento2plugin/utils/RemoteRobotExtension.kt new file mode 100644 index 000000000..cf472574c --- /dev/null +++ b/src/test/kotlin/com/magento/idea/magento2plugin/utils/RemoteRobotExtension.kt @@ -0,0 +1,136 @@ +package com.magento.idea.magento2plugin.utils + +import com.intellij.remoterobot.RemoteRobot +import com.intellij.remoterobot.fixtures.ContainerFixture +import com.intellij.remoterobot.search.locators.byXpath +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.logging.HttpLoggingInterceptor +import org.junit.jupiter.api.extension.AfterTestExecutionCallback +import org.junit.jupiter.api.extension.ExtensionContext +import org.junit.jupiter.api.extension.ParameterContext +import org.junit.jupiter.api.extension.ParameterResolver +import java.awt.image.BufferedImage +import java.io.ByteArrayOutputStream +import java.io.File +import java.lang.IllegalStateException +import java.lang.reflect.Method +import javax.imageio.ImageIO + +class RemoteRobotExtension : AfterTestExecutionCallback, ParameterResolver { + private val url: String = System.getProperty("remote-robot-url") ?: "http://127.0.0.1:8082" + private val remoteRobot: RemoteRobot = if (System.getProperty("debug-retrofit")?.equals("enable") == true) { + val interceptor: HttpLoggingInterceptor = HttpLoggingInterceptor().apply { + this.level = HttpLoggingInterceptor.Level.BODY + } + val client = OkHttpClient.Builder().apply { + this.addInterceptor(interceptor) + }.build() + RemoteRobot(url, client) + } else { + RemoteRobot(url) + } + private val client = OkHttpClient() + + override fun supportsParameter(parameterContext: ParameterContext?, extensionContext: ExtensionContext?): Boolean { + return parameterContext?.parameter?.type?.equals(RemoteRobot::class.java) ?: false + } + + override fun resolveParameter(parameterContext: ParameterContext?, extensionContext: ExtensionContext?): Any { + return remoteRobot + } + + override fun afterTestExecution(context: ExtensionContext?) { + val testMethod: Method = context?.requiredTestMethod ?: throw IllegalStateException("test method is null") + val testMethodName = testMethod.name + val testFailed: Boolean = context.executionException?.isPresent ?: false + if (testFailed) { + saveScreenshot(testMethodName) + saveIdeaFrames(testMethodName) + saveHierarchy(testMethodName) + } + } + + private fun saveScreenshot(testName: String) { + fetchScreenShot().save(testName) + } + + private fun saveHierarchy(testName: String) { + val hierarchySnapshot = + saveFile(url, "build/reports", "hierarchy-$testName.html") + if (File("build/reports/styles.css").exists().not()) { + saveFile("$url/styles.css", "build/reports", "styles.css") + } + println("Hierarchy snapshot: ${hierarchySnapshot.absolutePath}") + } + + private fun saveFile(url: String, folder: String, name: String): File { + val response = client.newCall(Request.Builder().url(url).build()).execute() + return File(folder).apply { + mkdirs() + }.resolve(name).apply { + writeText(response.body.string()) + } + } + + private fun BufferedImage.save(name: String) { + val bytes = ByteArrayOutputStream().use { b -> + ImageIO.write(this, "png", b) + b.toByteArray() + } + File("build/reports").apply { mkdirs() }.resolve("$name.png").writeBytes(bytes) + } + + private fun saveIdeaFrames(testName: String) { + remoteRobot.findAll(byXpath("//div[@class='IdeFrameImpl']")).forEachIndexed { n, frame -> + val pic = try { + frame.callJs( + """ + importPackage(java.io) + importPackage(javax.imageio) + importPackage(java.awt.image) + const screenShot = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_ARGB); + component.paint(screenShot.getGraphics()) + let pictureBytes; + const baos = new ByteArrayOutputStream(); + try { + ImageIO.write(screenShot, "png", baos); + pictureBytes = baos.toByteArray(); + } finally { + baos.close(); + } + pictureBytes; + """, true + ) + } catch (e: Throwable) { + e.printStackTrace() + throw e + } + pic.inputStream().use { + ImageIO.read(it) + }.save(testName + "_" + n) + } + } + + private fun fetchScreenShot(): BufferedImage { + return remoteRobot.callJs( + """ + importPackage(java.io) + importPackage(javax.imageio) + const screenShot = new java.awt.Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); + let pictureBytes; + const baos = new ByteArrayOutputStream(); + try { + ImageIO.write(screenShot, "png", baos); + pictureBytes = baos.toByteArray(); + } finally { + baos.close(); + } + pictureBytes; + """ + ).inputStream().use { + ImageIO.read(it) + } + } +} + diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/utils/StepsLogger.kt b/src/test/kotlin/com/magento/idea/magento2plugin/utils/StepsLogger.kt new file mode 100644 index 000000000..1162b6f1c --- /dev/null +++ b/src/test/kotlin/com/magento/idea/magento2plugin/utils/StepsLogger.kt @@ -0,0 +1,16 @@ + +package com.magento.idea.magento2plugin.utils + +import com.intellij.remoterobot.stepsProcessing.StepLogger +import com.intellij.remoterobot.stepsProcessing.StepWorker + +object StepsLogger { + private var initializaed = false + @JvmStatic + fun init() { + if (initializaed.not()) { + StepWorker.registerProcessor(StepLogger()) + initializaed = true + } + } +} \ No newline at end of file diff --git a/testData/project/magento2/composer.json b/testData/project/magento2/composer.json new file mode 100644 index 000000000..8d248983a --- /dev/null +++ b/testData/project/magento2/composer.json @@ -0,0 +1,85 @@ +{ + "name": "magento/project-community-edition", + "description": "eCommerce Platform for Growth (Community Edition)", + "type": "project", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "config": { + "allow-plugins": { + "dealerdirect/phpcodesniffer-composer-installer": true, + "laminas/laminas-dependency-plugin": true, + "magento/*": true, + "php-http/discovery": true, + "magento/magento-composer-installer": true, + "magento/inventory-composer-installer": true + }, + "preferred-install": "dist", + "sort-packages": true + }, + "version": "2.4.7", + "require": { + "magento/product-community-edition": "2.4.7", + "magento/composer-dependency-version-audit-plugin": "~0.1", + "magento/composer-root-update-plugin": "^2.0.4" + }, + "autoload": { + "exclude-from-classmap": [ + "**/dev/**", + "**/update/**", + "**/Test/**" + ], + "files": [ + "app/etc/NonComposerComponentRegistration.php" + ], + "psr-0": { + "": [ + "app/code/", + "generated/code/" + ] + }, + "psr-4": { + "Magento\\Setup\\": "setup/src/Magento/Setup/" + } + }, + "require-dev": { + "allure-framework/allure-phpunit": "^2", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7 || ^1.0", + "dg/bypass-finals": "^1.4", + "friendsofphp/php-cs-fixer": "^3.22", + "lusitanian/oauth": "^0.8", + "magento/magento-coding-standard": "*", + "magento/magento2-functional-testing-framework": "^4.7", + "pdepend/pdepend": "^2.10", + "phpmd/phpmd": "^2.12", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^9.5", + "sebastian/phpcpd": "^6.0", + "symfony/finder": "^6.4" + }, + "conflict": { + "gene/bluefoot": "*" + }, + "autoload-dev": { + "psr-4": { + "Magento\\PhpStan\\": "dev/tests/static/framework/Magento/PhpStan/", + "Magento\\Sniffs\\": "dev/tests/static/framework/Magento/Sniffs/", + "Magento\\TestFramework\\Inspection\\": "dev/tests/static/framework/Magento/TestFramework/Inspection/", + "Magento\\TestFramework\\Utility\\": "dev/tests/static/framework/Magento/TestFramework/Utility/", + "Magento\\Tools\\": "dev/tools/Magento/Tools/", + "Magento\\Tools\\Sanity\\": "dev/build/publication/sanity/Magento/Tools/Sanity/" + } + }, + "minimum-stability": "stable", + "prefer-stable": true, + "repositories": [ + { + "type": "composer", + "url": "https://repo.magento.com/" + } + ], + "extra": { + "magento-force": "override" + } +} diff --git a/testData/project/magento2/composer.lock b/testData/project/magento2/composer.lock new file mode 100644 index 000000000..4f7369b45 --- /dev/null +++ b/testData/project/magento2/composer.lock @@ -0,0 +1,28817 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "09d167c2f7f677b5531241222631993f", + "packages": [ + { + "name": "2tvenom/cborencode", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/2tvenom/CBOREncode.git", + "reference": "42aedccb861d01fc0554782348cc08f8ebf22332" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/2tvenom/CBOREncode/zipball/42aedccb861d01fc0554782348cc08f8ebf22332", + "reference": "42aedccb861d01fc0554782348cc08f8ebf22332", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "CBOR": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "PHP" + ], + "authors": [ + { + "name": "Pavel Gulbin", + "email": "2tvenom@gmail.com", + "role": "Developer" + } + ], + "description": "CBOR encoder for PHP", + "homepage": "https://github.com/2tvenom/CBOREncode", + "keywords": [ + "cbor" + ], + "support": { + "issues": "https://github.com/2tvenom/CBOREncode/issues", + "source": "https://github.com/2tvenom/CBOREncode/tree/1.0.2" + }, + "time": "2020-10-27T07:22:41+00:00" + }, + { + "name": "adobe-commerce/adobe-ims-metapackage", + "version": "2.2.2", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/adobe-commerce/adobe-ims-metapackage/adobe-commerce-adobe-ims-metapackage-2.2.2.0.zip", + "shasum": "c9cb115e26b898713356c222697a4df769d96239" + }, + "require": { + "magento/module-admin-adobe-ims": "100.5.2", + "magento/module-admin-adobe-ims-two-factor-auth": "1.0.1", + "magento/module-adobe-ims": "2.2.1", + "magento/module-adobe-ims-api": "2.2.1", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "metapackage", + "description": "Adobe IMS Integration" + }, + { + "name": "adobe-commerce/os-extensions-metapackage", + "version": "1.0.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/adobe-commerce/os-extensions-metapackage/adobe-commerce-os-extensions-metapackage-1.0.0.0.zip", + "shasum": "438f5690d41600fa341e629e96ea982882c2be42" + }, + "require": { + "adobe-commerce/adobe-ims-metapackage": "~2.2.1", + "magento/adobe-stock-integration": "~2.1.6", + "magento/payment-services": "^2.0", + "paypal/module-braintree": "~4.6.0" + }, + "type": "metapackage", + "description": "Metapackage contains references to extensions bundled with Magento OS" + }, + { + "name": "astock/stock-api-libphp", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/adobe/stock-api-libphp.git", + "reference": "d9e6460f43dbb2dbc6e442e017edb5427884d3bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/adobe/stock-api-libphp/zipball/d9e6460f43dbb2dbc6e442e017edb5427884d3bf", + "reference": "d9e6460f43dbb2dbc6e442e017edb5427884d3bf", + "shasum": "" + }, + "require": { + "guzzlehttp/guzzle": "~7.3", + "php": ">=7.3" + }, + "require-dev": { + "mockery/mockery": "^1.4.3", + "phpunit/phpunit": ">=6.0", + "squizlabs/php_codesniffer": "~3.6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AdobeStock\\Api\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "description": "Adobe Stock API library", + "support": { + "issues": "https://github.com/adobe/stock-api-libphp/issues", + "source": "https://github.com/adobe/stock-api-libphp/tree/1.1.5" + }, + "time": "2021-08-31T16:36:34+00:00" + }, + { + "name": "aws/aws-crt-php", + "version": "v1.2.7", + "source": { + "type": "git", + "url": "https://github.com/awslabs/aws-crt-php.git", + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e", + "reference": "d71d9906c7bb63a28295447ba12e74723bd3730e", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35||^5.6.3||^9.5", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality." + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "AWS SDK Common Runtime Team", + "email": "aws-sdk-common-runtime@amazon.com" + } + ], + "description": "AWS Common Runtime for PHP", + "homepage": "https://github.com/awslabs/aws-crt-php", + "keywords": [ + "amazon", + "aws", + "crt", + "sdk" + ], + "support": { + "issues": "https://github.com/awslabs/aws-crt-php/issues", + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7" + }, + "time": "2024-10-18T22:15:13+00:00" + }, + { + "name": "aws/aws-sdk-php", + "version": "3.333.0", + "source": { + "type": "git", + "url": "https://github.com/aws/aws-sdk-php.git", + "reference": "11bb2709885c9954004620d3648e9355feb92a41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/11bb2709885c9954004620d3648e9355feb92a41", + "reference": "11bb2709885c9954004620d3648e9355feb92a41", + "shasum": "" + }, + "require": { + "aws/aws-crt-php": "^1.2.3", + "ext-json": "*", + "ext-pcre": "*", + "ext-simplexml": "*", + "guzzlehttp/guzzle": "^6.5.8 || ^7.4.5", + "guzzlehttp/promises": "^1.4.0 || ^2.0", + "guzzlehttp/psr7": "^1.9.1 || ^2.4.5", + "mtdowling/jmespath.php": "^2.6", + "php": ">=7.2.5", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "andrewsville/php-token-reflection": "^1.4", + "aws/aws-php-sns-message-validator": "~1.0", + "behat/behat": "~3.0", + "composer/composer": "^1.10.22", + "dms/phpunit-arraysubset-asserts": "^0.4.0", + "doctrine/cache": "~1.4", + "ext-dom": "*", + "ext-openssl": "*", + "ext-pcntl": "*", + "ext-sockets": "*", + "nette/neon": "^2.3", + "paragonie/random_compat": ">= 2", + "phpunit/phpunit": "^5.6.3 || ^8.5 || ^9.5", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0", + "sebastian/comparator": "^1.2.3 || ^4.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "suggest": { + "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", + "doctrine/cache": "To use the DoctrineCacheAdapter", + "ext-curl": "To send requests using cURL", + "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", + "ext-sockets": "To use client-side monitoring" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Aws\\": "src/" + }, + "exclude-from-classmap": [ + "src/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Amazon Web Services", + "homepage": "http://aws.amazon.com" + } + ], + "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", + "homepage": "http://aws.amazon.com/sdkforphp", + "keywords": [ + "amazon", + "aws", + "cloud", + "dynamodb", + "ec2", + "glacier", + "s3", + "sdk" + ], + "support": { + "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", + "issues": "https://github.com/aws/aws-sdk-php/issues", + "source": "https://github.com/aws/aws-sdk-php/tree/3.333.0" + }, + "time": "2024-12-03T19:06:47+00:00" + }, + { + "name": "bacon/bacon-qr-code", + "version": "2.0.8", + "source": { + "type": "git", + "url": "https://github.com/Bacon/BaconQrCode.git", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/8674e51bb65af933a5ffaf1c308a660387c35c22", + "reference": "8674e51bb65af933a5ffaf1c308a660387c35c22", + "shasum": "" + }, + "require": { + "dasprid/enum": "^1.0.3", + "ext-iconv": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phly/keep-a-changelog": "^2.1", + "phpunit/phpunit": "^7 | ^8 | ^9", + "spatie/phpunit-snapshot-assertions": "^4.2.9", + "squizlabs/php_codesniffer": "^3.4" + }, + "suggest": { + "ext-imagick": "to generate QR code images" + }, + "type": "library", + "autoload": { + "psr-4": { + "BaconQrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "BaconQrCode is a QR code generator for PHP.", + "homepage": "https://github.com/Bacon/BaconQrCode", + "support": { + "issues": "https://github.com/Bacon/BaconQrCode/issues", + "source": "https://github.com/Bacon/BaconQrCode/tree/2.0.8" + }, + "time": "2022-12-07T17:46:57+00:00" + }, + { + "name": "braintree/braintree_php", + "version": "6.13.0", + "source": { + "type": "git", + "url": "https://github.com/braintree/braintree_php.git", + "reference": "c7bdef50c9692f1f9f9bf982e452aec0d137f5ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/braintree/braintree_php/zipball/c7bdef50c9692f1f9f9bf982e452aec0d137f5ec", + "reference": "c7bdef50c9692f1f9f9bf982e452aec0d137f5ec", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-dom": "*", + "ext-hash": "*", + "ext-openssl": "*", + "ext-xmlwriter": "*", + "php": ">=7.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.0", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Braintree\\": "lib/Braintree" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Braintree", + "homepage": "https://www.braintreepayments.com" + } + ], + "description": "Braintree PHP Client Library", + "support": { + "issues": "https://github.com/braintree/braintree_php/issues", + "source": "https://github.com/braintree/braintree_php/tree/6.13.0" + }, + "time": "2023-08-30T21:46:13+00:00" + }, + { + "name": "brick/math", + "version": "0.12.1", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/f510c0a40911935b77b86859eb5223d58d660df1", + "reference": "f510c0a40911935b77b86859eb5223d58d660df1", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^10.1", + "vimeo/psalm": "5.16.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "bignumber", + "brick", + "decimal", + "integer", + "math", + "mathematics", + "rational" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.12.1" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2023-11-29T23:19:16+00:00" + }, + { + "name": "brick/varexporter", + "version": "0.5.0", + "source": { + "type": "git", + "url": "https://github.com/brick/varexporter.git", + "reference": "84b2a7a91f69aa5d079aec5a0a7256ebf2dceb6b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/varexporter/zipball/84b2a7a91f69aa5d079aec5a0a7256ebf2dceb6b", + "reference": "84b2a7a91f69aa5d079aec5a0a7256ebf2dceb6b", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^9.3", + "psalm/phar": "5.21.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\VarExporter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A powerful alternative to var_export(), which can export closures and objects without __set_state()", + "keywords": [ + "var_export" + ], + "support": { + "issues": "https://github.com/brick/varexporter/issues", + "source": "https://github.com/brick/varexporter/tree/0.5.0" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + } + ], + "time": "2024-05-10T17:15:19+00:00" + }, + { + "name": "christian-riesen/base32", + "version": "1.6.0", + "source": { + "type": "git", + "url": "https://github.com/ChristianRiesen/base32.git", + "reference": "2e82dab3baa008e24a505649b0d583c31d31e894" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ChristianRiesen/base32/zipball/2e82dab3baa008e24a505649b0d583c31d31e894", + "reference": "2e82dab3baa008e24a505649b0d583c31d31e894", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.17", + "phpstan/phpstan": "^0.12", + "phpunit/phpunit": "^8.5.13 || ^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Base32\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Riesen", + "email": "chris.riesen@gmail.com", + "homepage": "http://christianriesen.com", + "role": "Developer" + } + ], + "description": "Base32 encoder/decoder according to RFC 4648", + "homepage": "https://github.com/ChristianRiesen/base32", + "keywords": [ + "base32", + "decode", + "encode", + "rfc4648" + ], + "support": { + "issues": "https://github.com/ChristianRiesen/base32/issues", + "source": "https://github.com/ChristianRiesen/base32/tree/1.6.0" + }, + "time": "2021-02-26T10:19:33+00:00" + }, + { + "name": "colinmollenhour/cache-backend-file", + "version": "v1.4.8", + "source": { + "type": "git", + "url": "https://github.com/colinmollenhour/Cm_Cache_Backend_File.git", + "reference": "8ad24cfa1eccc3a995c4fcb00db00fb07bd02938" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/colinmollenhour/Cm_Cache_Backend_File/zipball/8ad24cfa1eccc3a995c4fcb00db00fb07bd02938", + "reference": "8ad24cfa1eccc3a995c4fcb00db00fb07bd02938", + "shasum": "" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.4", + "phpunit/phpunit": "^9", + "zf1s/zend-cache": "~1.15" + }, + "type": "magento-module", + "autoload": { + "classmap": [ + "File.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin Mollenhour" + } + ], + "description": "The stock Zend_Cache_Backend_File backend has extremely poor performance for cleaning by tags making it become unusable as the number of cached items increases. This backend makes many changes resulting in a huge performance boost, especially for tag cleaning.", + "homepage": "https://github.com/colinmollenhour/Cm_Cache_Backend_File", + "support": { + "issues": "https://github.com/colinmollenhour/Cm_Cache_Backend_File/issues", + "source": "https://github.com/colinmollenhour/Cm_Cache_Backend_File/tree/v1.4.8" + }, + "time": "2023-09-19T20:23:43+00:00" + }, + { + "name": "colinmollenhour/cache-backend-redis", + "version": "1.17.1", + "source": { + "type": "git", + "url": "https://github.com/colinmollenhour/Cm_Cache_Backend_Redis.git", + "reference": "d403f4473e1b3cc616fa59d187e817543b6620c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/colinmollenhour/Cm_Cache_Backend_Redis/zipball/d403f4473e1b3cc616fa59d187e817543b6620c1", + "reference": "d403f4473e1b3cc616fa59d187e817543b6620c1", + "shasum": "" + }, + "require": { + "colinmollenhour/credis": "^1.14" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.4", + "phpunit/phpunit": "^9", + "zf1s/zend-cache": "~1.15" + }, + "type": "magento-module", + "autoload": { + "classmap": [ + "Cm/Cache/Backend/Redis.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause-Modification" + ], + "authors": [ + { + "name": "Colin Mollenhour" + } + ], + "description": "Zend_Cache backend using Redis with full support for tags.", + "homepage": "https://github.com/colinmollenhour/Cm_Cache_Backend_Redis", + "support": { + "issues": "https://github.com/colinmollenhour/Cm_Cache_Backend_Redis/issues", + "source": "https://github.com/colinmollenhour/Cm_Cache_Backend_Redis/tree/1.17.1" + }, + "time": "2023-12-21T21:56:18+00:00" + }, + { + "name": "colinmollenhour/credis", + "version": "v1.16.1", + "source": { + "type": "git", + "url": "https://github.com/colinmollenhour/credis.git", + "reference": "f11a89fd068d3e5db0c2b5a9ba8663bc36162e95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/colinmollenhour/credis/zipball/f11a89fd068d3e5db0c2b5a9ba8663bc36162e95", + "reference": "f11a89fd068d3e5db0c2b5a9ba8663bc36162e95", + "shasum": "" + }, + "require": { + "php": ">=5.6.0" + }, + "suggest": { + "ext-redis": "Improved performance for communicating with redis" + }, + "type": "library", + "autoload": { + "classmap": [ + "Client.php", + "Cluster.php", + "Sentinel.php", + "Module.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Colin Mollenhour", + "email": "colin@mollenhour.com" + } + ], + "description": "Credis is a lightweight interface to the Redis key-value store which wraps the phpredis library when available for better performance.", + "homepage": "https://github.com/colinmollenhour/credis", + "support": { + "issues": "https://github.com/colinmollenhour/credis/issues", + "source": "https://github.com/colinmollenhour/credis/tree/v1.16.1" + }, + "time": "2024-07-04T15:08:03+00:00" + }, + { + "name": "colinmollenhour/php-redis-session-abstract", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/colinmollenhour/php-redis-session-abstract.git", + "reference": "5d93866cd53701ef8f866cb41cb5c6d7259d4416" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/colinmollenhour/php-redis-session-abstract/zipball/5d93866cd53701ef8f866cb41cb5c6d7259d4416", + "reference": "5d93866cd53701ef8f866cb41cb5c6d7259d4416", + "shasum": "" + }, + "require": { + "colinmollenhour/credis": "~1.6", + "php": "^5.5 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9" + }, + "type": "library", + "autoload": { + "psr-0": { + "Cm\\RedisSession\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin Mollenhour" + } + ], + "description": "A Redis-based session handler with optimistic locking", + "homepage": "https://github.com/colinmollenhour/php-redis-session-abstract", + "support": { + "issues": "https://github.com/colinmollenhour/php-redis-session-abstract/issues", + "source": "https://github.com/colinmollenhour/php-redis-session-abstract/tree/v1.7.0" + }, + "time": "2024-02-03T06:04:45+00:00" + }, + { + "name": "composer/ca-bundle", + "version": "1.5.4", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/bc0593537a463e55cadf45fd938d23b75095b7e1", + "reference": "bc0593537a463e55cadf45fd938d23b75095b7e1", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8 || ^9", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "symfony/process": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "support": { + "irc": "irc://irc.freenode.org/composer", + "issues": "https://github.com/composer/ca-bundle/issues", + "source": "https://github.com/composer/ca-bundle/tree/1.5.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-27T15:35:25+00:00" + }, + { + "name": "composer/class-map-generator", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/composer/class-map-generator.git", + "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/class-map-generator/zipball/4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915", + "reference": "4b0a223cf5be7c9ee7e0ef1bc7db42b4a97c9915", + "shasum": "" + }, + "require": { + "composer/pcre": "^2.1 || ^3.1", + "php": "^7.2 || ^8.0", + "symfony/finder": "^4.4 || ^5.3 || ^6 || ^7" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-deprecation-rules": "^1 || ^2", + "phpstan/phpstan-phpunit": "^1 || ^2", + "phpstan/phpstan-strict-rules": "^1.1 || ^2", + "phpunit/phpunit": "^8", + "symfony/filesystem": "^5.4 || ^6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\ClassMapGenerator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Utilities to scan PHP code and generate class maps.", + "keywords": [ + "classmap" + ], + "support": { + "issues": "https://github.com/composer/class-map-generator/issues", + "source": "https://github.com/composer/class-map-generator/tree/1.5.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-25T16:11:06+00:00" + }, + { + "name": "composer/composer", + "version": "2.8.3", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "2a7c71266b2545a3bed9f4860734081963f6e688" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/2a7c71266b2545a3bed9f4860734081963f6e688", + "reference": "2a7c71266b2545a3bed9f4860734081963f6e688", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.5", + "composer/class-map-generator": "^1.4.0", + "composer/metadata-minifier": "^1.0", + "composer/pcre": "^2.2 || ^3.2", + "composer/semver": "^3.3", + "composer/spdx-licenses": "^1.5.7", + "composer/xdebug-handler": "^2.0.2 || ^3.0.3", + "justinrainbow/json-schema": "^5.3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1.0 || ^2.0 || ^3.0", + "react/promise": "^2.11 || ^3.2", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.2", + "seld/signal-handler": "^2.0", + "symfony/console": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/filesystem": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/finder": "^5.4.35 || ^6.3.12 || ^7.0.3", + "symfony/polyfill-php73": "^1.24", + "symfony/polyfill-php80": "^1.24", + "symfony/polyfill-php81": "^1.24", + "symfony/process": "^5.4.35 || ^6.3.12 || ^7.0.3" + }, + "require-dev": { + "phpstan/phpstan": "^1.11.8", + "phpstan/phpstan-deprecation-rules": "^1.2.0", + "phpstan/phpstan-phpunit": "^1.4.0", + "phpstan/phpstan-strict-rules": "^1.6.0", + "phpstan/phpstan-symfony": "^1.4.0", + "symfony/phpunit-bridge": "^6.4.3 || ^7.0.1" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives", + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "phpstan": { + "includes": [ + "phpstan/rules.neon" + ] + }, + "branch-alias": { + "dev-main": "2.8-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\": "src/Composer/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "https://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/composer/issues", + "security": "https://github.com/composer/composer/security/policy", + "source": "https://github.com/composer/composer/tree/2.8.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-17T12:13:04+00:00" + }, + { + "name": "composer/metadata-minifier", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/metadata-minifier.git", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", + "reference": "c549d23829536f0d0e984aaabbf02af91f443207", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "composer/composer": "^2", + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\MetadataMinifier\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Small utility library that handles metadata minification and expansion.", + "keywords": [ + "composer", + "compression" + ], + "support": { + "issues": "https://github.com/composer/metadata-minifier/issues", + "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-04-07T13:37:33+00:00" + }, + { + "name": "composer/pcre", + "version": "3.3.2", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "reference": "b2bed4734f0cc156ee1fe9c0da2550420d99a21e", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<1.11.10" + }, + "require-dev": { + "phpstan/phpstan": "^1.12 || ^2", + "phpstan/phpstan-strict-rules": "^1 || ^2", + "phpunit/phpunit": "^8 || ^9" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/3.3.2" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-11-12T16:29:46+00:00" + }, + { + "name": "composer/semver", + "version": "3.4.3", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "symfony/phpunit-bridge": "^3 || ^7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/semver/issues", + "source": "https://github.com/composer/semver/tree/3.4.3" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-09-19T14:15:21+00:00" + }, + { + "name": "composer/spdx-licenses", + "version": "1.5.8", + "source": { + "type": "git", + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", + "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.55", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Spdx\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "SPDX licenses list and validation library.", + "keywords": [ + "license", + "spdx", + "validator" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/spdx-licenses/issues", + "source": "https://github.com/composer/spdx-licenses/tree/1.5.8" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2023-11-20T07:44:33+00:00" + }, + { + "name": "composer/xdebug-handler", + "version": "3.0.5", + "source": { + "type": "git", + "url": "https://github.com/composer/xdebug-handler.git", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6c1925561632e83d60a44492e0b344cf48ab85ef", + "reference": "6c1925561632e83d60a44492e0b344cf48ab85ef", + "shasum": "" + }, + "require": { + "composer/pcre": "^1 || ^2 || ^3", + "php": "^7.2.5 || ^8.0", + "psr/log": "^1 || ^2 || ^3" + }, + "require-dev": { + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Composer\\XdebugHandler\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "John Stevenson", + "email": "john-stevenson@blueyonder.co.uk" + } + ], + "description": "Restarts a process without Xdebug.", + "keywords": [ + "Xdebug", + "performance" + ], + "support": { + "irc": "ircs://irc.libera.chat:6697/composer", + "issues": "https://github.com/composer/xdebug-handler/issues", + "source": "https://github.com/composer/xdebug-handler/tree/3.0.5" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2024-05-06T16:37:16+00:00" + }, + { + "name": "dasprid/enum", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/DASPRiD/Enum.git", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "reference": "8dfd07c6d2cf31c8da90c53b83c026c7696dda90", + "shasum": "" + }, + "require": { + "php": ">=7.1 <9.0" + }, + "require-dev": { + "phpunit/phpunit": "^7 || ^8 || ^9 || ^10 || ^11", + "squizlabs/php_codesniffer": "*" + }, + "type": "library", + "autoload": { + "psr-4": { + "DASPRiD\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Ben Scholzen 'DASPRiD'", + "email": "mail@dasprids.de", + "homepage": "https://dasprids.de/", + "role": "Developer" + } + ], + "description": "PHP 7.1 enum implementation", + "keywords": [ + "enum", + "map" + ], + "support": { + "issues": "https://github.com/DASPRiD/Enum/issues", + "source": "https://github.com/DASPRiD/Enum/tree/1.0.6" + }, + "time": "2024-08-09T14:30:48+00:00" + }, + { + "name": "elasticsearch/elasticsearch", + "version": "v7.17.2", + "source": { + "type": "git", + "url": "https://github.com/elastic/elasticsearch-php.git", + "reference": "2d302233f2bb0926812d82823bb820d405e130fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/elastic/elasticsearch-php/zipball/2d302233f2bb0926812d82823bb820d405e130fc", + "reference": "2d302233f2bb0926812d82823bb820d405e130fc", + "shasum": "" + }, + "require": { + "ext-json": ">=1.3.7", + "ezimuel/ringphp": "^1.1.2", + "php": "^7.3 || ^8.0", + "psr/log": "^1|^2|^3" + }, + "require-dev": { + "ext-yaml": "*", + "ext-zip": "*", + "mockery/mockery": "^1.2", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^9.3", + "squizlabs/php_codesniffer": "^3.4", + "symfony/finder": "~4.0" + }, + "suggest": { + "ext-curl": "*", + "monolog/monolog": "Allows for client-level logging and tracing" + }, + "type": "library", + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "Elasticsearch\\": "src/Elasticsearch/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0", + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Zachary Tong" + }, + { + "name": "Enrico Zimuel" + } + ], + "description": "PHP Client for Elasticsearch", + "keywords": [ + "client", + "elasticsearch", + "search" + ], + "support": { + "issues": "https://github.com/elastic/elasticsearch-php/issues", + "source": "https://github.com/elastic/elasticsearch-php/tree/v7.17.2" + }, + "time": "2023-04-21T15:31:12+00:00" + }, + { + "name": "endroid/qr-code", + "version": "4.8.5", + "source": { + "type": "git", + "url": "https://github.com/endroid/qr-code.git", + "reference": "0db25b506a8411a5e1644ebaa67123a6eb7b6a77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/endroid/qr-code/zipball/0db25b506a8411a5e1644ebaa67123a6eb7b6a77", + "reference": "0db25b506a8411a5e1644ebaa67123a6eb7b6a77", + "shasum": "" + }, + "require": { + "bacon/bacon-qr-code": "^2.0.5", + "php": "^8.1" + }, + "conflict": { + "khanamiryan/qrcode-detector-decoder": "^1.0.6" + }, + "require-dev": { + "endroid/quality": "dev-master", + "ext-gd": "*", + "khanamiryan/qrcode-detector-decoder": "^1.0.4||^2.0.2", + "setasign/fpdf": "^1.8.2" + }, + "suggest": { + "ext-gd": "Enables you to write PNG images", + "khanamiryan/qrcode-detector-decoder": "Enables you to use the image validator", + "roave/security-advisories": "Makes sure package versions with known security issues are not installed", + "setasign/fpdf": "Enables you to use the PDF writer" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-4": { + "Endroid\\QrCode\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jeroen van den Enden", + "email": "info@endroid.nl" + } + ], + "description": "Endroid QR Code", + "homepage": "https://github.com/endroid/qr-code", + "keywords": [ + "code", + "endroid", + "php", + "qr", + "qrcode" + ], + "support": { + "issues": "https://github.com/endroid/qr-code/issues", + "source": "https://github.com/endroid/qr-code/tree/4.8.5" + }, + "funding": [ + { + "url": "https://github.com/endroid", + "type": "github" + } + ], + "time": "2023-09-29T14:03:20+00:00" + }, + { + "name": "ezimuel/guzzlestreams", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/ezimuel/guzzlestreams.git", + "reference": "b4b5a025dfee70d6cd34c780e07330eb93d5b997" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezimuel/guzzlestreams/zipball/b4b5a025dfee70d6cd34c780e07330eb93d5b997", + "reference": "b4b5a025dfee70d6cd34c780e07330eb93d5b997", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "~9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Fork of guzzle/streams (abandoned) to be used with elasticsearch-php", + "homepage": "http://guzzlephp.org/", + "keywords": [ + "Guzzle", + "stream" + ], + "support": { + "source": "https://github.com/ezimuel/guzzlestreams/tree/3.1.0" + }, + "time": "2022-10-24T12:58:50+00:00" + }, + { + "name": "ezimuel/ringphp", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/ezimuel/ringphp.git", + "reference": "7887fc8488013065f72f977dcb281994f5fde9f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezimuel/ringphp/zipball/7887fc8488013065f72f977dcb281994f5fde9f4", + "reference": "7887fc8488013065f72f977dcb281994f5fde9f4", + "shasum": "" + }, + "require": { + "ezimuel/guzzlestreams": "^3.0.1", + "php": ">=5.4.0", + "react/promise": "~2.0" + }, + "replace": { + "guzzlehttp/ringphp": "self.version" + }, + "require-dev": { + "ext-curl": "*", + "phpunit/phpunit": "~9.0" + }, + "suggest": { + "ext-curl": "Guzzle will use specific adapters if cURL is present" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Ring\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Fork of guzzle/RingPHP (abandoned) to be used with elasticsearch-php", + "support": { + "source": "https://github.com/ezimuel/ringphp/tree/1.2.2" + }, + "time": "2022-12-07T11:28:53+00:00" + }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.18.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/cb56001e54359df7ae76dc522d08845dc741621b", + "reference": "cb56001e54359df7ae76dc522d08845dc741621b", + "shasum": "" + }, + "require": { + "php": "~5.6.0 || ~7.0.0 || ~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "cerdic/css-tidy": "^1.7 || ^2.0", + "simpletest/simpletest": "dev-master" + }, + "suggest": { + "cerdic/css-tidy": "If you want to use the filter 'Filter.ExtractStyleBlocks'.", + "ext-bcmath": "Used for unit conversion and imagecrash protection", + "ext-iconv": "Converts text to and from non-UTF-8 encodings", + "ext-tidy": "Used for pretty-printing HTML" + }, + "type": "library", + "autoload": { + "files": [ + "library/HTMLPurifier.composer.php" + ], + "psr-0": { + "HTMLPurifier": "library/" + }, + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/v4.18.0" + }, + "time": "2024-11-01T03:51:45+00:00" + }, + { + "name": "firebase/php-jwt", + "version": "v6.10.2", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/30c19ed0f3264cb660ea496895cfb6ef7ee3653b", + "reference": "30c19ed0f3264cb660ea496895cfb6ef7ee3653b", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^7.4", + "phpspec/prophecy-phpunit": "^2.0", + "phpunit/phpunit": "^9.5", + "psr/cache": "^2.0||^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "type": "library", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.10.2" + }, + "time": "2024-11-24T11:22:49+00:00" + }, + { + "name": "google/recaptcha", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/google/recaptcha.git", + "reference": "d59a801e98a4e9174814a6d71bbc268dff1202df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/google/recaptcha/zipball/d59a801e98a4e9174814a6d71bbc268dff1202df", + "reference": "d59a801e98a4e9174814a6d71bbc268dff1202df", + "shasum": "" + }, + "require": { + "php": ">=8" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.14", + "php-coveralls/php-coveralls": "^2.5", + "phpunit/phpunit": "^10" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "ReCaptcha\\": "src/ReCaptcha" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Client library for reCAPTCHA, a free service that protects websites from spam and abuse.", + "homepage": "https://www.google.com/recaptcha/", + "keywords": [ + "Abuse", + "captcha", + "recaptcha", + "spam" + ], + "support": { + "forum": "https://groups.google.com/forum/#!forum/recaptcha", + "issues": "https://github.com/google/recaptcha/issues", + "source": "https://github.com/google/recaptcha" + }, + "time": "2023-02-18T17:41:46+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.9.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "guzzle/client-integration-tests": "3.0.2", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2024-07-24T11:22:20+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "reference": "f9c436286ab2892c7db7be8c8da4ef61ccf7b455", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2024-10-17T10:06:22+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.7.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2024-07-18T11:15:46+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/jsonrainbow/json-schema.git", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "reference": "feb2ca6dd1cebdaf1ed60a4c8de2e53ce11c4fd8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.35" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "support": { + "issues": "https://github.com/jsonrainbow/json-schema/issues", + "source": "https://github.com/jsonrainbow/json-schema/tree/5.3.0" + }, + "time": "2024-07-06T21:00:26+00:00" + }, + { + "name": "laminas/laminas-captcha", + "version": "2.17.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-captcha.git", + "reference": "981b3d1e287653b1fc5b71859964508ac0a2d7cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-captcha/zipball/981b3d1e287653b1fc5b71859964508ac0a2d7cb", + "reference": "981b3d1e287653b1fc5b71859964508ac0a2d7cb", + "shasum": "" + }, + "require": { + "laminas/laminas-recaptcha": "^3.4.0", + "laminas/laminas-session": "^2.12", + "laminas/laminas-stdlib": "^3.10.1", + "laminas/laminas-text": "^2.9.0", + "laminas/laminas-validator": "^2.19.0", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-captcha": "*" + }, + "require-dev": { + "ext-gd": "*", + "laminas/laminas-coding-standard": "~2.5.0", + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.1" + }, + "suggest": { + "laminas/laminas-i18n-resources": "Translations of captcha messages" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Captcha\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Generate and validate CAPTCHAs using Figlets, images, ReCaptcha, and more", + "homepage": "https://laminas.dev", + "keywords": [ + "captcha", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-captcha/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-captcha/issues", + "rss": "https://github.com/laminas/laminas-captcha/releases.atom", + "source": "https://github.com/laminas/laminas-captcha" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2023-10-18T10:03:37+00:00" + }, + { + "name": "laminas/laminas-code", + "version": "4.16.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-code.git", + "reference": "1793e78dad4108b594084d05d1fb818b85b110af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-code/zipball/1793e78dad4108b594084d05d1fb818b85b110af", + "reference": "1793e78dad4108b594084d05d1fb818b85b110af", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0.1", + "ext-phar": "*", + "laminas/laminas-coding-standard": "^3.0.0", + "laminas/laminas-stdlib": "^3.18.0", + "phpunit/phpunit": "^10.5.37", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.15.0" + }, + "suggest": { + "doctrine/annotations": "Doctrine\\Common\\Annotations >=1.0 for annotation features", + "laminas/laminas-stdlib": "Laminas\\Stdlib component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Code\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Extensions to the PHP Reflection API, static code scanning, and code generation", + "homepage": "https://laminas.dev", + "keywords": [ + "code", + "laminas", + "laminasframework" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-code/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-code/issues", + "rss": "https://github.com/laminas/laminas-code/releases.atom", + "source": "https://github.com/laminas/laminas-code" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-11-20T13:15:13+00:00" + }, + { + "name": "laminas/laminas-config", + "version": "3.10.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-config.git", + "reference": "b79e7dbd01889e4574526cf8d2b18f9d5b18384c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-config/zipball/b79e7dbd01889e4574526cf8d2b18f9d5b18384c", + "reference": "b79e7dbd01889e4574526cf8d2b18f9d5b18384c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laminas/laminas-stdlib": "^3.6", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/container": "^1.0" + }, + "conflict": { + "container-interop/container-interop": "<1.2.0", + "zendframework/zend-config": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^3.0.1", + "laminas/laminas-filter": "^2.39.0", + "laminas/laminas-i18n": "^2.29.0", + "laminas/laminas-servicemanager": "^3.23.0", + "phpunit/phpunit": "^10.5.38" + }, + "suggest": { + "laminas/laminas-filter": "^2.7.2; install if you want to use the Filter processor", + "laminas/laminas-i18n": "^2.7.4; install if you want to use the Translator processor", + "laminas/laminas-servicemanager": "^2.7.8 || ^3.3; if you need an extensible plugin manager for use with the Config Factory" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Config\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides a nested object property based user interface for accessing this configuration data within application code", + "homepage": "https://laminas.dev", + "keywords": [ + "config", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-config/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-config/issues", + "rss": "https://github.com/laminas/laminas-config/releases.atom", + "source": "https://github.com/laminas/laminas-config" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "abandoned": true, + "time": "2024-11-17T22:10:53+00:00" + }, + { + "name": "laminas/laminas-crypt", + "version": "3.12.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-crypt.git", + "reference": "ceab630494fc7a0d82ec39ad63947ef889a21be7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-crypt/zipball/ceab630494fc7a0d82ec39ad63947ef889a21be7", + "reference": "ceab630494fc7a0d82ec39ad63947ef889a21be7", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "laminas/laminas-math": "^3.4", + "laminas/laminas-stdlib": "^3.8", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/container": "^1.1" + }, + "conflict": { + "zendframework/zend-crypt": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.4.0", + "phpunit/phpunit": "^9.5.25" + }, + "suggest": { + "ext-openssl": "Required for most features of Laminas\\Crypt" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Crypt\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Strong cryptography tools and password hashing", + "homepage": "https://laminas.dev", + "keywords": [ + "crypt", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-crypt/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-crypt/issues", + "rss": "https://github.com/laminas/laminas-crypt/releases.atom", + "source": "https://github.com/laminas/laminas-crypt" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "abandoned": true, + "time": "2024-07-15T09:11:42+00:00" + }, + { + "name": "laminas/laminas-db", + "version": "2.20.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-db.git", + "reference": "207b9ee70a8b518913c1fad688d7a64fe89a8b91" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-db/zipball/207b9ee70a8b518913c1fad688d7a64fe89a8b91", + "reference": "207b9ee70a8b518913c1fad688d7a64fe89a8b91", + "shasum": "" + }, + "require": { + "laminas/laminas-stdlib": "^3.7.1", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-db": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.4.0", + "laminas/laminas-eventmanager": "^3.6.0", + "laminas/laminas-hydrator": "^4.7", + "laminas/laminas-servicemanager": "^3.19.0", + "phpunit/phpunit": "^9.5.25" + }, + "suggest": { + "laminas/laminas-eventmanager": "Laminas\\EventManager component", + "laminas/laminas-hydrator": "(^3.2 || ^4.3) Laminas\\Hydrator component for using HydratingResultSets", + "laminas/laminas-servicemanager": "Laminas\\ServiceManager component" + }, + "type": "library", + "extra": { + "laminas": { + "component": "Laminas\\Db", + "config-provider": "Laminas\\Db\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Db\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Database abstraction layer, SQL abstraction, result set abstraction, and RowDataGateway and TableDataGateway implementations", + "homepage": "https://laminas.dev", + "keywords": [ + "db", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-db/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-db/issues", + "rss": "https://github.com/laminas/laminas-db/releases.atom", + "source": "https://github.com/laminas/laminas-db" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-04-02T01:04:56+00:00" + }, + { + "name": "laminas/laminas-di", + "version": "3.14.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-di.git", + "reference": "63d86f64ccfa6c4f49e534e312cc89ca613ba3c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-di/zipball/63d86f64ccfa6c4f49e534e312cc89ca613ba3c5", + "reference": "63d86f64ccfa6c4f49e534e312cc89ca613ba3c5", + "shasum": "" + }, + "require": { + "laminas/laminas-stdlib": "^3.18.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "psr/container": "^1.1.1", + "psr/log": "^1.1.4 || ^2.0.0 || ^3.0.0" + }, + "conflict": { + "laminas/laminas-servicemanager": "<3.13.0", + "laminas/laminas-servicemanager-di": "*", + "zendframework/zend-di": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-servicemanager": "^3.22", + "mikey179/vfsstream": "^1.6.11@alpha", + "phpbench/phpbench": "^1.2.7", + "phpunit/phpunit": "^9.5.26", + "psalm/plugin-phpunit": "^0.18.0", + "squizlabs/php_codesniffer": "^3.7.1", + "vimeo/psalm": "^5.0" + }, + "suggest": { + "laminas/laminas-servicemanager": "An IoC container without auto wiring capabilities" + }, + "type": "library", + "extra": { + "laminas": { + "component": "Laminas\\Di", + "config-provider": "Laminas\\Di\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Di\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Automated dependency injection for PSR-11 containers", + "homepage": "https://laminas.dev", + "keywords": [ + "PSR-11", + "di", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-di/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-di/issues", + "rss": "https://github.com/laminas/laminas-di/releases.atom", + "source": "https://github.com/laminas/laminas-di" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-05-02T12:56:18+00:00" + }, + { + "name": "laminas/laminas-escaper", + "version": "2.14.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-escaper.git", + "reference": "0f7cb975f4443cf22f33408925c231225cfba8cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-escaper/zipball/0f7cb975f4443cf22f33408925c231225cfba8cb", + "reference": "0f7cb975f4443cf22f33408925c231225cfba8cb", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-mbstring": "*", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zend-escaper": "*" + }, + "require-dev": { + "infection/infection": "^0.27.9", + "laminas/laminas-coding-standard": "~3.0.0", + "maglnet/composer-require-checker": "^3.8.0", + "phpunit/phpunit": "^9.6.16", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.21.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Escaper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Securely and safely escape HTML, HTML attributes, JavaScript, CSS, and URLs", + "homepage": "https://laminas.dev", + "keywords": [ + "escaper", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-escaper/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-escaper/issues", + "rss": "https://github.com/laminas/laminas-escaper/releases.atom", + "source": "https://github.com/laminas/laminas-escaper" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-10-24T10:12:53+00:00" + }, + { + "name": "laminas/laminas-eventmanager", + "version": "3.14.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-eventmanager.git", + "reference": "1837cafaaaee74437f6d8ec9ff7da03e6f81d809" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-eventmanager/zipball/1837cafaaaee74437f6d8ec9ff7da03e6f81d809", + "reference": "1837cafaaaee74437f6d8ec9ff7da03e6f81d809", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "container-interop/container-interop": "<1.2", + "zendframework/zend-eventmanager": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~3.0.0", + "laminas/laminas-stdlib": "^3.20", + "phpbench/phpbench": "^1.3.1", + "phpunit/phpunit": "^10.5.38", + "psalm/plugin-phpunit": "^0.19.0", + "psr/container": "^1.1.2 || ^2.0.2", + "vimeo/psalm": "^5.26.1" + }, + "suggest": { + "laminas/laminas-stdlib": "^2.7.3 || ^3.0, to use the FilterChain feature", + "psr/container": "^1.1.2 || ^2.0.2, to use the lazy listeners feature" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\EventManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Trigger and listen to events within a PHP application", + "homepage": "https://laminas.dev", + "keywords": [ + "event", + "eventmanager", + "events", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-eventmanager/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-eventmanager/issues", + "rss": "https://github.com/laminas/laminas-eventmanager/releases.atom", + "source": "https://github.com/laminas/laminas-eventmanager" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-11-21T11:31:22+00:00" + }, + { + "name": "laminas/laminas-feed", + "version": "2.23.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-feed.git", + "reference": "23807e692b3174750b426143bd93572b71b6739a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-feed/zipball/23807e692b3174750b426143bd93572b71b6739a", + "reference": "23807e692b3174750b426143bd93572b71b6739a", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "laminas/laminas-escaper": "^2.9", + "laminas/laminas-stdlib": "^3.6", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "laminas/laminas-servicemanager": "<3.3", + "zendframework/zend-feed": "*" + }, + "require-dev": { + "laminas/laminas-cache": "^2.13.2 || ^3.12", + "laminas/laminas-cache-storage-adapter-memory": "^1.1.0 || ^2.3", + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-db": "^2.18", + "laminas/laminas-http": "^2.19", + "laminas/laminas-servicemanager": "^3.22.1", + "laminas/laminas-validator": "^2.46", + "phpunit/phpunit": "^10.5.5", + "psalm/plugin-phpunit": "^0.19.0", + "psr/http-message": "^2.0", + "vimeo/psalm": "^5.18.0" + }, + "suggest": { + "laminas/laminas-cache": "Laminas\\Cache component, for optionally caching feeds between requests", + "laminas/laminas-db": "Laminas\\Db component, for use with PubSubHubbub", + "laminas/laminas-http": "Laminas\\Http for PubSubHubbub, and optionally for use with Laminas\\Feed\\Reader", + "laminas/laminas-servicemanager": "Laminas\\ServiceManager component, for easily extending ExtensionManager implementations", + "laminas/laminas-validator": "Laminas\\Validator component, for validating email addresses used in Atom feeds and entries when using the Writer subcomponent", + "psr/http-message": "PSR-7 ^1.0.1, if you wish to use Laminas\\Feed\\Reader\\Http\\Psr7ResponseDecorator" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Feed\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides functionality for creating and consuming RSS and Atom feeds", + "homepage": "https://laminas.dev", + "keywords": [ + "atom", + "feed", + "laminas", + "rss" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-feed/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-feed/issues", + "rss": "https://github.com/laminas/laminas-feed/releases.atom", + "source": "https://github.com/laminas/laminas-feed" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-10-09T10:53:30+00:00" + }, + { + "name": "laminas/laminas-file", + "version": "2.13.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-file.git", + "reference": "54b354bff5dca67af3452b1f73a0ab66e4c4a5e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-file/zipball/54b354bff5dca67af3452b1f73a0ab66e4c4a5e5", + "reference": "54b354bff5dca67af3452b1f73a0ab66e4c4a5e5", + "shasum": "" + }, + "require": { + "laminas/laminas-stdlib": "^2.7.7 || ^3.15.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-file": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~1.0.0", + "laminas/laminas-filter": "^2.23.2", + "laminas/laminas-i18n": "^2.7.4", + "laminas/laminas-progressbar": "^2.5.2", + "laminas/laminas-servicemanager": "^2.7.8 || ^3.3", + "laminas/laminas-session": "^2.8", + "laminas/laminas-validator": "^2.10.1", + "phpunit/phpunit": "^9.5.10" + }, + "suggest": { + "laminas/laminas-filter": "Laminas\\Filter component", + "laminas/laminas-i18n": "Laminas\\I18n component", + "laminas/laminas-validator": "Laminas\\Validator component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\File\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Locate PHP classfiles", + "homepage": "https://laminas.dev", + "keywords": [ + "file", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-file/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-file/issues", + "rss": "https://github.com/laminas/laminas-file/releases.atom", + "source": "https://github.com/laminas/laminas-file" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "abandoned": true, + "time": "2023-11-21T14:05:55+00:00" + }, + { + "name": "laminas/laminas-filter", + "version": "2.39.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-filter.git", + "reference": "515f081cdbea90721bfbffdd15184564b256478e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-filter/zipball/515f081cdbea90721bfbffdd15184564b256478e", + "reference": "515f081cdbea90721bfbffdd15184564b256478e", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "laminas/laminas-servicemanager": "^3.21.0", + "laminas/laminas-stdlib": "^3.19.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "laminas/laminas-validator": "<2.10.1", + "zendframework/zend-filter": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~3.0", + "laminas/laminas-crypt": "^3.12", + "laminas/laminas-i18n": "^2.28.1", + "laminas/laminas-uri": "^2.12", + "pear/archive_tar": "^1.5.0", + "phpunit/phpunit": "^10.5.36", + "psalm/plugin-phpunit": "^0.19.0", + "psr/http-factory": "^1.1.0", + "vimeo/psalm": "^5.26.1" + }, + "suggest": { + "laminas/laminas-crypt": "Laminas\\Crypt component, for encryption filters", + "laminas/laminas-i18n": "Laminas\\I18n component for filters depending on i18n functionality", + "laminas/laminas-uri": "Laminas\\Uri component, for the UriNormalize filter", + "psr/http-factory-implementation": "psr/http-factory-implementation, for creating file upload instances when consuming PSR-7 in file upload filters" + }, + "type": "library", + "extra": { + "laminas": { + "component": "Laminas\\Filter", + "config-provider": "Laminas\\Filter\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Filter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Programmatically filter and normalize data and files", + "homepage": "https://laminas.dev", + "keywords": [ + "filter", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-filter/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-filter/issues", + "rss": "https://github.com/laminas/laminas-filter/releases.atom", + "source": "https://github.com/laminas/laminas-filter" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-10-31T21:18:49+00:00" + }, + { + "name": "laminas/laminas-http", + "version": "2.21.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-http.git", + "reference": "a9867e4d1cda3dbad208903239c83a3d670cce10" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-http/zipball/a9867e4d1cda3dbad208903239c83a3d670cce10", + "reference": "a9867e4d1cda3dbad208903239c83a3d670cce10", + "shasum": "" + }, + "require": { + "laminas/laminas-loader": "^2.10", + "laminas/laminas-stdlib": "^3.6", + "laminas/laminas-uri": "^2.11", + "laminas/laminas-validator": "^2.15 || ^3.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zend-http": "*" + }, + "require-dev": { + "ext-curl": "*", + "laminas/laminas-coding-standard": "~2.4.0", + "phpunit/phpunit": "^9.6.21" + }, + "suggest": { + "paragonie/certainty": "For automated management of cacert.pem" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Http\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Provides an easy interface for performing Hyper-Text Transfer Protocol (HTTP) requests", + "homepage": "https://laminas.dev", + "keywords": [ + "http", + "http client", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-http/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-http/issues", + "rss": "https://github.com/laminas/laminas-http/releases.atom", + "source": "https://github.com/laminas/laminas-http" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-12-04T09:17:39+00:00" + }, + { + "name": "laminas/laminas-i18n", + "version": "2.29.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-i18n.git", + "reference": "9aa7ef6073556e9b4cfd8d9a0cb8e41cd3883454" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-i18n/zipball/9aa7ef6073556e9b4cfd8d9a0cb8e41cd3883454", + "reference": "9aa7ef6073556e9b4cfd8d9a0cb8e41cd3883454", + "shasum": "" + }, + "require": { + "ext-intl": "*", + "laminas/laminas-servicemanager": "^3.21.0", + "laminas/laminas-stdlib": "^3.0", + "laminas/laminas-translator": "^1.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "laminas/laminas-view": "<2.20.0", + "zendframework/zend-i18n": "*" + }, + "require-dev": { + "laminas/laminas-cache": "^3.12.1", + "laminas/laminas-cache-storage-adapter-memory": "^2.3.0", + "laminas/laminas-cache-storage-deprecated-factory": "^1.2", + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-config": "^3.9.0", + "laminas/laminas-eventmanager": "^3.13", + "laminas/laminas-filter": "^2.34", + "laminas/laminas-validator": "^2.49", + "laminas/laminas-view": "^2.34", + "phpunit/phpunit": "^10.5.11", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.22.2" + }, + "suggest": { + "laminas/laminas-cache": "You should install this package to cache the translations", + "laminas/laminas-config": "You should install this package to use the INI translation format", + "laminas/laminas-eventmanager": "You should install this package to use the events in the translator", + "laminas/laminas-filter": "You should install this package to use the provided filters", + "laminas/laminas-i18n-resources": "This package provides validator and captcha translations", + "laminas/laminas-validator": "You should install this package to use the provided validators", + "laminas/laminas-view": "You should install this package to use the provided view helpers" + }, + "type": "library", + "extra": { + "laminas": { + "component": "Laminas\\I18n", + "config-provider": "Laminas\\I18n\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Laminas\\I18n\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Provide translations for your application, and filter and validate internationalized values", + "homepage": "https://laminas.dev", + "keywords": [ + "i18n", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-i18n/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-i18n/issues", + "rss": "https://github.com/laminas/laminas-i18n/releases.atom", + "source": "https://github.com/laminas/laminas-i18n" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-10-11T09:44:53+00:00" + }, + { + "name": "laminas/laminas-json", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-json.git", + "reference": "1931b26ac677f418f39cd0af6d0740e8f4a67d18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-json/zipball/1931b26ac677f418f39cd0af6d0740e8f4a67d18", + "reference": "1931b26ac677f418f39cd0af6d0740e8f4a67d18", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zend-json": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.4.0", + "laminas/laminas-stdlib": "^2.7.7 || ^3.19", + "phpunit/phpunit": "^9.5.25" + }, + "suggest": { + "laminas/laminas-json-server": "For implementing JSON-RPC servers", + "laminas/laminas-xml2json": "For converting XML documents to JSON" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Json\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "provides convenience methods for serializing native PHP to JSON and decoding JSON to native PHP", + "homepage": "https://laminas.dev", + "keywords": [ + "json", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-json/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-json/issues", + "rss": "https://github.com/laminas/laminas-json/releases.atom", + "source": "https://github.com/laminas/laminas-json" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "abandoned": true, + "time": "2024-10-25T09:02:25+00:00" + }, + { + "name": "laminas/laminas-loader", + "version": "2.11.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-loader.git", + "reference": "f2eedd3a6e774d965158fd11946bb1eba72e298c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-loader/zipball/f2eedd3a6e774d965158fd11946bb1eba72e298c", + "reference": "f2eedd3a6e774d965158fd11946bb1eba72e298c", + "shasum": "" + }, + "require": { + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zend-loader": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.4.0", + "phpunit/phpunit": "~9.5.25" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Loader\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Autoloading and plugin loading strategies", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "loader" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-loader/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-loader/issues", + "rss": "https://github.com/laminas/laminas-loader/releases.atom", + "source": "https://github.com/laminas/laminas-loader" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "abandoned": true, + "time": "2024-10-16T09:06:57+00:00" + }, + { + "name": "laminas/laminas-mail", + "version": "2.25.1", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-mail.git", + "reference": "110e04497395123998220e244cceecb167cc6dda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-mail/zipball/110e04497395123998220e244cceecb167cc6dda", + "reference": "110e04497395123998220e244cceecb167cc6dda", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "laminas/laminas-loader": "^2.9.0", + "laminas/laminas-mime": "^2.11.0", + "laminas/laminas-stdlib": "^3.17.0", + "laminas/laminas-validator": "^2.31.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "symfony/polyfill-intl-idn": "^1.27.0", + "symfony/polyfill-mbstring": "^1.27.0", + "webmozart/assert": "^1.11.0" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-db": "^2.18", + "laminas/laminas-servicemanager": "^3.22.1", + "phpunit/phpunit": "^10.4.2", + "psalm/plugin-phpunit": "^0.18.4", + "symfony/process": "^6.3.4", + "vimeo/psalm": "^5.15" + }, + "suggest": { + "laminas/laminas-servicemanager": "^3.21 when using SMTP to deliver messages" + }, + "type": "library", + "extra": { + "laminas": { + "component": "Laminas\\Mail", + "config-provider": "Laminas\\Mail\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Mail\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Provides generalized functionality to compose and send both text and MIME-compliant multipart e-mail messages", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "mail" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-mail/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-mail/issues", + "rss": "https://github.com/laminas/laminas-mail/releases.atom", + "source": "https://github.com/laminas/laminas-mail" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "abandoned": "symfony/mailer", + "time": "2023-11-02T10:32:34+00:00" + }, + { + "name": "laminas/laminas-math", + "version": "3.7.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-math.git", + "reference": "3e90445828fd64308de2a600b48c3df051b3b17a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-math/zipball/3e90445828fd64308de2a600b48c3df051b3b17a", + "reference": "3e90445828fd64308de2a600b48c3df051b3b17a", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-math": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.4.0", + "phpunit/phpunit": "~9.5.25" + }, + "suggest": { + "ext-bcmath": "If using the bcmath functionality", + "ext-gmp": "If using the gmp functionality" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2.x-dev", + "dev-develop": "3.3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Create cryptographically secure pseudo-random numbers, and manage big integers", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "math" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-math/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-math/issues", + "rss": "https://github.com/laminas/laminas-math/releases.atom", + "source": "https://github.com/laminas/laminas-math" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2023-10-18T09:53:37+00:00" + }, + { + "name": "laminas/laminas-mime", + "version": "2.12.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-mime.git", + "reference": "08cc544778829b7d68d27a097885bd6e7130135e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-mime/zipball/08cc544778829b7d68d27a097885bd6e7130135e", + "reference": "08cc544778829b7d68d27a097885bd6e7130135e", + "shasum": "" + }, + "require": { + "laminas/laminas-stdlib": "^2.7 || ^3.0", + "php": "~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-mime": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.4.0", + "laminas/laminas-mail": "^2.19.0", + "phpunit/phpunit": "~9.5.25" + }, + "suggest": { + "laminas/laminas-mail": "Laminas\\Mail component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Mime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Create and parse MIME messages and parts", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "mime" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-mime/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-mime/issues", + "rss": "https://github.com/laminas/laminas-mime/releases.atom", + "source": "https://github.com/laminas/laminas-mime" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "abandoned": "symfony/mime", + "time": "2023-11-02T16:47:19+00:00" + }, + { + "name": "laminas/laminas-modulemanager", + "version": "2.17.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-modulemanager.git", + "reference": "3cd6e84ba767b43a47c6c4245a56b30ac3738c6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-modulemanager/zipball/3cd6e84ba767b43a47c6c4245a56b30ac3738c6a", + "reference": "3cd6e84ba767b43a47c6c4245a56b30ac3738c6a", + "shasum": "" + }, + "require": { + "brick/varexporter": "^0.3.2 || ^0.4 || ^0.5", + "laminas/laminas-config": "^3.7", + "laminas/laminas-eventmanager": "^3.4", + "laminas/laminas-stdlib": "^3.6", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "webimpress/safe-writer": "^1.0.2 || ^2.1" + }, + "conflict": { + "amphp/amp": "<2.6.4", + "zendframework/zend-modulemanager": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^3.0.1", + "laminas/laminas-loader": "^2.11", + "laminas/laminas-mvc": "^3.7.0", + "laminas/laminas-servicemanager": "^3.23.0", + "phpunit/phpunit": "^10.5.38", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.26.1" + }, + "suggest": { + "laminas/laminas-console": "Laminas\\Console component", + "laminas/laminas-loader": "Laminas\\Loader component if you are not using Composer autoloading for your modules", + "laminas/laminas-mvc": "Laminas\\Mvc component", + "laminas/laminas-servicemanager": "Laminas\\ServiceManager component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\ModuleManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Modular application system for laminas-mvc applications", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "modulemanager" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-modulemanager/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-modulemanager/issues", + "rss": "https://github.com/laminas/laminas-modulemanager/releases.atom", + "source": "https://github.com/laminas/laminas-modulemanager" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-11-17T22:29:29+00:00" + }, + { + "name": "laminas/laminas-mvc", + "version": "3.8.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-mvc.git", + "reference": "53ba28b7222d3a3b49747a26babef43d1b17fb6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-mvc/zipball/53ba28b7222d3a3b49747a26babef43d1b17fb6f", + "reference": "53ba28b7222d3a3b49747a26babef43d1b17fb6f", + "shasum": "" + }, + "require": { + "container-interop/container-interop": "^1.2", + "laminas/laminas-eventmanager": "^3.4", + "laminas/laminas-http": "^2.15", + "laminas/laminas-modulemanager": "^2.16", + "laminas/laminas-router": "^3.11.1", + "laminas/laminas-servicemanager": "^3.20.0", + "laminas/laminas-stdlib": "^3.19", + "laminas/laminas-view": "^2.18.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zend-mvc": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.5.0", + "laminas/laminas-json": "^3.6", + "phpunit/phpunit": "^10.5.38", + "webmozart/assert": "^1.11" + }, + "suggest": { + "laminas/laminas-json": "(^2.6.1 || ^3.0) To auto-deserialize JSON body content in AbstractRestfulController extensions, when json_decode is unavailable", + "laminas/laminas-log": "^2.9.1 To provide log functionality via LogFilterManager, LogFormatterManager, and LogProcessorManager", + "laminas/laminas-mvc-console": "laminas-mvc-console provides the ability to expose laminas-mvc as a console application", + "laminas/laminas-mvc-i18n": "laminas-mvc-i18n provides integration with laminas-i18n, including a translation bridge and translatable route segments", + "laminas/laminas-mvc-middleware": "To dispatch middleware in your laminas-mvc application", + "laminas/laminas-mvc-plugin-fileprg": "To provide Post/Redirect/Get functionality around forms that container file uploads", + "laminas/laminas-mvc-plugin-flashmessenger": "To provide flash messaging capabilities between requests", + "laminas/laminas-mvc-plugin-identity": "To access the authenticated identity (per laminas-authentication) in controllers", + "laminas/laminas-mvc-plugin-prg": "To provide Post/Redirect/Get functionality within controllers", + "laminas/laminas-paginator": "^2.7 To provide pagination functionality via PaginatorPluginManager", + "laminas/laminas-servicemanager-di": "laminas-servicemanager-di provides utilities for integrating laminas-di and laminas-servicemanager in your laminas-mvc application" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Mvc\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Laminas's event-driven MVC layer, including MVC Applications, Controllers, and Plugins", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "mvc" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-mvc/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-mvc/issues", + "rss": "https://github.com/laminas/laminas-mvc/releases.atom", + "source": "https://github.com/laminas/laminas-mvc" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-11-18T00:14:29+00:00" + }, + { + "name": "laminas/laminas-oauth", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-oauth.git", + "reference": "5182456ec570c6dd6c04003349ab65d9bd553850" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-oauth/zipball/5182456ec570c6dd6c04003349ab65d9bd553850", + "reference": "5182456ec570c6dd6c04003349ab65d9bd553850", + "shasum": "" + }, + "require": { + "laminas/laminas-config": "^3.7", + "laminas/laminas-crypt": "^3.6.0", + "laminas/laminas-http": "^2.15", + "laminas/laminas-i18n": "^2.13.0", + "laminas/laminas-loader": "^2.8", + "laminas/laminas-math": "^3.5", + "laminas/laminas-stdlib": "^3.10", + "laminas/laminas-uri": "^2.9", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zendoauth": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.5.0", + "phpunit/phpunit": "^9.6.20" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\OAuth\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "oauth" + ], + "support": { + "chat": "https://laminas.dev/chat", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-oauth/issues", + "rss": "https://github.com/laminas/laminas-oauth/releases.atom", + "source": "https://github.com/laminas/laminas-oauth" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "abandoned": true, + "time": "2024-10-23T13:17:27+00:00" + }, + { + "name": "laminas/laminas-permissions-acl", + "version": "2.17.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-permissions-acl.git", + "reference": "96d710d0a8e6cfa781b2ba184a3dd397634ae2e7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-permissions-acl/zipball/96d710d0a8e6cfa781b2ba184a3dd397634ae2e7", + "reference": "96d710d0a8e6cfa781b2ba184a3dd397634ae2e7", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "laminas/laminas-servicemanager": "<3.0", + "zendframework/zend-permissions-acl": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^3.0.1", + "laminas/laminas-servicemanager": "^3.21", + "phpbench/phpbench": "^1.2.10", + "phpunit/phpunit": "^10.5.38", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.26.1" + }, + "suggest": { + "laminas/laminas-servicemanager": "To support Laminas\\Permissions\\Acl\\Assertion\\AssertionManager plugin manager usage" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Permissions\\Acl\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Provides a lightweight and flexible access control list (ACL) implementation for privileges management", + "homepage": "https://laminas.dev", + "keywords": [ + "acl", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-permissions-acl/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-permissions-acl/issues", + "rss": "https://github.com/laminas/laminas-permissions-acl/releases.atom", + "source": "https://github.com/laminas/laminas-permissions-acl" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-11-25T10:38:49+00:00" + }, + { + "name": "laminas/laminas-recaptcha", + "version": "3.8.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-recaptcha.git", + "reference": "ab4efc2768b1d9e90df9a49301158ec288cd48dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-recaptcha/zipball/ab4efc2768b1d9e90df9a49301158ec288cd48dd", + "reference": "ab4efc2768b1d9e90df9a49301158ec288cd48dd", + "shasum": "" + }, + "require": { + "ext-json": "*", + "laminas/laminas-http": "^2.15", + "laminas/laminas-stdlib": "^3.10.1", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zendservice-recaptcha": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-config": "^3.9", + "laminas/laminas-validator": "^2.30.1", + "phpunit/phpunit": "^9.6.15", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.19" + }, + "suggest": { + "laminas/laminas-validator": "~2.0, if using ReCaptcha's Mailhide API" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\ReCaptcha\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "OOP wrapper for the ReCaptcha web service", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "recaptcha" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-recaptcha/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-recaptcha/issues", + "rss": "https://github.com/laminas/laminas-recaptcha/releases.atom", + "source": "https://github.com/laminas/laminas-recaptcha" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-10-24T08:57:20+00:00" + }, + { + "name": "laminas/laminas-router", + "version": "3.14.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-router.git", + "reference": "5e1f5ca7fe95200661b50235c891ed3eee02d3f0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-router/zipball/5e1f5ca7fe95200661b50235c891ed3eee02d3f0", + "reference": "5e1f5ca7fe95200661b50235c891ed3eee02d3f0", + "shasum": "" + }, + "require": { + "laminas/laminas-http": "^2.15", + "laminas/laminas-servicemanager": "^3.14.0", + "laminas/laminas-stdlib": "^3.10.1", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zend-router": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-i18n": "^2.29.0", + "phpunit/phpunit": "^10.5.36", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.26.1" + }, + "suggest": { + "laminas/laminas-i18n": "^2.15.0 if defining translatable HTTP path segments" + }, + "type": "library", + "extra": { + "laminas": { + "component": "Laminas\\Router", + "config-provider": "Laminas\\Router\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Router\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Flexible routing system for HTTP and console applications", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "routing" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-router/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-router/issues", + "rss": "https://github.com/laminas/laminas-router/releases.atom", + "source": "https://github.com/laminas/laminas-router" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-10-11T11:18:03+00:00" + }, + { + "name": "laminas/laminas-server", + "version": "2.17.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-server.git", + "reference": "9d9375f05d179402b39d3b69e9dc103cea7cb567" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-server/zipball/9d9375f05d179402b39d3b69e9dc103cea7cb567", + "reference": "9d9375f05d179402b39d3b69e9dc103cea7cb567", + "shasum": "" + }, + "require": { + "laminas/laminas-code": "^4.7.1", + "laminas/laminas-stdlib": "^3.3.1", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0" + }, + "conflict": { + "zendframework/zend-server": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.5.0", + "phpunit/phpunit": "^9.5.5", + "psalm/plugin-phpunit": "^0.18.0", + "vimeo/psalm": "^4.6.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Server\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Create Reflection-based RPC servers", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "server" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-server/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-server/issues", + "rss": "https://github.com/laminas/laminas-server/releases.atom", + "source": "https://github.com/laminas/laminas-server" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-02-05T09:59:22+00:00" + }, + { + "name": "laminas/laminas-servicemanager", + "version": "3.23.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-servicemanager.git", + "reference": "a8640182b892b99767d54404d19c5c3b3699f79b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-servicemanager/zipball/a8640182b892b99767d54404d19c5c3b3699f79b", + "reference": "a8640182b892b99767d54404d19c5c3b3699f79b", + "shasum": "" + }, + "require": { + "laminas/laminas-stdlib": "^3.19", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/container": "^1.0" + }, + "conflict": { + "ext-psr": "*", + "laminas/laminas-code": "<4.10.0", + "zendframework/zend-code": "<3.3.1", + "zendframework/zend-servicemanager": "*" + }, + "provide": { + "psr/container-implementation": "^1.0" + }, + "replace": { + "container-interop/container-interop": "^1.2.0" + }, + "require-dev": { + "composer/package-versions-deprecated": "^1.11.99.5", + "friendsofphp/proxy-manager-lts": "^1.0.18", + "laminas/laminas-code": "^4.14.0", + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-container-config-test": "^0.8", + "mikey179/vfsstream": "^1.6.12", + "phpbench/phpbench": "^1.3.1", + "phpunit/phpunit": "^10.5.36", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.26.1" + }, + "suggest": { + "friendsofphp/proxy-manager-lts": "ProxyManager ^2.1.1 to handle lazy initialization of services" + }, + "bin": [ + "bin/generate-deps-for-config-factory", + "bin/generate-factory-for-class" + ], + "type": "library", + "autoload": { + "files": [ + "src/autoload.php" + ], + "psr-4": { + "Laminas\\ServiceManager\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Factory-Driven Dependency Injection Container", + "homepage": "https://laminas.dev", + "keywords": [ + "PSR-11", + "dependency-injection", + "di", + "dic", + "laminas", + "service-manager", + "servicemanager" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-servicemanager/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-servicemanager/issues", + "rss": "https://github.com/laminas/laminas-servicemanager/releases.atom", + "source": "https://github.com/laminas/laminas-servicemanager" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-10-28T21:32:16+00:00" + }, + { + "name": "laminas/laminas-session", + "version": "2.22.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-session.git", + "reference": "97639e1b2392730b24aa7563e8e09fd22f6f6b1f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-session/zipball/97639e1b2392730b24aa7563e8e09fd22f6f6b1f", + "reference": "97639e1b2392730b24aa7563e8e09fd22f6f6b1f", + "shasum": "" + }, + "require": { + "laminas/laminas-eventmanager": "^3.12", + "laminas/laminas-servicemanager": "^3.22", + "laminas/laminas-stdlib": "^3.18", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "amphp/amp": "<2.6.4", + "zendframework/zend-session": "*" + }, + "require-dev": { + "ext-xdebug": "*", + "laminas/laminas-cache": "^3.12.2", + "laminas/laminas-cache-storage-adapter-memory": "^2.3", + "laminas/laminas-coding-standard": "~3.0.1", + "laminas/laminas-db": "^2.20.0", + "laminas/laminas-http": "^2.20", + "laminas/laminas-validator": "^2.64.1", + "mongodb/mongodb": "~1.20.0", + "phpunit/phpunit": "^10.5.38", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.26.1" + }, + "suggest": { + "laminas/laminas-cache": "Laminas\\Cache component", + "laminas/laminas-db": "Laminas\\Db component", + "laminas/laminas-http": "Laminas\\Http component", + "laminas/laminas-servicemanager": "Laminas\\ServiceManager component", + "laminas/laminas-validator": "Laminas\\Validator component", + "mongodb/mongodb": "If you want to use the MongoDB session save handler" + }, + "type": "library", + "extra": { + "laminas": { + "component": "Laminas\\Session", + "config-provider": "Laminas\\Session\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Session\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Object-oriented interface to PHP sessions and storage", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "session" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-session/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-session/issues", + "rss": "https://github.com/laminas/laminas-session/releases.atom", + "source": "https://github.com/laminas/laminas-session" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-11-17T00:02:53+00:00" + }, + { + "name": "laminas/laminas-soap", + "version": "2.14.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-soap.git", + "reference": "f8a7844803cc931c4233f6b1cfbcf7b8272f59e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-soap/zipball/f8a7844803cc931c4233f6b1cfbcf7b8272f59e5", + "reference": "f8a7844803cc931c4233f6b1cfbcf7b8272f59e5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-soap": "*", + "laminas/laminas-server": "^2.15", + "laminas/laminas-stdlib": "^3.16", + "laminas/laminas-uri": "^2.10", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "amphp/amp": "<2.6.4", + "laminas/laminas-code": "<4.4", + "zendframework/zend-soap": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.5", + "laminas/laminas-config": "^3.9", + "laminas/laminas-http": "^2.18", + "phpspec/prophecy-phpunit": "^2.0.2", + "phpunit/phpunit": "^9.6.21", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^4.30" + }, + "suggest": { + "ext-curl": "Curl is required when .NET compatibility is required", + "laminas/laminas-http": "Laminas\\Http component" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Soap\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "soap" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-soap/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-soap/issues", + "rss": "https://github.com/laminas/laminas-soap/releases.atom", + "source": "https://github.com/laminas/laminas-soap" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-11-29T09:45:43+00:00" + }, + { + "name": "laminas/laminas-stdlib", + "version": "3.20.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-stdlib.git", + "reference": "8974a1213be42c3e2f70b2c27b17f910291ab2f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-stdlib/zipball/8974a1213be42c3e2f70b2c27b17f910291ab2f4", + "reference": "8974a1213be42c3e2f70b2c27b17f910291ab2f4", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zend-stdlib": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^3.0", + "phpbench/phpbench": "^1.3.1", + "phpunit/phpunit": "^10.5.38", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.26.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Stdlib\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "SPL extensions, array utilities, error handlers, and more", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "stdlib" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-stdlib/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-stdlib/issues", + "rss": "https://github.com/laminas/laminas-stdlib/releases.atom", + "source": "https://github.com/laminas/laminas-stdlib" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-10-29T13:46:07+00:00" + }, + { + "name": "laminas/laminas-text", + "version": "2.12.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-text.git", + "reference": "6e9a39b85d3b718d36fb1c7c452dbd32531ff4f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-text/zipball/6e9a39b85d3b718d36fb1c7c452dbd32531ff4f8", + "reference": "6e9a39b85d3b718d36fb1c7c452dbd32531ff4f8", + "shasum": "" + }, + "require": { + "laminas/laminas-servicemanager": "^3.22.0", + "laminas/laminas-stdlib": "^3.7.1", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zend-text": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^3.0.1", + "phpunit/phpunit": "^10.5.38", + "psalm/plugin-phpunit": "^0.18.4", + "vimeo/psalm": "^5.26.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Text\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Create FIGlets and text-based tables", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "text" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-text/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-text/issues", + "rss": "https://github.com/laminas/laminas-text/releases.atom", + "source": "https://github.com/laminas/laminas-text" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-11-13T21:28:26+00:00" + }, + { + "name": "laminas/laminas-translator", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-translator.git", + "reference": "12897e710e21413c1f93fc38fe9dead6b51c5218" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-translator/zipball/12897e710e21413c1f93fc38fe9dead6b51c5218", + "reference": "12897e710e21413c1f93fc38fe9dead6b51c5218", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~3.0.0", + "vimeo/psalm": "^5.24.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Translator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Interfaces for the Translator component of laminas-i18n", + "homepage": "https://laminas.dev", + "keywords": [ + "i18n", + "laminas" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-i18n/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-translator/issues", + "rss": "https://github.com/laminas/laminas-translator/releases.atom", + "source": "https://github.com/laminas/laminas-translator" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-10-21T15:33:01+00:00" + }, + { + "name": "laminas/laminas-uri", + "version": "2.13.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-uri.git", + "reference": "de53600ae8153b3605bb6edce8aeeef524eaafba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-uri/zipball/de53600ae8153b3605bb6edce8aeeef524eaafba", + "reference": "de53600ae8153b3605bb6edce8aeeef524eaafba", + "shasum": "" + }, + "require": { + "laminas/laminas-escaper": "^2.9", + "laminas/laminas-validator": "^2.39 || ^3.0", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "conflict": { + "zendframework/zend-uri": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "~2.4.0", + "phpunit/phpunit": "^9.6.20" + }, + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\Uri\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "A component that aids in manipulating and validating » Uniform Resource Identifiers (URIs)", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "uri" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-uri/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-uri/issues", + "rss": "https://github.com/laminas/laminas-uri/releases.atom", + "source": "https://github.com/laminas/laminas-uri" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-12-03T12:27:51+00:00" + }, + { + "name": "laminas/laminas-validator", + "version": "2.64.2", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-validator.git", + "reference": "771e504760448ac7af660710237ceb93be602e08" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-validator/zipball/771e504760448ac7af660710237ceb93be602e08", + "reference": "771e504760448ac7af660710237ceb93be602e08", + "shasum": "" + }, + "require": { + "laminas/laminas-servicemanager": "^3.21.0", + "laminas/laminas-stdlib": "^3.19", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/http-message": "^1.0.1 || ^2.0.0" + }, + "conflict": { + "zendframework/zend-validator": "*" + }, + "require-dev": { + "laminas/laminas-coding-standard": "^2.5", + "laminas/laminas-db": "^2.20", + "laminas/laminas-filter": "^2.35.2", + "laminas/laminas-i18n": "^2.26.0", + "laminas/laminas-session": "^2.20", + "laminas/laminas-uri": "^2.11.0", + "phpunit/phpunit": "^10.5.20", + "psalm/plugin-phpunit": "^0.19.0", + "psr/http-client": "^1.0.3", + "psr/http-factory": "^1.1.0", + "vimeo/psalm": "^5.24.0" + }, + "suggest": { + "laminas/laminas-db": "Laminas\\Db component, required by the (No)RecordExists validator", + "laminas/laminas-filter": "Laminas\\Filter component, required by the Digits validator", + "laminas/laminas-i18n": "Laminas\\I18n component to allow translation of validation error messages", + "laminas/laminas-i18n-resources": "Translations of validator messages", + "laminas/laminas-servicemanager": "Laminas\\ServiceManager component to allow using the ValidatorPluginManager and validator chains", + "laminas/laminas-session": "Laminas\\Session component, ^2.8; required by the Csrf validator", + "laminas/laminas-uri": "Laminas\\Uri component, required by the Uri and Sitemap\\Loc validators", + "psr/http-message": "psr/http-message, required when validating PSR-7 UploadedFileInterface instances via the Upload and UploadFile validators" + }, + "type": "library", + "extra": { + "laminas": { + "component": "Laminas\\Validator", + "config-provider": "Laminas\\Validator\\ConfigProvider" + } + }, + "autoload": { + "psr-4": { + "Laminas\\Validator\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Validation classes for a wide range of domains, and the ability to chain validators to create complex validation criteria", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "validator" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-validator/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-validator/issues", + "rss": "https://github.com/laminas/laminas-validator/releases.atom", + "source": "https://github.com/laminas/laminas-validator" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-11-26T21:29:17+00:00" + }, + { + "name": "laminas/laminas-view", + "version": "2.36.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-view.git", + "reference": "ddc9207725cb50508ea48fcf1210dc8480264196" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-view/zipball/ddc9207725cb50508ea48fcf1210dc8480264196", + "reference": "ddc9207725cb50508ea48fcf1210dc8480264196", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-filter": "*", + "ext-json": "*", + "laminas/laminas-escaper": "^2.5", + "laminas/laminas-eventmanager": "^3.4", + "laminas/laminas-json": "^3.3", + "laminas/laminas-servicemanager": "^3.21.0", + "laminas/laminas-stdlib": "^3.10.1", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/container": "^1 || ^2" + }, + "conflict": { + "container-interop/container-interop": "<1.2", + "laminas/laminas-router": "<3.0.1", + "laminas/laminas-session": "<2.12", + "zendframework/zend-view": "*" + }, + "require-dev": { + "laminas/laminas-authentication": "^2.18", + "laminas/laminas-coding-standard": "~2.5.0", + "laminas/laminas-feed": "^2.23", + "laminas/laminas-filter": "^2.39", + "laminas/laminas-http": "^2.20", + "laminas/laminas-i18n": "^2.29.0", + "laminas/laminas-modulemanager": "^2.17", + "laminas/laminas-mvc": "^3.8.0", + "laminas/laminas-mvc-i18n": "^1.9", + "laminas/laminas-mvc-plugin-flashmessenger": "^1.10.1", + "laminas/laminas-navigation": "^2.20.0", + "laminas/laminas-paginator": "^2.19.0", + "laminas/laminas-permissions-acl": "^2.16", + "laminas/laminas-router": "^3.14.0", + "laminas/laminas-uri": "^2.12", + "phpunit/phpunit": "^10.5.38", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.26.1" + }, + "suggest": { + "laminas/laminas-authentication": "Laminas\\Authentication component", + "laminas/laminas-feed": "Laminas\\Feed component", + "laminas/laminas-filter": "Laminas\\Filter component", + "laminas/laminas-http": "Laminas\\Http component", + "laminas/laminas-i18n": "Laminas\\I18n component", + "laminas/laminas-mvc": "Laminas\\Mvc component", + "laminas/laminas-mvc-plugin-flashmessenger": "laminas-mvc-plugin-flashmessenger component, if you want to use the FlashMessenger view helper with laminas-mvc versions 3 and up", + "laminas/laminas-navigation": "Laminas\\Navigation component", + "laminas/laminas-paginator": "Laminas\\Paginator component", + "laminas/laminas-permissions-acl": "Laminas\\Permissions\\Acl component", + "laminas/laminas-uri": "Laminas\\Uri component" + }, + "bin": [ + "bin/templatemap_generator.php" + ], + "type": "library", + "autoload": { + "psr-4": { + "Laminas\\View\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Flexible view layer supporting and providing multiple view layers, helpers, and more", + "homepage": "https://laminas.dev", + "keywords": [ + "laminas", + "view" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-view/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-view/issues", + "rss": "https://github.com/laminas/laminas-view/releases.atom", + "source": "https://github.com/laminas/laminas-view" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-11-21T17:42:20+00:00" + }, + { + "name": "league/flysystem", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/8aaffb653c5777781b0f7f69a5d937baf7ab6cdb", + "reference": "8aaffb653c5777781b0f7f69a5d937baf7ab6cdb", + "shasum": "" + }, + "require": { + "ext-json": "*", + "league/mime-type-detection": "^1.0.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "guzzlehttp/ringphp": "<1.1.1" + }, + "require-dev": { + "async-aws/s3": "^1.5", + "async-aws/simple-s3": "^1.0", + "aws/aws-sdk-php": "^3.132.4", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "friendsofphp/php-cs-fixer": "^3.2", + "google/cloud-storage": "^1.23", + "phpseclib/phpseclib": "^2.0", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^8.5 || ^9.4", + "sabre/dav": "^4.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "File storage abstraction for PHP", + "keywords": [ + "WebDAV", + "aws", + "cloud", + "file", + "files", + "filesystem", + "filesystems", + "ftp", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/2.5.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-09-17T21:02:32+00:00" + }, + { + "name": "league/flysystem-aws-s3-v3", + "version": "2.5.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", + "reference": "2ae435f7177fd5d3afc0090bc7f849093d8361e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/2ae435f7177fd5d3afc0090bc7f849093d8361e8", + "reference": "2ae435f7177fd5d3afc0090bc7f849093d8361e8", + "shasum": "" + }, + "require": { + "aws/aws-sdk-php": "^3.132.4", + "league/flysystem": "^2.0.0", + "league/mime-type-detection": "^1.0.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "guzzlehttp/ringphp": "<1.1.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\Flysystem\\AwsS3V3\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "AWS S3 filesystem adapter for Flysystem.", + "keywords": [ + "Flysystem", + "aws", + "file", + "files", + "filesystem", + "s3", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues", + "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/2.5.0" + }, + "funding": [ + { + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2022-09-09T19:33:51+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/2d6702ff215bf922936ccc1ad31007edc76451b9", + "reference": "2d6702ff215bf922936ccc1ad31007edc76451b9", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3 || ^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.16.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2024-09-21T08:32:55+00:00" + }, + { + "name": "magento/adobe-stock-integration", + "version": "2.1.6-p3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/adobe-stock-integration/magento-adobe-stock-integration-2.1.6.0-patch3.zip", + "shasum": "2e7863ec421b91d7ccafdba2342e72b0de6f9205" + }, + "require": { + "magento/module-adobe-stock-admin-ui": "1.3.4", + "magento/module-adobe-stock-asset": "1.3.3", + "magento/module-adobe-stock-asset-api": "2.0.3", + "magento/module-adobe-stock-client": "1.3.4", + "magento/module-adobe-stock-client-api": "2.1.4", + "magento/module-adobe-stock-image": "1.3.5", + "magento/module-adobe-stock-image-admin-ui": "1.3.5-p1", + "magento/module-adobe-stock-image-api": "1.3.3" + }, + "type": "metapackage", + "description": "Adobe Stock integration" + }, + { + "name": "magento/composer", + "version": "1.10.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/composer/magento-composer-1.10.0.0.zip", + "shasum": "bc98a70186d72c2ae58ef346795623b585f36103" + }, + "require": { + "composer/composer": "^2.0", + "php": "~7.4.0||~8.1.0||~8.2.0||~8.3.0", + "symfony/console": "~4.4.0||~5.4.0||~6.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9" + }, + "type": "library", + "autoload": { + "psr-4": { + "Magento\\Composer\\": "src" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento composer library helps to instantiate Composer application and run composer commands." + }, + { + "name": "magento/composer-dependency-version-audit-plugin", + "version": "0.1.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/composer-dependency-version-audit-plugin/magento-composer-dependency-version-audit-plugin-0.1.5.0.zip", + "shasum": "5bbab92d2727217628a6806ad59d6c7fe1ec0651" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "composer/composer": "^1.9 || ^2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9" + }, + "type": "composer-plugin", + "extra": { + "class": "Magento\\ComposerDependencyVersionAuditPlugin\\Plugin" + }, + "autoload": { + "psr-4": { + "Magento\\ComposerDependencyVersionAuditPlugin\\": "src/" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Validating packages through a composer plugin" + }, + { + "name": "magento/composer-root-update-plugin", + "version": "2.0.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/composer-root-update-plugin/magento-composer-root-update-plugin-2.0.4.0.zip", + "shasum": "797117ccf0df9d8fe16b88c83d59ac203eb0a2b9" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "composer/composer": "^1.0 || ^2.0", + "php": "~7.3.0||~7.4.0||~8.0.0||~8.1.0||~8.2.0||~8.3.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Magento\\ComposerRootUpdatePlugin\\Plugin\\PluginDefinition" + }, + "autoload": { + "psr-4": { + "Magento\\ComposerRootUpdatePlugin\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Plugin to look ahead for Magento Open Source or Adobe Commerce project root changes when running composer update for new magento/product or magento/magento-cloud metapackage versions" + }, + { + "name": "magento/framework", + "version": "103.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/framework/magento-framework-103.0.7.0.zip", + "shasum": "7f4bbee39e769af64d545427f4bc90a83636d56a" + }, + "require": { + "colinmollenhour/php-redis-session-abstract": "^1.5", + "composer/composer": "^2.0, !=2.2.16", + "ext-bcmath": "*", + "ext-curl": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-hash": "*", + "ext-iconv": "*", + "ext-intl": "*", + "ext-openssl": "*", + "ext-simplexml": "*", + "ext-sodium": "*", + "ext-xsl": "*", + "ezyang/htmlpurifier": "^4.17", + "guzzlehttp/guzzle": "^7.5", + "laminas/laminas-code": "^4.13", + "laminas/laminas-escaper": "^2.13", + "laminas/laminas-file": "^2.13", + "laminas/laminas-filter": "^2.33", + "laminas/laminas-http": "^2.15", + "laminas/laminas-i18n": "^2.17", + "laminas/laminas-mail": "^2.16", + "laminas/laminas-mime": "^2.9", + "laminas/laminas-oauth": "^2.6", + "laminas/laminas-permissions-acl": "^2.10", + "laminas/laminas-stdlib": "^3.11", + "laminas/laminas-uri": "^2.9", + "laminas/laminas-validator": "^2.23", + "lib-libxml": "*", + "magento/composer-dependency-version-audit-plugin": "^0.1", + "magento/zend-cache": "^1.16", + "magento/zend-db": "^1.16", + "magento/zend-pdf": "^1.16", + "monolog/monolog": "^2.7", + "php": "~8.1.0||~8.2.0||~8.3.0", + "psr/log": "^2 || ^3", + "ramsey/uuid": "^4.2", + "symfony/console": "^6.4", + "symfony/intl": "^6.4", + "symfony/process": "^6.4", + "tedivm/jshrink": "^1.4", + "webonyx/graphql-php": "^15.0", + "wikimedia/less.php": "^3.2" + }, + "suggest": { + "ext-imagick": "Use Image Magick >=3.0.0 as an optional alternative image processing library" + }, + "type": "magento2-library", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Framework\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/framework-amqp", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/framework-amqp/magento-framework-amqp-100.4.5.0.zip", + "shasum": "919002d81d51a2b8060c9bc78ee13392e0369c00" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0", + "php-amqplib/php-amqplib": "~3.2.0" + }, + "type": "magento2-library", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Framework\\Amqp\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/framework-bulk", + "version": "101.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/framework-bulk/magento-framework-bulk-101.0.3.0.zip", + "shasum": "f50334fb3ef6e72ba5a85be1db44bb0a269e6bc6" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-library", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Framework\\Bulk\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/framework-message-queue", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/framework-message-queue/magento-framework-message-queue-100.4.7.0.zip", + "shasum": "df147ae93c69d2a1daddb653dcfd4c984478fb4f" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-library", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Framework\\MessageQueue\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/inventory-composer-installer", + "version": "1.2.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/inventory-composer-installer/magento-inventory-composer-installer-1.2.0.0.zip", + "shasum": "b96336d0a80d70b39f225eeba240abbbf7820f78" + }, + "require": { + "composer-plugin-api": "^1.1 || ^2.0", + "composer/composer": "^1.9 || ^2.0", + "magento/framework": "*" + }, + "type": "composer-plugin", + "extra": { + "class": "Magento\\InventoryComposerInstaller\\Plugin" + }, + "autoload": { + "psr-4": { + "Magento\\InventoryComposerInstaller\\": "src" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Composer plugin for Magento Multi Source Inventory" + }, + { + "name": "magento/inventory-metapackage", + "version": "1.2.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/inventory-metapackage/magento-inventory-metapackage-1.2.7.0.zip", + "shasum": "8e17dc31cbc35d49b5f86790a32cff26c1ed42a0" + }, + "require": { + "magento/inventory-composer-installer": "^1.2.0", + "magento/module-inventory": "1.2.5", + "magento/module-inventory-admin-ui": "1.2.5", + "magento/module-inventory-advanced-checkout": "1.2.4", + "magento/module-inventory-api": "1.2.5", + "magento/module-inventory-bundle-import-export": "1.1.3", + "magento/module-inventory-bundle-product": "1.2.4", + "magento/module-inventory-bundle-product-admin-ui": "1.2.4", + "magento/module-inventory-bundle-product-indexer": "1.1.4", + "magento/module-inventory-cache": "1.2.5", + "magento/module-inventory-catalog": "1.3.2", + "magento/module-inventory-catalog-admin-ui": "1.2.5", + "magento/module-inventory-catalog-api": "1.3.5", + "magento/module-inventory-catalog-frontend-ui": "1.0.4", + "magento/module-inventory-catalog-search": "1.2.5", + "magento/module-inventory-catalog-search-bundle-product": "1.0.3", + "magento/module-inventory-catalog-search-configurable-product": "1.0.3", + "magento/module-inventory-configurable-product": "1.2.5", + "magento/module-inventory-configurable-product-admin-ui": "1.2.5", + "magento/module-inventory-configurable-product-frontend-ui": "1.0.5", + "magento/module-inventory-configurable-product-indexer": "1.2.5", + "magento/module-inventory-configuration": "1.2.4", + "magento/module-inventory-configuration-api": "1.2.3", + "magento/module-inventory-distance-based-source-selection": "1.2.4", + "magento/module-inventory-distance-based-source-selection-admin-ui": "1.2.3", + "magento/module-inventory-distance-based-source-selection-api": "1.2.3", + "magento/module-inventory-elasticsearch": "1.2.4", + "magento/module-inventory-export-stock": "1.2.4", + "magento/module-inventory-export-stock-api": "1.2.3", + "magento/module-inventory-graph-ql": "1.2.4", + "magento/module-inventory-grouped-product": "1.3.2", + "magento/module-inventory-grouped-product-admin-ui": "1.2.4", + "magento/module-inventory-grouped-product-indexer": "1.2.5", + "magento/module-inventory-import-export": "1.2.5", + "magento/module-inventory-in-store-pickup": "1.1.3", + "magento/module-inventory-in-store-pickup-admin-ui": "1.1.4", + "magento/module-inventory-in-store-pickup-api": "1.1.3", + "magento/module-inventory-in-store-pickup-frontend": "1.1.5", + "magento/module-inventory-in-store-pickup-graph-ql": "1.1.4", + "magento/module-inventory-in-store-pickup-multishipping": "1.1.3", + "magento/module-inventory-in-store-pickup-quote": "1.1.3", + "magento/module-inventory-in-store-pickup-quote-graph-ql": "1.1.3", + "magento/module-inventory-in-store-pickup-sales": "1.1.3", + "magento/module-inventory-in-store-pickup-sales-admin-ui": "1.1.5", + "magento/module-inventory-in-store-pickup-sales-api": "1.1.3", + "magento/module-inventory-in-store-pickup-shipping": "1.1.4", + "magento/module-inventory-in-store-pickup-shipping-admin-ui": "1.1.3", + "magento/module-inventory-in-store-pickup-shipping-api": "1.1.3", + "magento/module-inventory-in-store-pickup-webapi-extension": "1.1.3", + "magento/module-inventory-indexer": "2.2.2", + "magento/module-inventory-low-quantity-notification": "1.2.4", + "magento/module-inventory-low-quantity-notification-admin-ui": "1.2.4", + "magento/module-inventory-low-quantity-notification-api": "1.2.4", + "magento/module-inventory-multi-dimensional-indexer-api": "1.2.3", + "magento/module-inventory-product-alert": "1.2.4", + "magento/module-inventory-quote-graph-ql": "1.0.4", + "magento/module-inventory-requisition-list": "1.2.5", + "magento/module-inventory-reservation-cli": "1.2.4", + "magento/module-inventory-reservations": "1.2.3", + "magento/module-inventory-reservations-api": "1.2.3", + "magento/module-inventory-sales": "1.3.2", + "magento/module-inventory-sales-admin-ui": "1.2.5", + "magento/module-inventory-sales-api": "1.2.4", + "magento/module-inventory-sales-async-order": "100.2.1", + "magento/module-inventory-sales-frontend-ui": "1.2.4", + "magento/module-inventory-setup-fixture-generator": "1.2.3", + "magento/module-inventory-shipping": "1.2.4", + "magento/module-inventory-shipping-admin-ui": "1.2.5", + "magento/module-inventory-source-deduction-api": "1.2.4", + "magento/module-inventory-source-selection": "1.2.3", + "magento/module-inventory-source-selection-api": "1.4.4", + "magento/module-inventory-swatches-frontend-ui": "1.0.3", + "magento/module-inventory-visual-merchandiser": "1.1.5", + "magento/module-inventory-wishlist": "1.0.4" + }, + "type": "metapackage", + "description": "Metapackage with Magento Inventory modules for simple installation" + }, + { + "name": "magento/language-de_de", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/language-de_de/magento-language-de_de-100.4.0.0.zip", + "shasum": "176baf37dd2dcef3e7028a3915dbb6af95221791" + }, + "require": { + "magento/framework": "103.0.*" + }, + "type": "magento2-language", + "autoload": { + "files": [ + "registration.php" + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "German (Germany) language" + }, + { + "name": "magento/language-en_us", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/language-en_us/magento-language-en_us-100.4.0.0.zip", + "shasum": "d812b13b78a13ca0b1314d261dcfb4b4bc9e350f" + }, + "require": { + "magento/framework": "103.0.*" + }, + "type": "magento2-language", + "autoload": { + "files": [ + "registration.php" + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "English (United States) language" + }, + { + "name": "magento/language-es_es", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/language-es_es/magento-language-es_es-100.4.0.0.zip", + "shasum": "27569b926ddc525670d7daa601268f9edb09c59b" + }, + "require": { + "magento/framework": "103.0.*" + }, + "type": "magento2-language", + "autoload": { + "files": [ + "registration.php" + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Spanish (Spain) language" + }, + { + "name": "magento/language-fr_fr", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/language-fr_fr/magento-language-fr_fr-100.4.0.0.zip", + "shasum": "6daf974ef89b58eba8b8f4de4b006ef807fbc7f2" + }, + "require": { + "magento/framework": "103.0.*" + }, + "type": "magento2-language", + "autoload": { + "files": [ + "registration.php" + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "French (France) language" + }, + { + "name": "magento/language-nl_nl", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/language-nl_nl/magento-language-nl_nl-100.4.0.0.zip", + "shasum": "4885585685280153d691058f5344fb0ce46da023" + }, + "require": { + "magento/framework": "103.0.*" + }, + "type": "magento2-language", + "autoload": { + "files": [ + "registration.php" + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Dutch (Netherlands) language" + }, + { + "name": "magento/language-pt_br", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/language-pt_br/magento-language-pt_br-100.4.0.0.zip", + "shasum": "de9b81317832aeeee8cb195d0a63b8be9176fda9" + }, + "require": { + "magento/framework": "103.0.*" + }, + "type": "magento2-language", + "autoload": { + "files": [ + "registration.php" + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Portuguese (Brazil) language" + }, + { + "name": "magento/language-zh_hans_cn", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/language-zh_hans_cn/magento-language-zh_hans_cn-100.4.0.0.zip", + "shasum": "cfae6ec93fb5035704e96e19e3865f644ad3b304" + }, + "require": { + "magento/framework": "103.0.*" + }, + "type": "magento2-language", + "autoload": { + "files": [ + "registration.php" + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Chinese (China) language" + }, + { + "name": "magento/magento-composer-installer", + "version": "0.4.0", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-composer-installer.git", + "reference": "85496104b065f5a7b8d824f37017c53dbbb93a44" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-composer-installer/zipball/85496104b065f5a7b8d824f37017c53dbbb93a44", + "reference": "85496104b065f5a7b8d824f37017c53dbbb93a44", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1 || ^2.0", + "composer/composer": "^1.9 || ^2.0", + "laminas/laminas-stdlib": "^3.11.0" + }, + "replace": { + "magento-hackathon/magento-composer-installer": "*" + }, + "require-dev": { + "mikey179/vfsstream": "*", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "~3.6.1", + "symfony/process": "~5.4.0" + }, + "type": "composer-plugin", + "extra": { + "composer-command-registry": [ + "MagentoHackathon\\Composer\\Magento\\Command\\DeployCommand" + ], + "class": "MagentoHackathon\\Composer\\Magento\\Plugin" + }, + "autoload": { + "psr-0": { + "MagentoHackathon\\Composer\\Magento": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Daniel Fahlke aka Flyingmana", + "email": "flyingmana@googlemail.com" + }, + { + "name": "Jörg Weller", + "email": "weller@flagbit.de" + }, + { + "name": "Karl Spies", + "email": "karl.spies@gmx.net" + }, + { + "name": "Tobias Vogt", + "email": "tobi@webguys.de" + }, + { + "name": "David Fuhr", + "email": "fuhr@flagbit.de" + }, + { + "name": "Vinai Kopp", + "email": "vinai@netzarbeiter.com" + } + ], + "description": "Composer installer for Magento modules", + "homepage": "https://github.com/magento/magento-composer-installer", + "keywords": [ + "composer-installer", + "magento" + ], + "support": { + "source": "https://github.com/magento/magento-composer-installer/tree/0.4.0" + }, + "time": "2022-12-01T15:21:32+00:00" + }, + { + "name": "magento/magento2-base", + "version": "2.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/magento2-base/magento-magento2-base-2.4.7.0.zip", + "shasum": "0b03ae2bd7a2f38c69acbd012ae3fce8588de032" + }, + "require": { + "composer/composer": "^2.0, !=2.2.16", + "ext-intl": "*", + "ext-mbstring": "*", + "laminas/laminas-code": "^4.13", + "laminas/laminas-di": "^3.13", + "laminas/laminas-eventmanager": "^3.11", + "laminas/laminas-http": "^2.15", + "laminas/laminas-i18n": "^2.17", + "laminas/laminas-modulemanager": "^2.11", + "laminas/laminas-mvc": "^3.6", + "laminas/laminas-server": "^2.16", + "laminas/laminas-servicemanager": "^3.16", + "laminas/laminas-soap": "^2.10", + "laminas/laminas-stdlib": "^3.11", + "laminas/laminas-uri": "^2.9", + "laminas/laminas-validator": "^2.23", + "magento/composer": "^1.10.0-beta1", + "magento/magento-composer-installer": "*", + "monolog/monolog": "^2.7", + "pelago/emogrifier": "^7.0", + "php": "~8.1.0||~8.2.0||~8.3.0", + "phpseclib/phpseclib": "^3.0", + "symfony/console": "^6.4", + "tedivm/jshrink": "^1.4", + "tubalmartin/cssmin": "^4.1" + }, + "conflict": { + "gene/bluefoot": "*" + }, + "replace": { + "components/jquery": "1.11.0", + "components/jqueryui": "1.10.4", + "tinymce/tinymce": "3.4.7", + "trentrichardson/jquery-timepicker-addon": "1.4.3", + "twbs/bootstrap": "3.1.0" + }, + "type": "magento2-component", + "extra": { + "chmod": [ + { + "mask": "0755", + "path": "bin/magento" + } + ], + "component_paths": { + "components/jquery": [ + "lib/web/jquery.js", + "lib/web/jquery/jquery.min.js" + ], + "components/jqueryui": "lib/web/jquery/jquery-ui.js", + "tinymce/tinymce": "lib/web/tiny_mce_5", + "trentrichardson/jquery-timepicker-addon": "lib/web/jquery/jquery-ui-timepicker-addon.js", + "twbs/bootstrap": "lib/web/jquery/jquery.tabs.js" + }, + "map": [ + [ + ".editorconfig", + ".editorconfig" + ], + [ + ".htaccess", + ".htaccess" + ], + [ + ".htaccess.sample", + ".htaccess.sample" + ], + [ + ".php-cs-fixer.dist.php", + ".php-cs-fixer.dist.php" + ], + [ + ".user.ini", + ".user.ini" + ], + [ + "CHANGELOG.md", + "CHANGELOG.md" + ], + [ + "COPYING.txt", + "COPYING.txt" + ], + [ + "Gruntfile.js.sample", + "Gruntfile.js.sample" + ], + [ + "LICENSE.txt", + "LICENSE.txt" + ], + [ + "LICENSE_AFL.txt", + "LICENSE_AFL.txt" + ], + [ + "SECURITY.md", + "SECURITY.md" + ], + [ + "app/.htaccess", + "app/.htaccess" + ], + [ + "app/autoload.php", + "app/autoload.php" + ], + [ + "app/bootstrap.php", + "app/bootstrap.php" + ], + [ + "app/design/adminhtml/Magento", + "app/design/adminhtml/Magento" + ], + [ + "app/design/frontend/Magento", + "app/design/frontend/Magento" + ], + [ + "app/etc/NonComposerComponentRegistration.php", + "app/etc/NonComposerComponentRegistration.php" + ], + [ + "app/etc/db_schema.xml", + "app/etc/db_schema.xml" + ], + [ + "app/etc/di.xml", + "app/etc/di.xml" + ], + [ + "app/etc/registration_globlist.php", + "app/etc/registration_globlist.php" + ], + [ + "auth.json.sample", + "auth.json.sample" + ], + [ + "bin/.htaccess", + "bin/.htaccess" + ], + [ + "bin/magento", + "bin/magento" + ], + [ + "dev/.htaccess", + "dev/.htaccess" + ], + [ + "dev/tests/.gitignore", + "dev/tests/.gitignore" + ], + [ + "dev/tests/acceptance", + "dev/tests/acceptance" + ], + [ + "dev/tests/api-functional/.gitignore", + "dev/tests/api-functional/.gitignore" + ], + [ + "dev/tests/api-functional/_files", + "dev/tests/api-functional/_files" + ], + [ + "dev/tests/api-functional/allure", + "dev/tests/api-functional/allure" + ], + [ + "dev/tests/api-functional/config", + "dev/tests/api-functional/config" + ], + [ + "dev/tests/api-functional/framework", + "dev/tests/api-functional/framework" + ], + [ + "dev/tests/api-functional/isolate_gql.txt", + "dev/tests/api-functional/isolate_gql.txt" + ], + [ + "dev/tests/api-functional/isolate_rest.txt", + "dev/tests/api-functional/isolate_rest.txt" + ], + [ + "dev/tests/api-functional/phpunit_graphql.xml.dist", + "dev/tests/api-functional/phpunit_graphql.xml.dist" + ], + [ + "dev/tests/api-functional/phpunit_rest.xml.dist", + "dev/tests/api-functional/phpunit_rest.xml.dist" + ], + [ + "dev/tests/api-functional/phpunit_soap.xml.dist", + "dev/tests/api-functional/phpunit_soap.xml.dist" + ], + [ + "dev/tests/api-functional/testsuite/Magento", + "dev/tests/api-functional/testsuite/Magento" + ], + [ + "dev/tests/config", + "dev/tests/config" + ], + [ + "dev/tests/error_handler.php", + "dev/tests/error_handler.php" + ], + [ + "dev/tests/integration/.gitignore", + "dev/tests/integration/.gitignore" + ], + [ + "dev/tests/integration/_files", + "dev/tests/integration/_files" + ], + [ + "dev/tests/integration/allure", + "dev/tests/integration/allure" + ], + [ + "dev/tests/integration/bin", + "dev/tests/integration/bin" + ], + [ + "dev/tests/integration/etc", + "dev/tests/integration/etc" + ], + [ + "dev/tests/integration/framework", + "dev/tests/integration/framework" + ], + [ + "dev/tests/integration/isolate.txt", + "dev/tests/integration/isolate.txt" + ], + [ + "dev/tests/integration/phpunit.xml.dist", + "dev/tests/integration/phpunit.xml.dist" + ], + [ + "dev/tests/integration/testsuite/Magento", + "dev/tests/integration/testsuite/Magento" + ], + [ + "dev/tests/integration/tmp", + "dev/tests/integration/tmp" + ], + [ + "dev/tests/js", + "dev/tests/js" + ], + [ + "dev/tests/setup-integration", + "dev/tests/setup-integration" + ], + [ + "dev/tests/static/.gitignore", + "dev/tests/static/.gitignore" + ], + [ + "dev/tests/static/allure", + "dev/tests/static/allure" + ], + [ + "dev/tests/static/framework", + "dev/tests/static/framework" + ], + [ + "dev/tests/static/get_github_changes.php", + "dev/tests/static/get_github_changes.php" + ], + [ + "dev/tests/static/phpunit-all.xml.dist", + "dev/tests/static/phpunit-all.xml.dist" + ], + [ + "dev/tests/static/phpunit.xml.dist", + "dev/tests/static/phpunit.xml.dist" + ], + [ + "dev/tests/static/testsuite/Magento", + "dev/tests/static/testsuite/Magento" + ], + [ + "dev/tests/static/tmp", + "dev/tests/static/tmp" + ], + [ + "dev/tests/unit/.gitignore", + "dev/tests/unit/.gitignore" + ], + [ + "dev/tests/unit/allure", + "dev/tests/unit/allure" + ], + [ + "dev/tests/unit/framework", + "dev/tests/unit/framework" + ], + [ + "dev/tests/unit/phpunit.xml.dist", + "dev/tests/unit/phpunit.xml.dist" + ], + [ + "dev/tests/unit/tmp", + "dev/tests/unit/tmp" + ], + [ + "dev/tests/utils", + "dev/tests/utils" + ], + [ + "dev/tests/varnish", + "dev/tests/varnish" + ], + [ + "dev/tools", + "dev/tools" + ], + [ + "generated", + "generated" + ], + [ + "grunt-config.json.sample", + "grunt-config.json.sample" + ], + [ + "lib/.htaccess", + "lib/.htaccess" + ], + [ + "lib/internal/GnuFreeFont", + "lib/internal/GnuFreeFont" + ], + [ + "lib/internal/LinLibertineFont", + "lib/internal/LinLibertineFont" + ], + [ + "lib/web/blank.html", + "lib/web/blank.html" + ], + [ + "lib/web/chartjs", + "lib/web/chartjs" + ], + [ + "lib/web/css", + "lib/web/css" + ], + [ + "lib/web/extjs", + "lib/web/extjs" + ], + [ + "lib/web/fonts", + "lib/web/fonts" + ], + [ + "lib/web/fotorama", + "lib/web/fotorama" + ], + [ + "lib/web/i18n", + "lib/web/i18n" + ], + [ + "lib/web/images", + "lib/web/images" + ], + [ + "lib/web/jquery", + "lib/web/jquery" + ], + [ + "lib/web/jquery.js", + "lib/web/jquery.js" + ], + [ + "lib/web/js-cookie", + "lib/web/js-cookie" + ], + [ + "lib/web/js-storage", + "lib/web/js-storage" + ], + [ + "lib/web/knockoutjs", + "lib/web/knockoutjs" + ], + [ + "lib/web/legacy-build.min.js", + "lib/web/legacy-build.min.js" + ], + [ + "lib/web/less", + "lib/web/less" + ], + [ + "lib/web/lib", + "lib/web/lib" + ], + [ + "lib/web/mage", + "lib/web/mage" + ], + [ + "lib/web/magnifier", + "lib/web/magnifier" + ], + [ + "lib/web/matchMedia.js", + "lib/web/matchMedia.js" + ], + [ + "lib/web/moment-timezone-with-data.js", + "lib/web/moment-timezone-with-data.js" + ], + [ + "lib/web/moment.js", + "lib/web/moment.js" + ], + [ + "lib/web/prototype", + "lib/web/prototype" + ], + [ + "lib/web/requirejs", + "lib/web/requirejs" + ], + [ + "lib/web/scriptaculous", + "lib/web/scriptaculous" + ], + [ + "lib/web/spacer.gif", + "lib/web/spacer.gif" + ], + [ + "lib/web/tiny_mce_5", + "lib/web/tiny_mce_5" + ], + [ + "lib/web/underscore.js", + "lib/web/underscore.js" + ], + [ + "lib/web/varien", + "lib/web/varien" + ], + [ + "lib/web/vimeo", + "lib/web/vimeo" + ], + [ + "nginx.conf.sample", + "nginx.conf.sample" + ], + [ + "package.json.sample", + "package.json.sample" + ], + [ + "phpserver", + "phpserver" + ], + [ + "pub/.htaccess", + "pub/.htaccess" + ], + [ + "pub/.user.ini", + "pub/.user.ini" + ], + [ + "pub/cron.php", + "pub/cron.php" + ], + [ + "pub/errors", + "pub/errors" + ], + [ + "pub/get.php", + "pub/get.php" + ], + [ + "pub/health_check.php", + "pub/health_check.php" + ], + [ + "pub/index.php", + "pub/index.php" + ], + [ + "pub/media/.htaccess", + "pub/media/.htaccess" + ], + [ + "pub/media/custom_options", + "pub/media/custom_options" + ], + [ + "pub/media/customer/.htaccess", + "pub/media/customer/.htaccess" + ], + [ + "pub/media/customer_address", + "pub/media/customer_address" + ], + [ + "pub/media/downloadable/.htaccess", + "pub/media/downloadable/.htaccess" + ], + [ + "pub/media/import", + "pub/media/import" + ], + [ + "pub/media/sitemap", + "pub/media/sitemap" + ], + [ + "pub/media/theme_customization/.htaccess", + "pub/media/theme_customization/.htaccess" + ], + [ + "pub/opt", + "pub/opt" + ], + [ + "pub/static/.htaccess", + "pub/static/.htaccess" + ], + [ + "pub/static.php", + "pub/static.php" + ], + [ + "setup", + "setup" + ], + [ + "var/.htaccess", + "var/.htaccess" + ], + [ + "vendor/.htaccess", + "vendor/.htaccess" + ] + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento 2 Base (Community Edition)" + }, + { + "name": "magento/module-admin-adobe-ims", + "version": "100.5.2", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-admin-adobe-ims/magento-module-admin-adobe-ims-100.5.2.0.zip", + "shasum": "377923bc3ab9adedd73907de0964ff173c108391" + }, + "require": { + "magento/framework": "*", + "magento/module-adobe-ims": "2.2.*", + "magento/module-adobe-ims-api": "2.2.*", + "magento/module-authorization": "*", + "magento/module-backend": "*", + "magento/module-captcha": "*", + "magento/module-config": "*", + "magento/module-email": "*", + "magento/module-integration": "*", + "magento/module-jwt-user-token": "*", + "magento/module-security": "*", + "magento/module-store": "*", + "magento/module-user": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-theme": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdminAdobeIms\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-admin-adobe-ims-two-factor-auth", + "version": "1.0.1", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-admin-adobe-ims-two-factor-auth/magento-module-admin-adobe-ims-two-factor-auth-1.0.1.0.zip", + "shasum": "ef991ee995e9348dcb977d46394e7bbb53073356" + }, + "require": { + "magento/framework": "*", + "magento/module-admin-adobe-ims": "100.5.*", + "magento/module-two-factor-auth": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdminAdobeImsTwoFactorAuth\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "This module is used to add Admin Adobe Ims and Two Factor Auth dependency." + }, + { + "name": "magento/module-admin-analytics", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-admin-analytics/magento-module-admin-analytics-100.4.6.0.zip", + "shasum": "e481e9620f4b90f45adf733bcbfaa4991cb9b35a" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-config": "101.2.*", + "magento/module-csp": "100.4.*", + "magento/module-release-notification": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdminAnalytics\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-admin-graph-ql-server", + "version": "1.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-admin-graph-ql-server/magento-module-admin-graph-ql-server-1.0.3.0.zip", + "shasum": "0db1f49a87c1f9d97e12ecc13b2f184ea37f7491" + }, + "require": { + "magento/framework": "^103.0.0", + "magento/module-graph-ql-server": "^1.0.2", + "php": "~7.3.0||~7.4.0||~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdminGraphQlServer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Commerce Admin BFF GraphQL Server" + }, + { + "name": "magento/module-admin-notification", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-admin-notification/magento-module-admin-notification-100.4.6.0.zip", + "shasum": "a26f48e11685929fa522053031f10d758ce468a0" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-config": "101.2.*", + "magento/module-media-storage": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdminNotification\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-adobe-ims", + "version": "2.2.1", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-adobe-ims/magento-module-adobe-ims-2.2.1.0.zip", + "shasum": "371ad8d396f0792a48ec881bf8215267691a5c37" + }, + "require": { + "magento/framework": "*", + "magento/module-adobe-ims-api": "2.2.*", + "magento/module-authorization": "*", + "magento/module-backend": "*", + "magento/module-config": "*", + "magento/module-user": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdobeIms\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for authentication to Adobe services" + }, + { + "name": "magento/module-adobe-ims-api", + "version": "2.2.1", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-adobe-ims-api/magento-module-adobe-ims-api-2.2.1.0.zip", + "shasum": "f4cfaf688e19439ddd2d6d0faaf53f9b2c260ce0" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdobeImsApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Implementation of Magento module responsible for authentication to Adobe services" + }, + { + "name": "magento/module-adobe-stock-admin-ui", + "version": "1.3.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-adobe-stock-admin-ui/magento-module-adobe-stock-admin-ui-1.3.4.0.zip", + "shasum": "3b8bb19b26d3c122258becb398649d8847c66061" + }, + "require": { + "magento/framework": "*", + "magento/module-admin-adobe-ims": "*", + "magento/module-adobe-ims-api": "*", + "magento/module-adobe-stock-client-api": "2.1.*", + "magento/module-backend": "*", + "magento/module-config": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-cms": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdobeStockAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for the admin panel UI implementation" + }, + { + "name": "magento/module-adobe-stock-asset", + "version": "1.3.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-adobe-stock-asset/magento-module-adobe-stock-asset-1.3.3.0.zip", + "shasum": "acf7b5c061fb82c3412f028d246cd2603a7888d3" + }, + "require": { + "magento/framework": "*", + "magento/module-adobe-stock-asset-api": "2.0.*", + "magento/module-adobe-stock-client-api": "2.1.*", + "magento/module-config": "*", + "magento/module-media-gallery": "*", + "magento/module-media-gallery-api": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdobeStockAsset\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for the Adobe Stock assets handling implementation on Magento side" + }, + { + "name": "magento/module-adobe-stock-asset-api", + "version": "2.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-adobe-stock-asset-api/magento-module-adobe-stock-asset-api-2.0.3.0.zip", + "shasum": "f40806896e0403134469438222a2ace76afdbc80" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdobeStockAssetApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for Adobe Stock assets handling on Magento side" + }, + { + "name": "magento/module-adobe-stock-client", + "version": "1.3.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-adobe-stock-client/magento-module-adobe-stock-client-1.3.4.0.zip", + "shasum": "a3303c3f763ad00eab53fa7434ad3ee991efd034" + }, + "require": { + "astock/stock-api-libphp": "^1.1.2", + "magento/framework": "*", + "magento/module-adobe-ims-api": "*", + "magento/module-adobe-stock-client-api": "2.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdobeStockClient\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for interaction with Adobe Stock API implementation" + }, + { + "name": "magento/module-adobe-stock-client-api", + "version": "2.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-adobe-stock-client-api/magento-module-adobe-stock-client-api-2.1.4.0.zip", + "shasum": "70626aaf3ef2d8aa3e3954e40e00d16ff186191e" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdobeStockClientApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for interaction with Adobe Stock API" + }, + { + "name": "magento/module-adobe-stock-image", + "version": "1.3.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-adobe-stock-image/magento-module-adobe-stock-image-1.3.5.0.zip", + "shasum": "c7618361e5ad4a908c7038d97013f27f0a42ae21" + }, + "require": { + "magento/framework": "*", + "magento/module-adobe-stock-asset-api": "2.0.*", + "magento/module-adobe-stock-client-api": "2.1.*", + "magento/module-adobe-stock-image-api": "1.3.*", + "magento/module-media-gallery-api": "*", + "magento/module-media-gallery-synchronization-api": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdobeStockImage\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for the images handling implementation" + }, + { + "name": "magento/module-adobe-stock-image-admin-ui", + "version": "1.3.5-p1", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-adobe-stock-image-admin-ui/magento-module-adobe-stock-image-admin-ui-1.3.5.0-patch1.zip", + "shasum": "46c1ec141b0216cf1d5675c06ba96470b13dd37a" + }, + "require": { + "magento/framework": "*", + "magento/module-adobe-ims": "*", + "magento/module-adobe-ims-api": "*", + "magento/module-adobe-stock-asset-api": "2.0.*", + "magento/module-adobe-stock-client-api": "2.1.*", + "magento/module-adobe-stock-image-api": "1.3.*", + "magento/module-backend": "*", + "magento/module-media-gallery-api": "*", + "magento/module-media-gallery-ui": "*", + "magento/module-ui": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-cms": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdobeStockImageAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for the admin panel images UI implementation" + }, + { + "name": "magento/module-adobe-stock-image-api", + "version": "1.3.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-adobe-stock-image-api/magento-module-adobe-stock-image-api-1.3.3.0.zip", + "shasum": "e645853e87422778a4085db9256fce8da5b583d8" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdobeStockImageApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for the images handling" + }, + { + "name": "magento/module-advanced-pricing-import-export", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-advanced-pricing-import-export/magento-module-advanced-pricing-import-export-100.4.7.0.zip", + "shasum": "ce4666fe16ac75fb232e7c4169c51967e1a34edd" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-import-export": "101.1.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-import-export": "101.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdvancedPricingImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-advanced-search", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-advanced-search/magento-module-advanced-search-100.4.5.0.zip", + "shasum": "94a8ea9bf12f798ef033da85f46871a6d5b1c9ee" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-search": "102.0.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-search": "101.1.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AdvancedSearch\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-amqp", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-amqp/magento-module-amqp-100.4.4.0.zip", + "shasum": "92497b0ca39946ddbb9ce366fe829ed51c7802c9" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-amqp": "100.4.*", + "magento/framework-message-queue": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Amqp\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-analytics", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-analytics/magento-module-analytics-100.4.7.0.zip", + "shasum": "02c663458ffcac3aeb00da4c14cf3ba6ce202895" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-config": "101.2.*", + "magento/module-integration": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Analytics\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-application-performance-monitor", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-application-performance-monitor/magento-module-application-performance-monitor-100.4.0.0.zip", + "shasum": "644164347fc4d7329f26877f3a132deda0248406" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ApplicationPerformanceMonitor\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Performance Monitor for Application" + }, + { + "name": "magento/module-application-performance-monitor-new-relic", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-application-performance-monitor-new-relic/magento-module-application-performance-monitor-new-relic-100.4.0.0.zip", + "shasum": "89cf5bb1fa90239a72ae4ac2d45998441832f188" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-application-performance-monitor": "100.4.*", + "magento/module-new-relic-reporting": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "ext-newrelic": "This module requires New Relic's PHP extension in order to function." + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ApplicationPerformanceMonitorNewRelic\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Performance data about Application into New Relic" + }, + { + "name": "magento/module-async-config", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-async-config/magento-module-async-config-100.4.0.0.zip", + "shasum": "891824c7501045201efcc2a86f60cef1c4286d31" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-config": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AsyncConfig\\": "" + } + }, + "license": [ + "proprietary" + ], + "description": "N/A" + }, + { + "name": "magento/module-asynchronous-operations", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-asynchronous-operations/magento-module-asynchronous-operations-100.4.7.0.zip", + "shasum": "deeb5113727c9be133ead53b0276f6782f99007a" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-bulk": "101.0.*", + "magento/framework-message-queue": "100.4.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-admin-notification": "100.4.*", + "magento/module-logging": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AsynchronousOperations\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-authorization", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-authorization/magento-module-authorization-100.4.7.0.zip", + "shasum": "7664117a2d2949071391b6402aad9d4d2251fe7a" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Authorization\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Authorization module provides access to Magento ACL functionality." + }, + { + "name": "magento/module-aws-s3", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-aws-s3/magento-module-aws-s3-100.4.5.0.zip", + "shasum": "6b86030cb90b1244796cc51aa18d5cdbb50a5244" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-remote-storage": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AwsS3\\": "" + } + }, + "license": [ + "proprietary" + ], + "description": "N/A" + }, + { + "name": "magento/module-aws-s3-page-builder", + "version": "1.0.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-aws-s3-page-builder/magento-module-aws-s3-page-builder-1.0.4.0.zip", + "shasum": "dfed85f66f5e3b2da49139f352977a68229246aa" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-aws-s3": "*", + "magento/module-page-builder": "2.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\AwsS3PageBuilder\\": "" + } + }, + "license": [ + "proprietary" + ], + "description": "Aws S3 Page Builder module" + }, + { + "name": "magento/module-backend", + "version": "102.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-backend/magento-module-backend-102.0.7.0.zip", + "shasum": "6137e7922fa7ee817a555b59f8db2f1a04074498" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backup": "100.4.*", + "magento/module-catalog": "104.0.*", + "magento/module-cms": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-developer": "100.4.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-quote": "101.2.*", + "magento/module-reports": "100.4.*", + "magento/module-require-js": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-security": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-translation": "100.4.*", + "magento/module-ui": "101.2.*", + "magento/module-user": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-theme": "101.1.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php", + "cli_commands.php" + ], + "psr-4": { + "Magento\\Backend\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-backup", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-backup/magento-module-backup-100.4.7.0.zip", + "shasum": "7fccb02649feb173fc64841c3ba512134db0a200" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-cron": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Backup\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-bundle", + "version": "101.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-bundle/magento-module-bundle-101.0.7.0.zip", + "shasum": "a0e9a88a8579f755b6ea25f4cf700af646a9f432" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-catalog-rule": "101.2.*", + "magento/module-checkout": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-gift-message": "100.4.*", + "magento/module-media-storage": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-bundle-sample-data": "Sample Data version: 100.4.*", + "magento/module-sales-rule": "101.2.*", + "magento/module-webapi": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Bundle\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-bundle-graph-ql", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-bundle-graph-ql/magento-module-bundle-graph-ql-100.4.7.0.zip", + "shasum": "da0b73fa4179908d24d22775e1796c5b9f8fd3eb" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-bundle": "101.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-quote-graph-ql": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-sales-graph-ql": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\BundleGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-bundle-import-export", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-bundle-import-export/magento-module-bundle-import-export-100.4.6.0.zip", + "shasum": "da4368accbef093e707694361c0f4d1fc983fa85" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-bundle": "101.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-import-export": "101.1.*", + "magento/module-eav": "102.1.*", + "magento/module-import-export": "101.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\BundleImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cache-invalidate", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-cache-invalidate/magento-module-cache-invalidate-100.4.5.0.zip", + "shasum": "5a573bbecd56a1ddcc95ff19a630501b2a57a80d" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-page-cache": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CacheInvalidate\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-captcha", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-captcha/magento-module-captcha-100.4.7.0.zip", + "shasum": "f27e3ef46aecf81b8998268e6ffa327def721168" + }, + "require": { + "laminas/laminas-captcha": "^2.12", + "laminas/laminas-db": "^2.19", + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Captcha\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cardinal-commerce", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-cardinal-commerce/magento-module-cardinal-commerce-100.4.5.0.zip", + "shasum": "84b592c2e4510e229b3192de1ebde3a6bf7b46ab" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-payment": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CardinalCommerce\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Provides a possibility to enable 3-D Secure 2.0 support for payment methods." + }, + { + "name": "magento/module-catalog", + "version": "104.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog/magento-module-catalog-104.0.7.0.zip", + "shasum": "d9ce3fda176cab7d85c00e72b4e4fa7e6cd5d602" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-bulk": "101.0.*", + "magento/module-asynchronous-operations": "100.4.*", + "magento/module-authorization": "100.4.*", + "magento/module-aws-s3": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-catalog-rule": "101.2.*", + "magento/module-catalog-url-rewrite": "100.4.*", + "magento/module-checkout": "100.4.*", + "magento/module-cms": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-indexer": "100.4.*", + "magento/module-media-storage": "100.4.*", + "magento/module-msrp": "100.4.*", + "magento/module-page-cache": "100.4.*", + "magento/module-product-alert": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-url-rewrite": "102.0.*", + "magento/module-widget": "101.2.*", + "magento/module-wishlist": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-sample-data": "Sample Data version: 100.4.*", + "magento/module-cookie": "100.4.*", + "magento/module-sales": "103.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Catalog\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-analytics", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-analytics/magento-module-catalog-analytics-100.4.4.0.zip", + "shasum": "0c28cf2f423e890996da8f19d70c6cdcfe3f5e99" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-analytics": "100.4.*", + "magento/module-catalog": "104.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogAnalytics\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-cms-graph-ql", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-cms-graph-ql/magento-module-catalog-cms-graph-ql-100.4.3.0.zip", + "shasum": "2b943fe684900f00cb0d830252fe6e9dfe2b2a34" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-cms-graph-ql": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-cms": "104.0.*", + "magento/module-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogCmsGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-customer-graph-ql", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-customer-graph-ql/magento-module-catalog-customer-graph-ql-100.4.6.0.zip", + "shasum": "9dfcf61bd97d7902e1f2742231a695aed39d5fde" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-customer": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogCustomerGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-graph-ql", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-graph-ql/magento-module-catalog-graph-ql-100.4.7.0.zip", + "shasum": "3c0c7faf9eadc1768e72b7ee2ff51468d84cf9c5" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-advanced-search": "100.4.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-catalog-search": "102.0.*", + "magento/module-config": "101.2.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-eav-graph-ql": "100.4.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-graph-ql-resolver-cache": "100.4.*", + "magento/module-search": "101.1.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-graph-ql-cache": "100.4.*", + "magento/module-store-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-import-export", + "version": "101.1.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-import-export/magento-module-catalog-import-export-101.1.7.0.zip", + "shasum": "df6f9d4c9a4ed9d7b80d5ef6c77c6dae115fe831" + }, + "require": { + "ext-ctype": "*", + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-aws-s3": "100.4.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-catalog-url-rewrite": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-import-export": "101.0.*", + "magento/module-media-storage": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-inventory", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-inventory/magento-module-catalog-inventory-100.4.7.0.zip", + "shasum": "5f3515759864576e367f7090df73847dc04d717f" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-quote": "101.2.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogInventory\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-inventory-graph-ql", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-inventory-graph-ql/magento-module-catalog-inventory-graph-ql-100.4.4.0.zip", + "shasum": "2694f6530a65d306e1069ce59a4c2042461e027f" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogInventoryGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-page-builder-analytics", + "version": "1.6.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-page-builder-analytics/magento-module-catalog-page-builder-analytics-1.6.4.0.zip", + "shasum": "0f5aa3496ce83da17d96f1fce71887801d895956" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-page-builder-analytics": "1.6.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogPageBuilderAnalytics\\": "" + } + }, + "license": [ + "proprietary" + ], + "description": "Catalog Page Builder Analytics module" + }, + { + "name": "magento/module-catalog-rule", + "version": "101.2.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-rule/magento-module-catalog-rule-101.2.7.0.zip", + "shasum": "1c750576bda7418cd63cc20a16205e3ba8ad1306" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-rule": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-rule-sample-data": "Sample Data version: 100.4.*", + "magento/module-import-export": "101.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogRule\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-rule-configurable", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-rule-configurable/magento-module-catalog-rule-configurable-100.4.6.0.zip", + "shasum": "5be26d1cf1eb42217ebf49ef1884cf5490f091ef" + }, + "require": { + "magento/framework": "103.0.*", + "magento/magento-composer-installer": "*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-rule": "101.2.*", + "magento/module-configurable-product": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-rule": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogRuleConfigurable\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-rule-graph-ql", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-rule-graph-ql/magento-module-catalog-rule-graph-ql-100.4.4.0.zip", + "shasum": "7a90b696836ba0894c829760a23b0bc2375b579b" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-rule": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogRuleGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-search", + "version": "102.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-search/magento-module-catalog-search-102.0.7.0.zip", + "shasum": "e0f430aa6c7f84b96c07a9df548c2e77260dcf5a" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-indexer": "100.4.*", + "magento/module-search": "101.1.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogSearch\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Catalog search" + }, + { + "name": "magento/module-catalog-url-rewrite", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-url-rewrite/magento-module-catalog-url-rewrite-100.4.7.0.zip", + "shasum": "a184b1209dda87d71d3c3e8d0798d18aa40a4bf8" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-import-export": "101.1.*", + "magento/module-eav": "102.1.*", + "magento/module-import-export": "101.0.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-url-rewrite": "102.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-webapi": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogUrlRewrite\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-url-rewrite-graph-ql", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-url-rewrite-graph-ql/magento-module-catalog-url-rewrite-graph-ql-100.4.5.0.zip", + "shasum": "0f7bfcd425eb582f25be30dcd258ce8564839207" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-url-rewrite-graph-ql": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-catalog-url-rewrite": "100.4.*", + "magento/module-url-rewrite-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogUrlRewriteGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-catalog-widget", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-catalog-widget/magento-module-catalog-widget-100.4.7.0.zip", + "shasum": "a98db7c42387bf56d1474382095b7f8c2dabf7fe" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-rule": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "magento/module-widget": "101.2.*", + "magento/module-wishlist": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CatalogWidget\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-checkout", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-checkout/magento-module-checkout-100.4.7.0.zip", + "shasum": "0a50a9d7ec85a2a467dba094b0ecaa858fde6b76" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-captcha": "100.4.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-csp": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-msrp": "100.4.*", + "magento/module-page-cache": "100.4.*", + "magento/module-payment": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-sales-rule": "101.2.*", + "magento/module-security": "100.4.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-cookie": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Checkout\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-checkout-agreements", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-checkout-agreements/magento-module-checkout-agreements-100.4.6.0.zip", + "shasum": "93d7093ccb76ee57e628520c5e53c3d1417aee84" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CheckoutAgreements\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-checkout-agreements-graph-ql", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-checkout-agreements-graph-ql/magento-module-checkout-agreements-graph-ql-100.4.3.0.zip", + "shasum": "75086246447425a61a4e78df508acd6b658a14e9" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-checkout-agreements": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CheckoutAgreementsGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cms", + "version": "104.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-cms/magento-module-cms-104.0.7.0.zip", + "shasum": "fbc392a3256e144034483c3a5bd07beebf8138ed" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-email": "101.1.*", + "magento/module-media-storage": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-variable": "100.4.*", + "magento/module-widget": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-cms-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Cms\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cms-graph-ql", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-cms-graph-ql/magento-module-cms-graph-ql-100.4.4.0.zip", + "shasum": "b97342cb33c41cdb5383b9861c25abfeacb81923" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-cms": "104.0.*", + "magento/module-graph-ql-resolver-cache": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-widget": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-graph-ql": "100.4.*", + "magento/module-graph-ql-cache": "100.4.*", + "magento/module-store-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CmsGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cms-page-builder-analytics", + "version": "1.6.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-cms-page-builder-analytics/magento-module-cms-page-builder-analytics-1.6.4.0.zip", + "shasum": "169cdeb534cad6e777c10cab1aebec55011b90ec" + }, + "require": { + "magento/framework": "*", + "magento/module-cms": "*", + "magento/module-page-builder-analytics": "1.6.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CmsPageBuilderAnalytics\\": "" + } + }, + "license": [ + "proprietary" + ], + "description": "CMS Page Builder Analytics module" + }, + { + "name": "magento/module-cms-url-rewrite", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-cms-url-rewrite/magento-module-cms-url-rewrite-100.4.6.0.zip", + "shasum": "4ab1a22d3429c93a5963fdb2bcf4b49868db2793" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-cms": "104.0.*", + "magento/module-store": "101.1.*", + "magento/module-url-rewrite": "102.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CmsUrlRewrite\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cms-url-rewrite-graph-ql", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-cms-url-rewrite-graph-ql/magento-module-cms-url-rewrite-graph-ql-100.4.5.0.zip", + "shasum": "658f923865f737bdff42cd9ab7e0907900323a21" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-cms": "104.0.*", + "magento/module-cms-graph-ql": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-url-rewrite-graph-ql": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-cms-url-rewrite": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CmsUrlRewriteGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-compare-list-graph-ql", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-compare-list-graph-ql/magento-module-compare-list-graph-ql-100.4.3.0.zip", + "shasum": "a353bad32bfd18442cb79364a5125e152d7b470d" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-customer": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CompareListGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-config", + "version": "101.2.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-config/magento-module-config-101.2.7.0.zip", + "shasum": "fe948c3f9ceae6485fac15bda82dc4740fb854b7" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-cron": "100.4.*", + "magento/module-deploy": "100.4.*", + "magento/module-directory": "100.4.*", + "magento/module-email": "101.1.*", + "magento/module-media-storage": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Config\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-configurable-import-export", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-configurable-import-export/magento-module-configurable-import-export-100.4.5.0.zip", + "shasum": "3f4dd46d359ec774b93fab8fcac6ae1baad90366" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-import-export": "101.1.*", + "magento/module-configurable-product": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-import-export": "101.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ConfigurableImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-configurable-product", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-configurable-product/magento-module-configurable-product-100.4.7.0.zip", + "shasum": "9972988bf20d961b544b2ad097065afbecf70440" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-media-storage": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-widget": "100.4.*", + "magento/module-configurable-sample-data": "Sample Data version: 100.4.*", + "magento/module-msrp": "100.4.*", + "magento/module-product-links-sample-data": "Sample Data version: 100.4.*", + "magento/module-product-video": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-sales-rule": "101.2.*", + "magento/module-tax": "100.4.*", + "magento/module-webapi": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ConfigurableProduct\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-configurable-product-graph-ql", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-configurable-product-graph-ql/magento-module-configurable-product-graph-ql-100.4.7.0.zip", + "shasum": "d2d87c4bda0dcc708e6d0de5593b9e6d60b6e23c" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-configurable-product": "100.4.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-quote-graph-ql": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ConfigurableProductGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-configurable-product-sales", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-configurable-product-sales/magento-module-configurable-product-sales-100.4.4.0.zip", + "shasum": "ed15df2440961ef30dab4083eaa7f855f615133e" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-configurable-product": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ConfigurableProductSales\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-contact", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-contact/magento-module-contact-100.4.6.0.zip", + "shasum": "d00dd1689b897b65fef2823cd821ea7548b1976d" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-cms": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Contact\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-contact-graph-ql", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-contact-graph-ql/magento-module-contact-graph-ql-100.4.0.0.zip", + "shasum": "41a41081e7ff424e0d3e27cef909d56c6544a1cf" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-contact": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ContactGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cookie", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-cookie/magento-module-cookie-100.4.7.0.zip", + "shasum": "ff03de20ba4ebde2a0b653a98743406dd668643e" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-backend": "102.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Cookie\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-cron", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-cron/magento-module-cron-100.4.7.0.zip", + "shasum": "da3a0cb5c3161aa4e3fc77a1d5b4b20a441a4af9" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Cron\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-csp", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-csp/magento-module-csp-100.4.6.0.zip", + "shasum": "f61e5774f44e5f8e19f76778450a6ed2ce6122a5" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-deploy": "100.4.*", + "magento/module-require-js": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Csp\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "CSP module enables Content Security Policies for Magento" + }, + { + "name": "magento/module-currency-symbol", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-currency-symbol/magento-module-currency-symbol-100.4.5.0.zip", + "shasum": "820bc31749bd22c70753c1cc54cd4d4c1c290d05" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-config": "101.2.*", + "magento/module-directory": "100.4.*", + "magento/module-page-cache": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CurrencySymbol\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-customer", + "version": "103.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-customer/magento-module-customer-103.0.7.0.zip", + "shasum": "14f2200cae46bc03787c8964441014275f846f7b" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-integration": "100.4.*", + "magento/module-media-storage": "100.4.*", + "magento/module-newsletter": "100.4.*", + "magento/module-page-cache": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-wishlist": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-asynchronous-operations": "100.4.*", + "magento/module-cookie": "100.4.*", + "magento/module-customer-sample-data": "Sample Data version: 100.4.*", + "magento/module-webapi": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Customer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-customer-analytics", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-customer-analytics/magento-module-customer-analytics-100.4.4.0.zip", + "shasum": "8f3af6f652088aeb2342626af960c11df39ece7b" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-analytics": "100.4.*", + "magento/module-customer": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CustomerAnalytics\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-customer-downloadable-graph-ql", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-customer-downloadable-graph-ql/magento-module-customer-downloadable-graph-ql-100.4.3.0.zip", + "shasum": "21fba5f59d2903438d0336854daf3a4df617ba36" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-downloadable-graph-ql": "100.4.*", + "magento/module-graph-ql": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CustomerDownloadableGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-customer-graph-ql", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-customer-graph-ql/magento-module-customer-graph-ql-100.4.7.0.zip", + "shasum": "efdc3d02d58590d96a2472e925a41d6b7ffe0531" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-eav-graph-ql": "100.4.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-graph-ql-cache": "100.4.*", + "magento/module-graph-ql-resolver-cache": "100.4.*", + "magento/module-integration": "100.4.*", + "magento/module-newsletter": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CustomerGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-customer-import-export", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-customer-import-export/magento-module-customer-import-export-100.4.7.0.zip", + "shasum": "bfcebdb63649c802a37b7cc53e0065b94f57d101" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-import-export": "101.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\CustomerImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-data-exporter", + "version": "103.3.14", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-data-exporter/magento-module-data-exporter-103.3.14.0.zip", + "shasum": "a921a376ef3810ef401319e71c4a0a4b15203504" + }, + "require": { + "magento/framework": ">=103.0.4", + "magento/module-analytics": ">=100.4.4", + "magento/module-indexer": ">=100.4.4", + "magento/module-query-xml": "self.version", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\DataExporter\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento 2 Data Exporter module exports necessary data to Magento cloud services that rely on it" + }, + { + "name": "magento/module-deploy", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-deploy/magento-module-deploy-100.4.7.0.zip", + "shasum": "78d5924a55a58a320f106ba8cf0d97b4ac00af44" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-config": "101.2.*", + "magento/module-require-js": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-user": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "cli_commands.php", + "registration.php" + ], + "psr-4": { + "Magento\\Deploy\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-developer", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-developer/magento-module-developer-100.4.7.0.zip", + "shasum": "b3e7a74e1d0929b4b1b33ea715d31d7aac2d891b" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-config": "101.2.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Developer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-dhl", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-dhl/magento-module-dhl-100.4.6.0.zip", + "shasum": "268e49e3efaf9d219857256c20e8674dad457a34" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-directory": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-checkout": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Dhl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-directory", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-directory/magento-module-directory-100.4.7.0.zip", + "shasum": "856003569745c66626e362d043663dcf392a9a88" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-config": "101.2.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Directory\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-directory-graph-ql", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-directory-graph-ql/magento-module-directory-graph-ql-100.4.5.0.zip", + "shasum": "6a2c203d5a367b1048e8a3e397c18c38cd093a46" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\DirectoryGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-downloadable", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-downloadable/magento-module-downloadable-100.4.7.0.zip", + "shasum": "f99b9522829035ebd2dc7143ea67d28933aceccc" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-checkout": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-gift-message": "100.4.*", + "magento/module-media-storage": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-downloadable-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Downloadable\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-downloadable-graph-ql", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-downloadable-graph-ql/magento-module-downloadable-graph-ql-100.4.7.0.zip", + "shasum": "6b2ac0b39d46aef02dcf47d5848dbae38ab5ce65" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-downloadable": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-quote-graph-ql": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-sales-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\DownloadableGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-downloadable-import-export", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-downloadable-import-export/magento-module-downloadable-import-export-100.4.6.0.zip", + "shasum": "1004cb533fd1d092d2d3722bf961c61e604c1edd" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-import-export": "101.1.*", + "magento/module-downloadable": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-import-export": "101.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\DownloadableImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-eav", + "version": "102.1.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-eav/magento-module-eav-102.1.7.0.zip", + "shasum": "2b4cafbe9a1bd303f95208f303792a9e3344fd10" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-media-storage": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Eav\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-eav-graph-ql", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-eav-graph-ql/magento-module-eav-graph-ql-100.4.4.0.zip", + "shasum": "c1f151c415228fc671b6b78272412dcb6006c596" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-eav": "102.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\EavGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-elasticsearch", + "version": "101.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-elasticsearch/magento-module-elasticsearch-101.0.7.0.zip", + "shasum": "8cc6c2a29622bf940413f08c4b5ef17532b21ac4" + }, + "require": { + "elasticsearch/elasticsearch": "~7.17.0 || ~8.5.0", + "magento/framework": "103.0.*", + "magento/module-advanced-search": "100.4.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-catalog-search": "102.0.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-search": "101.1.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Elasticsearch\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-elasticsearch-7", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-elasticsearch-7/magento-module-elasticsearch-7-100.4.7.0.zip", + "shasum": "b033ee253daad9d6d3546a36510e5a0412c55a2c" + }, + "require": { + "elasticsearch/elasticsearch": "^7.17", + "magento/framework": "103.0.*", + "magento/module-advanced-search": "100.4.*", + "magento/module-catalog-search": "102.0.*", + "magento/module-elasticsearch": "101.0.*", + "magento/module-search": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Elasticsearch7\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-email", + "version": "101.1.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-email/magento-module-email-101.1.7.0.zip", + "shasum": "8c41f44b9e55383926a84a21cfb1044834fc0594" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-cms": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-media-storage": "100.4.*", + "magento/module-require-js": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-variable": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-theme": "101.1.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Email\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-encryption-key", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-encryption-key/magento-module-encryption-key-100.4.5.0.zip", + "shasum": "224887333a64a374064ecf52003be8c78814b836" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-config": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\EncryptionKey\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-fedex", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-fedex/magento-module-fedex-100.4.5.0.zip", + "shasum": "883915a74f9b576e324847ef962983a5cd66ed21" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-directory": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Fedex\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-gift-message", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-gift-message/magento-module-gift-message-100.4.6.0.zip", + "shasum": "27098f7ad1071183049acc2d8560fb5c12ea3b32" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-eav": "102.1.*", + "magento/module-multishipping": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GiftMessage\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-gift-message-graph-ql", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-gift-message-graph-ql/magento-module-gift-message-graph-ql-100.4.5.0.zip", + "shasum": "30b31e3629895670f306447a242ce7cc823dc8c7" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-gift-message": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GiftMessageGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-adwords", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-google-adwords/magento-module-google-adwords-100.4.4.0.zip", + "shasum": "01ce3662b17348036157857a9041bc6e14e37215" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GoogleAdwords\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-analytics", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-google-analytics/magento-module-google-analytics-100.4.3.0.zip", + "shasum": "6d92d117facce76691b67930bb78848875c239eb" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-cookie": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GoogleAnalytics\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-gtag", + "version": "100.4.2", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-google-gtag/magento-module-google-gtag-100.4.2.0.zip", + "shasum": "e04708eb929dccaa7bd40d157b952cbd3b34d199" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-cookie": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GoogleGtag\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-google-optimizer", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-google-optimizer/magento-module-google-optimizer-100.4.6.0.zip", + "shasum": "6af40b562296caf5f5a411c941d0a65c7efcbe63" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-cms": "104.0.*", + "magento/module-google-analytics": "100.4.*", + "magento/module-google-gtag": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GoogleOptimizer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-graph-ql", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-graph-ql/magento-module-graph-ql-100.4.7.0.zip", + "shasum": "2f9332743bd2665fb8352af5db7a6e372531b10f" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-webapi": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0", + "webonyx/graphql-php": "^15.0" + }, + "suggest": { + "magento/module-graph-ql-cache": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-graph-ql-cache", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-graph-ql-cache/magento-module-graph-ql-cache-100.4.4.0.zip", + "shasum": "df318f3e3ba9367738e4e2390bfe9c796a9702fa" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-integration": "100.4.*", + "magento/module-page-cache": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GraphQlCache\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-graph-ql-new-relic", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-graph-ql-new-relic/magento-module-graph-ql-new-relic-100.4.0.0.zip", + "shasum": "4b0171d23f284f6b94e5d85739cc744ecc672f55" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-new-relic-reporting": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GraphQlNewRelic\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-graph-ql-resolver-cache", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-graph-ql-resolver-cache/magento-module-graph-ql-resolver-cache-100.4.0.0.zip", + "shasum": "5e8473c6e916120411ec9471eb1d81afb2f666d6" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-graph-ql": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GraphQlResolverCache\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-graph-ql-server", + "version": "1.0.2", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-graph-ql-server/magento-module-graph-ql-server-1.0.2.0.zip", + "shasum": "defefeabf3386dcc83e3f992a047904fe47a1e57" + }, + "require": { + "magento/framework": "^103.0.0", + "magento/module-backend": ">=101.0.0 <103.0.0", + "magento/module-graph-ql": "^100.4.0", + "magento/module-webapi": "^100.4.0", + "php": "~7.3.0||~7.4.0||~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GraphQlServer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Commerce BFF GraphQL Server" + }, + { + "name": "magento/module-grouped-catalog-inventory", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-grouped-catalog-inventory/magento-module-grouped-catalog-inventory-100.4.4.0.zip", + "shasum": "17296d83411494cc5094def6a0f509fa2a703c2d" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-grouped-product": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GroupedCatalogInventory\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-grouped-import-export", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-grouped-import-export/magento-module-grouped-import-export-100.4.5.0.zip", + "shasum": "cd8a356b75bc6485ffd5631cd6e30dbbb5356ee8" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-import-export": "101.1.*", + "magento/module-eav": "102.1.*", + "magento/module-grouped-product": "100.4.*", + "magento/module-import-export": "101.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GroupedImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-grouped-product", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-grouped-product/magento-module-grouped-product-100.4.7.0.zip", + "shasum": "c2b37c35be7fbd4501b9f19afff6a568e9c0ed2d" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-media-storage": "100.4.*", + "magento/module-msrp": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-wishlist": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-grouped-product-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GroupedProduct\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-grouped-product-graph-ql", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-grouped-product-graph-ql/magento-module-grouped-product-graph-ql-100.4.7.0.zip", + "shasum": "b9046ca22b6c022b9e8c5d7ad01dbb85372e2126" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-grouped-product": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\GroupedProductGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-import-export", + "version": "101.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-import-export/magento-module-import-export-101.0.7.0.zip", + "shasum": "7b09a8b6eb5d10e525cfb1fa0b2b24c16a08d9b3" + }, + "require": { + "ext-ctype": "*", + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-eav": "102.1.*", + "magento/module-media-storage": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-indexer", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-indexer/magento-module-indexer-100.4.7.0.zip", + "shasum": "5ba18a0e76f51c95e6d4a1eeb998789cc74b06db" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-amqp": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-customer": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Indexer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-instant-purchase", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-instant-purchase/magento-module-instant-purchase-100.4.6.0.zip", + "shasum": "208dc57e5d31c40aaa636c8eb70a51978ea0b74e" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-customer": "103.0.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-vault": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InstantPurchase\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-integration", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-integration/magento-module-integration-100.4.7.0.zip", + "shasum": "a2c1cc8a907c2bbdcc88f6f4e107825142795d46" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-customer": "103.0.*", + "magento/module-security": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-user": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Integration\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-integration-graph-ql", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-integration-graph-ql/magento-module-integration-graph-ql-100.4.0.0.zip", + "shasum": "4a84db2460fc642ad4641999b0e87531a5eddc76" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\IntegrationGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory/magento-module-inventory-1.2.5.0.zip", + "shasum": "62608a4e31505092374db38aee769127063ef0a5" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Inventory\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-admin-ui", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-admin-ui/magento-module-inventory-admin-ui-1.2.5.0.zip", + "shasum": "fb631e04ab380d881903bb2fa5fda98e8ba61150" + }, + "require": { + "magento/framework": "*", + "magento/module-backend": "*", + "magento/module-directory": "*", + "magento/module-inventory": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-ui": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-advanced-checkout", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-advanced-checkout/magento-module-inventory-advanced-checkout-1.2.4.0.zip", + "shasum": "5111f399d5bcf869adfb5b811403547a85a925ed" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-advanced-checkout": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryAdvancedCheckout\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-api", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-api/magento-module-inventory-api-1.2.5.0.zip", + "shasum": "e9eed5bb0eea3f2316b10362c6f1ad60793a9f33" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-bundle-import-export", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-bundle-import-export/magento-module-inventory-bundle-import-export-1.1.3.0.zip", + "shasum": "fbedaa7e992f673604ffeebac3dc773b5a7e0cab" + }, + "require": { + "magento/framework": "*", + "magento/module-bundle-import-export": "*", + "magento/module-catalog-import-export": "*", + "magento/module-inventory-catalog-api": "1.3.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryBundleImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-bundle-product", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-bundle-product/magento-module-inventory-bundle-product-1.2.4.0.zip", + "shasum": "2ffc590b83730c6700db8fc5e72f777ae52135a6" + }, + "require": { + "magento/framework": "*", + "magento/module-bundle": "*", + "magento/module-catalog": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-inventory": "*", + "magento/module-inventory": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryBundleProduct\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-bundle-product-admin-ui", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-bundle-product-admin-ui/magento-module-inventory-bundle-product-admin-ui-1.2.4.0.zip", + "shasum": "56f36732bd70876e2bbd22ed590c5f0a37e68c0f" + }, + "require": { + "magento/framework": "*", + "magento/module-bundle": "*", + "magento/module-catalog": "*", + "magento/module-inventory-catalog-admin-ui": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-ui": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory-configuration-api": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryBundleProductAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-bundle-product-indexer", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-bundle-product-indexer/magento-module-inventory-bundle-product-indexer-1.1.4.0.zip", + "shasum": "7256c23f2878a03c210b09170975a545e988bed6" + }, + "require": { + "magento/framework": "*", + "magento/module-bundle": "*", + "magento/module-catalog": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-indexer": "2.2.*", + "magento/module-inventory-multi-dimensional-indexer-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryBundleProductIndexer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-cache", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-cache/magento-module-inventory-cache-1.2.5.0.zip", + "shasum": "fe0c2ac87593c0da000597e49be52740f486f271" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-indexer": "2.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryCache\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-catalog", + "version": "1.3.2", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-catalog/magento-module-inventory-catalog-1.3.2.0.zip", + "shasum": "0b16c8c197ac2729be0773c2a70871f4c0a8133e" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-catalog-inventory": "*", + "magento/module-inventory": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration": "1.2.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-indexer": "2.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory-reservations-api": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryCatalog\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-catalog-admin-ui", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-catalog-admin-ui/magento-module-inventory-catalog-admin-ui-1.2.5.0.zip", + "shasum": "1208c1ab7e406d62da3323dd8a2f1c993d36bfc5" + }, + "require": { + "magento/framework": "*", + "magento/module-asynchronous-operations": "*", + "magento/module-backend": "*", + "magento/module-catalog": "*", + "magento/module-catalog-inventory": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-indexer": "2.2.*", + "magento/module-ui": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory-admin-ui": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryCatalogAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-catalog-api", + "version": "1.3.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-catalog-api/magento-module-inventory-catalog-api-1.3.5.0.zip", + "shasum": "454a41e392a82d2c695c1b7ad6be6d575f89277f" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryCatalogApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-catalog-frontend-ui", + "version": "1.0.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-catalog-frontend-ui/magento-module-inventory-catalog-frontend-ui-1.0.4.0.zip", + "shasum": "894a06a8a301c0544773644e3167127aa65eeb27" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory-catalog": "1.3.*", + "magento/module-inventory-catalog-api": "1.3.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryCatalogFrontendUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-catalog-search", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-catalog-search/magento-module-inventory-catalog-search-1.2.5.0.zip", + "shasum": "eafa9f3e90d6874c85dc45f38c2e8ceab1f87dc9" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog-inventory": "*", + "magento/module-catalog-search": "*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-indexer": "2.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryCatalogSearch\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-catalog-search-bundle-product", + "version": "1.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-catalog-search-bundle-product/magento-module-inventory-catalog-search-bundle-product-1.0.3.0.zip", + "shasum": "1bcc000953cb18299a64ce2a19eee0c19abc2142" + }, + "require": { + "magento/framework": "*", + "magento/module-bundle": "*", + "magento/module-catalog": "*", + "magento/module-eav": "*", + "magento/module-inventory-catalog-search": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryCatalogSearchBundleProduct\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-catalog-search-configurable-product", + "version": "1.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-catalog-search-configurable-product/magento-module-inventory-catalog-search-configurable-product-1.0.3.0.zip", + "shasum": "fc2632a67b738277c91c0c0d8a4bc12e40c010a6" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-configurable-product": "*", + "magento/module-eav": "*", + "magento/module-inventory-catalog-search": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryCatalogSearchConfigurableProduct\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-configurable-product", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-configurable-product/magento-module-inventory-configurable-product-1.2.5.0.zip", + "shasum": "765e4f26dd13c421eb0ff099df62373d05b28b66" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-catalog-inventory": "*", + "magento/module-configurable-product": "*", + "magento/module-eav": "*", + "magento/module-inventory-catalog": "1.3.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration": "1.2.*", + "magento/module-inventory-indexer": "2.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-sales": "*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory": "1.2.*", + "magento/module-inventory-api": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryConfigurableProduct\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-configurable-product-admin-ui", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-configurable-product-admin-ui/magento-module-inventory-configurable-product-admin-ui-1.2.5.0.zip", + "shasum": "2b1db6ab7f231437154ea0e27c7b74a17f061069" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-configurable-product": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-ui": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryConfigurableProductAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-configurable-product-frontend-ui", + "version": "1.0.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-configurable-product-frontend-ui/magento-module-inventory-configurable-product-frontend-ui-1.0.5.0.zip", + "shasum": "04b6f96ba3dfbb98946ae4296afb8374cdde5ba0" + }, + "require": { + "magento/framework": "*", + "magento/module-configurable-product": "*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory-catalog": "1.3.*", + "magento/module-inventory-configurable-product": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryConfigurableProductFrontendUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-configurable-product-indexer", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-configurable-product-indexer/magento-module-inventory-configurable-product-indexer-1.2.5.0.zip", + "shasum": "4d87bdcdf34e1dfa2c2d9852510b1848f7f19a21" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-configurable-product": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-indexer": "2.2.*", + "magento/module-inventory-multi-dimensional-indexer-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryConfigurableProductIndexer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-configuration", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-configuration/magento-module-inventory-configuration-1.2.4.0.zip", + "shasum": "1d05460f26ff46ef1e536f687ba872d0c133f2af" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog-inventory": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryConfiguration\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-configuration-api", + "version": "1.2.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-configuration-api/magento-module-inventory-configuration-api-1.2.3.0.zip", + "shasum": "b4a36e253bc7e41d5e0cb171c16984b29d9d653c" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryConfigurationApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-distance-based-source-selection", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-distance-based-source-selection/magento-module-inventory-distance-based-source-selection-1.2.4.0.zip", + "shasum": "7f69774d8a3cfee72dbc7531ed364d4545996f55" + }, + "require": { + "magento/framework": "*", + "magento/module-config": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-distance-based-source-selection-api": "1.2.*", + "magento/module-inventory-source-selection-api": "1.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryDistanceBasedSourceSelection\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-distance-based-source-selection-admin-ui", + "version": "1.2.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-distance-based-source-selection-admin-ui/magento-module-inventory-distance-based-source-selection-admin-ui-1.2.3.0.zip", + "shasum": "0e96b5df029e9cdadbd0a03c4105ffea39049ff8" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryDistanceBasedSourceSelectionAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-distance-based-source-selection-api", + "version": "1.2.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-distance-based-source-selection-api/magento-module-inventory-distance-based-source-selection-api-1.2.3.0.zip", + "shasum": "79f5304f30884efbb800150afd0b4c3635bbf4d9" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-source-selection-api": "1.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryDistanceBasedSourceSelectionApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-elasticsearch", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-elasticsearch/magento-module-inventory-elasticsearch-1.2.4.0.zip", + "shasum": "f8e12cd8eee7ca2b91f7b48929026612094fcd1b" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog-inventory": "*", + "magento/module-catalog-search": "*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-indexer": "2.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-elasticsearch": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryElasticsearch\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-export-stock", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-export-stock/magento-module-inventory-export-stock-1.2.4.0.zip", + "shasum": "52e55fd2a80ee67ee722238d523b57362d97b616" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-catalog-inventory": "*", + "magento/module-configurable-product": "*", + "magento/module-grouped-product": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-configuration": "1.2.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-export-stock-api": "1.2.*", + "magento/module-inventory-indexer": "2.2.*", + "magento/module-inventory-sales": "1.3.*", + "magento/module-inventory-sales-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryExportStock\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-export-stock-api", + "version": "1.2.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-export-stock-api/magento-module-inventory-export-stock-api-1.2.3.0.zip", + "shasum": "20c3aa4338552b895f85623434c2d45128e55691" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-sales-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryExportStockApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-graph-ql", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-graph-ql/magento-module-inventory-graph-ql-1.2.4.0.zip", + "shasum": "88078a2c08a0e85c67c6facc5b48566073379356" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-inventory-catalog": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-grouped-product", + "version": "1.3.2", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-grouped-product/magento-module-inventory-grouped-product-1.3.2.0.zip", + "shasum": "3f7e7ba4095ef83d4e77d041563220e574491ccc" + }, + "require": { + "magento/framework": "*", + "magento/module-grouped-product": "*", + "magento/module-inventory-catalog-api": "1.3.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryGroupedProduct\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-grouped-product-admin-ui", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-grouped-product-admin-ui/magento-module-inventory-grouped-product-admin-ui-1.2.4.0.zip", + "shasum": "ca7e2e1f7036a1dc2d786b8e69e1b336f6ccba15" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-grouped-product": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-admin-ui": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-ui": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory-configuration-api": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryGroupedProductAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-grouped-product-indexer", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-grouped-product-indexer/magento-module-inventory-grouped-product-indexer-1.2.5.0.zip", + "shasum": "55e4e429597eccb4dba95196277e95ba7256ffdb" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-grouped-product": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-indexer": "2.2.*", + "magento/module-inventory-multi-dimensional-indexer-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory": "1.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryGroupedProductIndexer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-import-export", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-import-export/magento-module-inventory-import-export-1.2.5.0.zip", + "shasum": "93c9a64d113007cabe6c7477c6ee89ae67e684e3" + }, + "require": { + "magento/framework": "*", + "magento/module-eav": "*", + "magento/module-import-export": "*", + "magento/module-inventory": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-import-export": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup/magento-module-inventory-in-store-pickup-1.1.3.0.zip", + "shasum": "8be5618df7522912731ffc23ac6e6ff65be6c818" + }, + "require": { + "magento/framework": "*", + "magento/module-directory": "*", + "magento/module-inventory": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-distance-based-source-selection-api": "1.2.*", + "magento/module-inventory-in-store-pickup-api": "1.1.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-inventory-source-selection-api": "1.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickup\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-admin-ui", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-admin-ui/magento-module-inventory-in-store-pickup-admin-ui-1.1.4.0.zip", + "shasum": "0746d8610c90125e656dc93ff8a3376e14166630" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-admin-ui": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-in-store-pickup-api": "1.1.*", + "magento/module-ui": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-api", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-api/magento-module-inventory-in-store-pickup-api-1.1.3.0.zip", + "shasum": "f735c054cece6880370edd8d059dddb55a06ca86" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-frontend", + "version": "1.1.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-frontend/magento-module-inventory-in-store-pickup-frontend-1.1.5.0.zip", + "shasum": "bb3ca5f461107f859a9d2e4715ce53fd443911ff" + }, + "require": { + "magento/framework": "*", + "magento/module-checkout": "*", + "magento/module-inventory-in-store-pickup-api": "1.1.*", + "magento/module-inventory-in-store-pickup-sales-api": "1.1.*", + "magento/module-inventory-in-store-pickup-shipping-api": "1.1.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupFrontend\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-graph-ql", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-graph-ql/magento-module-inventory-in-store-pickup-graph-ql-1.1.4.0.zip", + "shasum": "2e99c6827f31c2c1a0d49decc4c834872b9aa7d4" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-in-store-pickup-api": "1.1.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-multishipping", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-multishipping/magento-module-inventory-in-store-pickup-multishipping-1.1.3.0.zip", + "shasum": "1606bb162e90b07406b865d9f3fd0a42d9625ed9" + }, + "require": { + "magento/framework": "*", + "magento/module-checkout": "*", + "magento/module-inventory-in-store-pickup-shipping-api": "1.1.*", + "magento/module-quote": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupMultishipping\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-quote", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-quote/magento-module-inventory-in-store-pickup-quote-1.1.3.0.zip", + "shasum": "317d4785a1292741fc8db6d89008b7cc9c571304" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-in-store-pickup": "1.1.*", + "magento/module-inventory-in-store-pickup-api": "1.1.*", + "magento/module-inventory-in-store-pickup-shipping-api": "1.1.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-quote": "*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupQuote\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-quote-graph-ql", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-quote-graph-ql/magento-module-inventory-in-store-pickup-quote-graph-ql-1.1.3.0.zip", + "shasum": "29191414c8afc0a583db095a70bd08635d902b86" + }, + "require": { + "magento/framework": "*", + "magento/module-graph-ql": "*", + "magento/module-quote": "*", + "magento/module-quote-graph-ql": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupQuoteGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-sales", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-sales/magento-module-inventory-in-store-pickup-sales-1.1.3.0.zip", + "shasum": "debd43f318a955eab0785dff2fa9348f27813417" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-in-store-pickup-api": "1.1.*", + "magento/module-inventory-in-store-pickup-sales-api": "1.1.*", + "magento/module-inventory-source-selection-api": "1.4.*", + "magento/module-sales": "*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupSales\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-sales-admin-ui", + "version": "1.1.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-sales-admin-ui/magento-module-inventory-in-store-pickup-sales-admin-ui-1.1.5.0.zip", + "shasum": "c1db93afd600c3c51349d65eab07f9204f5241cb" + }, + "require": { + "magento/framework": "*", + "magento/module-backend": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-in-store-pickup-quote": "1.1.*", + "magento/module-inventory-in-store-pickup-sales": "1.1.*", + "magento/module-inventory-in-store-pickup-sales-api": "1.1.*", + "magento/module-inventory-in-store-pickup-shipping-api": "1.1.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-quote": "*", + "magento/module-sales": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupSalesAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-sales-api", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-sales-api/magento-module-inventory-in-store-pickup-sales-api-1.1.3.0.zip", + "shasum": "eb1f9f0cc03b0f1843e230fbe8d4d90fee81073b" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupSalesApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-shipping", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-shipping/magento-module-inventory-in-store-pickup-shipping-1.1.4.0.zip", + "shasum": "34ac5afea2ec7d7d7f13422cc65a7e762dffe107" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-inventory-in-store-pickup-api": "1.1.*", + "magento/module-inventory-in-store-pickup-shipping-api": "1.1.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-quote": "*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupShipping\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-shipping-admin-ui", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-shipping-admin-ui/magento-module-inventory-in-store-pickup-shipping-admin-ui-1.1.3.0.zip", + "shasum": "53d3709e8498a3f467d5d2cfe7fd730e0b14ba98" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-in-store-pickup-shipping-api": "1.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-shipping": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupShippingAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-shipping-api", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-shipping-api/magento-module-inventory-in-store-pickup-shipping-api-1.1.3.0.zip", + "shasum": "dc38160b3440532ed54d1086da2da67393ef1d2c" + }, + "require": { + "magento/framework": "*", + "magento/module-quote": "*", + "magento/module-shipping": "*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupShippingApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-in-store-pickup-webapi-extension", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-in-store-pickup-webapi-extension/magento-module-inventory-in-store-pickup-webapi-extension-1.1.3.0.zip", + "shasum": "fd671b0b77e4dafb3b6ef8a59f12d5f775f878d8" + }, + "require": { + "magento/framework": "*", + "magento/module-webapi": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryInStorePickupWebapiExtension\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-indexer", + "version": "2.2.2", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-indexer/magento-module-inventory-indexer-2.2.2.0.zip", + "shasum": "7f6ac70ee347c8c7a15da41a774002dbd0be2fc8" + }, + "require": { + "magento/framework": "*", + "magento/framework-message-queue": "*", + "magento/module-inventory": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-multi-dimensional-indexer-api": "1.2.*", + "magento/module-inventory-sales": "1.3.*", + "magento/module-inventory-sales-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryIndexer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-low-quantity-notification", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-low-quantity-notification/magento-module-inventory-low-quantity-notification-1.2.4.0.zip", + "shasum": "6dcdf81fa01ef5b4dc172d68f69f107413647e3a" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-catalog-inventory": "*", + "magento/module-eav": "*", + "magento/module-inventory": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-low-quantity-notification-api": "1.2.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryLowQuantityNotification\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-low-quantity-notification-admin-ui", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-low-quantity-notification-admin-ui/magento-module-inventory-low-quantity-notification-admin-ui-1.2.4.0.zip", + "shasum": "515f049ad99e620f37c211c9525bfa33fd934403" + }, + "require": { + "magento/framework": "*", + "magento/module-backend": "*", + "magento/module-catalog": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-low-quantity-notification": "1.2.*", + "magento/module-inventory-low-quantity-notification-api": "1.2.*", + "magento/module-reports": "*", + "magento/module-ui": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryLowQuantityNotificationAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-low-quantity-notification-api", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-low-quantity-notification-api/magento-module-inventory-low-quantity-notification-api-1.2.4.0.zip", + "shasum": "88e65979deb58445bde074f84f8dbf77485fe946" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryLowQuantityNotificationApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-multi-dimensional-indexer-api", + "version": "1.2.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-multi-dimensional-indexer-api/magento-module-inventory-multi-dimensional-indexer-api-1.2.3.0.zip", + "shasum": "4abc0068cd43ecd46cd4469fd540505fc537933d" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryMultiDimensionalIndexerApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-product-alert", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-product-alert/magento-module-inventory-product-alert-1.2.4.0.zip", + "shasum": "de6155291e805fade5e3bd6da58df2e416703343" + }, + "require": { + "magento/framework": "*", + "magento/module-backend": "*", + "magento/module-catalog": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-product-alert": "*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-product-alert": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryProductAlert\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-quote-graph-ql", + "version": "1.0.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-quote-graph-ql/magento-module-inventory-quote-graph-ql-1.0.4.0.zip", + "shasum": "9e18d3bcb0347bac14080d4712d55f0a03ca77eb" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-catalog": "1.3.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-quote": "*", + "magento/module-quote-graph-ql": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryQuoteGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-requisition-list", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-requisition-list/magento-module-inventory-requisition-list-1.2.5.0.zip", + "shasum": "f9859b301e6a8d4fd9532994dd7f8390ea8a716c" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-requisition-list": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryRequisitionList\\": "" + } + }, + "license": [ + "proprietary" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-reservation-cli", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-reservation-cli/magento-module-inventory-reservation-cli-1.2.4.0.zip", + "shasum": "6dd0f7d8c07832e56c8300f8c8b13fa8cf3c5428" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-reservations-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-sales": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryReservationCli\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-reservations", + "version": "1.2.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-reservations/magento-module-inventory-reservations-1.2.3.0.zip", + "shasum": "c262a6a43e6fd2c3ebcaef4253aa0ed2bd1e0a89" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-reservations-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryReservations\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-reservations-api", + "version": "1.2.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-reservations-api/magento-module-inventory-reservations-api-1.2.3.0.zip", + "shasum": "26e85495865ce013841cd652ffa85abe5e5ac3e8" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryReservationsApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-sales", + "version": "1.3.2", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-sales/magento-module-inventory-sales-1.3.2.0.zip", + "shasum": "4e1ea64b4a8c14818e6b6bff818a0b1cfbba331d" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-catalog-inventory": "*", + "magento/module-inventory": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-reservations-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-inventory-source-deduction-api": "1.2.*", + "magento/module-inventory-source-selection-api": "1.4.*", + "magento/module-sales": "*", + "magento/module-sales-inventory": "*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "require-dev": { + "magento/module-inventory-indexer": "*" + }, + "suggest": { + "magento/module-inventory-catalog": "1.3.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventorySales\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-sales-admin-ui", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-sales-admin-ui/magento-module-inventory-sales-admin-ui-1.2.5.0.zip", + "shasum": "6975ff88a37410b984ac5273ef702e734f0222e4" + }, + "require": { + "magento/framework": "*", + "magento/module-backend": "*", + "magento/module-catalog": "*", + "magento/module-catalog-inventory": "*", + "magento/module-inventory-admin-ui": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-store": "*", + "magento/module-ui": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-sales": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventorySalesAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-sales-api", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-sales-api/magento-module-inventory-sales-api-1.2.4.0.zip", + "shasum": "11f6a7ec2ab736d5f0ede6c4cf71967e88974989" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-sales": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventorySalesApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-sales-async-order", + "version": "100.2.1", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-sales-async-order/magento-module-inventory-sales-async-order-100.2.1.0.zip", + "shasum": "3f1fcb750f0134d47bd33f9fc46bad9511cef9e7" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-sales": "1.3.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-quote": "*", + "magento/module-sales": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-async-order": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventorySalesAsyncOrder\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-sales-frontend-ui", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-sales-frontend-ui/magento-module-inventory-sales-frontend-ui-1.2.4.0.zip", + "shasum": "f24d640ce8c23bffd045a69379f5dab6b247bc64" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog-inventory": "*", + "magento/module-inventory-catalog-frontend-ui": "1.0.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventorySalesFrontendUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-setup-fixture-generator", + "version": "1.2.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-setup-fixture-generator/magento-module-inventory-setup-fixture-generator-1.2.3.0.zip", + "shasum": "d33831b59ddfab4511c084d79d1f56ca86965873" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventorySetupFixtureGenerator\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-shipping", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-shipping/magento-module-inventory-shipping-1.2.4.0.zip", + "shasum": "bd46ec58b803ccbd7ebce06a9ad6727460c8e046" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-inventory-source-deduction-api": "1.2.*", + "magento/module-inventory-source-selection-api": "1.4.*", + "magento/module-sales": "*", + "magento/module-shipping": "*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryShipping\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-shipping-admin-ui", + "version": "1.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-shipping-admin-ui/magento-module-inventory-shipping-admin-ui-1.2.5.0.zip", + "shasum": "fa5b6ee00f464e695206b8b3e09e2e8b75e6e7e1" + }, + "require": { + "magento/framework": "*", + "magento/module-backend": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-inventory-source-selection-api": "1.4.*", + "magento/module-sales": "*", + "magento/module-shipping": "*", + "magento/module-ui": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryShippingAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-source-deduction-api", + "version": "1.2.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-source-deduction-api/magento-module-inventory-source-deduction-api-1.2.4.0.zip", + "shasum": "f2e93dc80323ab1c6a7998bef94c132c3ab8c630" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory": "1.2.*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-configuration-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventorySourceDeductionApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-source-selection", + "version": "1.2.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-source-selection/magento-module-inventory-source-selection-1.2.3.0.zip", + "shasum": "6681911999c1c76b4d30fdf5d713b7f2591d46b9" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-source-selection-api": "1.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventorySourceSelection\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-source-selection-api", + "version": "1.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-source-selection-api/magento-module-inventory-source-selection-api-1.4.4.0.zip", + "shasum": "77beff33c81a90396e4d06f3778bb466455f9a27" + }, + "require": { + "magento/framework": "*", + "magento/module-inventory-api": "1.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-sales": "*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventorySourceSelectionApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-swatches-frontend-ui", + "version": "1.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-swatches-frontend-ui/magento-module-inventory-swatches-frontend-ui-1.0.3.0.zip", + "shasum": "72fce16d00bcb2eeda02cf9ae2e2ef71bb397d9b" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory-configurable-product-frontend-ui": "1.0.*", + "magento/module-swatches": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventorySwatchesFrontendUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-visual-merchandiser", + "version": "1.1.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-visual-merchandiser/magento-module-inventory-visual-merchandiser-1.1.5.0.zip", + "shasum": "0b787929e1633125e889e2a9de4b5f7f52d17883" + }, + "require": { + "magento/framework": "*", + "magento/module-catalog": "*", + "magento/module-inventory": "1.2.*", + "magento/module-inventory-catalog-api": "1.3.*", + "magento/module-inventory-indexer": "2.2.*", + "magento/module-inventory-sales-api": "1.2.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "require-dev": { + "magento/module-inventory-api": "*", + "magento/module-inventory-configuration-api": "*" + }, + "suggest": { + "magento/module-visual-merchandiser": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryVisualMerchandiser\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-inventory-wishlist", + "version": "1.0.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-inventory-wishlist/magento-module-inventory-wishlist-1.0.4.0.zip", + "shasum": "3b1ce40972a21eae74fe2815fbbc52792a0d8787" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory": "1.2.*", + "magento/module-wishlist": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\InventoryWishlist\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-jwt-framework-adapter", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-jwt-framework-adapter/magento-module-jwt-framework-adapter-100.4.3.0.zip", + "shasum": "1d4cd9cf386dc982e5786cfa29ad99b3c799faae" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0", + "web-token/jwt-framework": "^3.1.2" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\JwtFrameworkAdapter\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "JWT Manager implementation based on jwt-framework" + }, + { + "name": "magento/module-jwt-user-token", + "version": "100.4.2", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-jwt-user-token/magento-module-jwt-user-token-100.4.2.0.zip", + "shasum": "e7b63fcfe503e0fa06b37bc984c5edec2aa385b6" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-integration": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\JwtUserToken\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Introduces JWT token support for web API authentication" + }, + { + "name": "magento/module-layered-navigation", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-layered-navigation/magento-module-layered-navigation-100.4.7.0.zip", + "shasum": "42ad92c8541a77cf7948656c2f33c08b6d88ac27" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-config": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LayeredNavigation\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-login-as-customer", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-login-as-customer/magento-module-login-as-customer-100.4.7.0.zip", + "shasum": "5e824e118ff0d8b33d7f5544d40fe447692902d8" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-customer": "103.0.*", + "magento/module-login-as-customer-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-backend": "102.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LoginAsCustomer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Allow for admin to enter a customer account" + }, + { + "name": "magento/module-login-as-customer-admin-ui", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-login-as-customer-admin-ui/magento-module-login-as-customer-admin-ui-100.4.7.0.zip", + "shasum": "f3e3b7c82c2a8513dff8fe93c86e58a1d29936b1" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-customer": "103.0.*", + "magento/module-login-as-customer-api": "100.4.*", + "magento/module-login-as-customer-frontend-ui": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-login-as-customer": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LoginAsCustomerAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ] + }, + { + "name": "magento/module-login-as-customer-api", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-login-as-customer-api/magento-module-login-as-customer-api-100.4.6.0.zip", + "shasum": "ca281a0a38e141018f6dd196be7cdbfaea0b31a0" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LoginAsCustomerApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Allow for admin to enter a customer account" + }, + { + "name": "magento/module-login-as-customer-assistance", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-login-as-customer-assistance/magento-module-login-as-customer-assistance-100.4.6.0.zip", + "shasum": "a8b14ed25cad23f16eb09e8d3d1462286972f6fc" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-customer": "103.0.*", + "magento/module-login-as-customer": "100.4.*", + "magento/module-login-as-customer-api": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-login-as-customer-admin-ui": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LoginAsCustomerAssistance\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ] + }, + { + "name": "magento/module-login-as-customer-frontend-ui", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-login-as-customer-frontend-ui/magento-module-login-as-customer-frontend-ui-100.4.6.0.zip", + "shasum": "d30180e83de727e10834305d4bd8d3245d6af590" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-customer": "103.0.*", + "magento/module-login-as-customer-api": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LoginAsCustomerFrontendUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ] + }, + { + "name": "magento/module-login-as-customer-graph-ql", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-login-as-customer-graph-ql/magento-module-login-as-customer-graph-ql-100.4.4.0.zip", + "shasum": "96239c8f91ed1c8a7aebbe60e35b818c90bf44b5" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-customer": "103.0.*", + "magento/module-integration": "100.4.*", + "magento/module-login-as-customer-api": "100.4.*", + "magento/module-login-as-customer-assistance": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-login-as-customer": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LoginAsCustomerGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Flexible login as a customer so a merchant or merchant admin can log into an end customer's account to assist them with their account." + }, + { + "name": "magento/module-login-as-customer-log", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-login-as-customer-log/magento-module-login-as-customer-log-100.4.5.0.zip", + "shasum": "b7091236e396f0916c4531efd4e8399d3810e4a8" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-customer": "103.0.*", + "magento/module-login-as-customer-api": "100.4.*", + "magento/module-ui": "101.2.*", + "magento/module-user": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-login-as-customer": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LoginAsCustomerLog\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ] + }, + { + "name": "magento/module-login-as-customer-page-cache", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-login-as-customer-page-cache/magento-module-login-as-customer-page-cache-100.4.6.0.zip", + "shasum": "b78e108d8bd75a471dc5e5f40aaf1b368f5d2cee" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-login-as-customer-api": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-page-cache": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LoginAsCustomerPageCache\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ] + }, + { + "name": "magento/module-login-as-customer-quote", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-login-as-customer-quote/magento-module-login-as-customer-quote-100.4.5.0.zip", + "shasum": "4ba45a29c4d41ee1de5209d0992848a973cde736" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-quote": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-login-as-customer-api": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LoginAsCustomerQuote\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ] + }, + { + "name": "magento/module-login-as-customer-sales", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-login-as-customer-sales/magento-module-login-as-customer-sales-100.4.6.0.zip", + "shasum": "423a37f2796dace16ca130f03ecb94e1fe29b167" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-login-as-customer-api": "100.4.*", + "magento/module-user": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-sales": "103.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\LoginAsCustomerSales\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ] + }, + { + "name": "magento/module-marketplace", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-marketplace/magento-module-marketplace-100.4.5.0.zip", + "shasum": "bac9fee3bc48528200ea5b271d9576988080ce74" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Marketplace\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-media-content", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-content/magento-module-media-content-100.4.5.0.zip", + "shasum": "50e1a85d5319da4e5f252198b43403ef9663507c" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-media-content-api": "100.4.*", + "magento/module-media-gallery-api": "101.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaContent\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides the implementation for managing relations between content and media files used in that content" + }, + { + "name": "magento/module-media-content-api", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-content-api/magento-module-media-content-api-100.4.6.0.zip", + "shasum": "002a1d6cd1d901d0a6a7dd0c316f8e3b31fa6ea0" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-media-gallery-api": "101.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaContentApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides the API interfaces for managing relations between content and media files used in that content" + }, + { + "name": "magento/module-media-content-catalog", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-content-catalog/magento-module-media-content-catalog-100.4.5.0.zip", + "shasum": "664d4a9d2ff78fda2cb7ee4f669ee6aee6114d26" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-eav": "102.1.*", + "magento/module-media-content-api": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaContentCatalog\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides the implementation of MediaContent functionality for Magento_Catalog module" + }, + { + "name": "magento/module-media-content-cms", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-content-cms/magento-module-media-content-cms-100.4.5.0.zip", + "shasum": "4812a74e3b475729aa17e1a965efad259a82c02b" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-cms": "104.0.*", + "magento/module-media-content-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaContentCms\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides the implementation of MediaContent functionality for Magento_Cms module" + }, + { + "name": "magento/module-media-content-synchronization", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-content-synchronization/magento-module-media-content-synchronization-100.4.6.0.zip", + "shasum": "260461d18cc871777cf2d86c65d0345e17e9e38c" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-bulk": "101.0.*", + "magento/module-asynchronous-operations": "100.4.*", + "magento/module-media-content-api": "100.4.*", + "magento/module-media-content-synchronization-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-media-gallery-synchronization": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaContentSynchronization\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides implementation of the media content data synchronization." + }, + { + "name": "magento/module-media-content-synchronization-api", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-content-synchronization-api/magento-module-media-content-synchronization-api-100.4.5.0.zip", + "shasum": "64d2e47e4b7c99a65522f71d44c4b4270dd828d0" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-media-content-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaContentSynchronizationApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for the media content synchronization implementation API" + }, + { + "name": "magento/module-media-content-synchronization-catalog", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-content-synchronization-catalog/magento-module-media-content-synchronization-catalog-100.4.4.0.zip", + "shasum": "fee5331975fda0d313289a09f939974849398875" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-media-content-api": "100.4.*", + "magento/module-media-content-synchronization-api": "100.4.*", + "magento/module-media-gallery-synchronization-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaContentSynchronizationCatalog\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides the implementation of MediaContentSynchronization functionality for Magento_Catalog module" + }, + { + "name": "magento/module-media-content-synchronization-cms", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-content-synchronization-cms/magento-module-media-content-synchronization-cms-100.4.4.0.zip", + "shasum": "43611d2089e55e140f178e6f92fb451465626d0e" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-media-content-api": "100.4.*", + "magento/module-media-content-synchronization-api": "100.4.*", + "magento/module-media-gallery-synchronization-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaContentSynchronizationCms\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides the implementation of MediaContentSynchronization functionality for Magento_Cms module" + }, + { + "name": "magento/module-media-gallery", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery/magento-module-media-gallery-100.4.6.0.zip", + "shasum": "06ece683dac6ad76e66a68ad5be8291b3625cd58" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-cms": "104.0.*", + "magento/module-media-gallery-api": "101.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGallery\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for media handling" + }, + { + "name": "magento/module-media-gallery-api", + "version": "101.0.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-api/magento-module-media-gallery-api-101.0.6.0.zip", + "shasum": "6e72a6a5f5ea19acfb9e11fed3e4dedcf235970f" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for media gallery asset attributes storage and management" + }, + { + "name": "magento/module-media-gallery-catalog", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-catalog/magento-module-media-gallery-catalog-100.4.4.0.zip", + "shasum": "21bebf607d14938c2b0e0210640cb025696e400a" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-media-gallery-api": "101.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryCatalog\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for catalog gallery processor delete operation handling" + }, + { + "name": "magento/module-media-gallery-catalog-integration", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-catalog-integration/magento-module-media-gallery-catalog-integration-100.4.4.0.zip", + "shasum": "f9714fa4692cdcbd963be21d5be05d9fe439bae3" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-cms": "104.0.*", + "magento/module-media-gallery-api": "101.0.*", + "magento/module-media-gallery-synchronization-api": "100.4.*", + "magento/module-media-gallery-ui-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog": "104.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryCatalogIntegration\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for extending catalog image uploader functionality" + }, + { + "name": "magento/module-media-gallery-catalog-ui", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-catalog-ui/magento-module-media-gallery-catalog-ui-100.4.4.0.zip", + "shasum": "a839bfe0e54e9aeb62453851d8a7f3998a6b2189" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-cms": "104.0.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryCatalogUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module that implement category grid for media gallery." + }, + { + "name": "magento/module-media-gallery-cms-ui", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-cms-ui/magento-module-media-gallery-cms-ui-100.4.4.0.zip", + "shasum": "83061c458b112643f2a5afb48bd0652257926311" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-cms": "104.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryCmsUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Cms related UI elements in the magento media gallery" + }, + { + "name": "magento/module-media-gallery-integration", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-integration/magento-module-media-gallery-integration-100.4.6.0.zip", + "shasum": "dfd454f2169e769136abcee8124d6b50936dd3ce" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-media-gallery-api": "101.0.*", + "magento/module-media-gallery-synchronization-api": "100.4.*", + "magento/module-media-gallery-ui-api": "100.4.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "require-dev": { + "magento/module-cms": "*" + }, + "suggest": { + "magento/module-catalog": "104.0.*", + "magento/module-cms": "104.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryIntegration\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for integration of enhanced media gallery" + }, + { + "name": "magento/module-media-gallery-metadata", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-metadata/magento-module-media-gallery-metadata-100.4.5.0.zip", + "shasum": "5167e7d6f51a9288869f4a4155a45520907a81f2" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-media-gallery-metadata-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryMetadata\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for images metadata processing" + }, + { + "name": "magento/module-media-gallery-metadata-api", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-metadata-api/magento-module-media-gallery-metadata-api-100.4.4.0.zip", + "shasum": "3d89125e64f6d88f79bd00f57ea578b971a14977" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryMetadataApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for media gallery metadata implementation API" + }, + { + "name": "magento/module-media-gallery-renditions", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-renditions/magento-module-media-gallery-renditions-100.4.5.0.zip", + "shasum": "653fc1bf112c823af17a84c874cc49cc7e593e36" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-message-queue": "100.4.*", + "magento/module-cms": "104.0.*", + "magento/module-media-gallery-api": "101.0.*", + "magento/module-media-gallery-renditions-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-media-content-api": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryRenditions\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module that implements height and width fields for for media gallery items." + }, + { + "name": "magento/module-media-gallery-renditions-api", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-renditions-api/magento-module-media-gallery-renditions-api-100.4.4.0.zip", + "shasum": "a0e1acedddc4d3d9cc502e96517521b25db4fd03" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryRenditionsApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module that is responsible for the API implementation of Media Gallery Renditions." + }, + { + "name": "magento/module-media-gallery-synchronization", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-synchronization/magento-module-media-gallery-synchronization-100.4.6.0.zip", + "shasum": "f01c6bcafd07feebe7436d765d82b2c28d83def3" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-message-queue": "100.4.*", + "magento/module-media-gallery-api": "101.0.*", + "magento/module-media-gallery-synchronization-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGallerySynchronization\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides implementation of the media gallery data synchronization." + }, + { + "name": "magento/module-media-gallery-synchronization-api", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-synchronization-api/magento-module-media-gallery-synchronization-api-100.4.5.0.zip", + "shasum": "8b18ef80a95909068f6aa4705480d538f3ee3c8e" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-media-gallery-api": "101.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGallerySynchronizationApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for the media gallery synchronization implementation API" + }, + { + "name": "magento/module-media-gallery-synchronization-metadata", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-synchronization-metadata/magento-module-media-gallery-synchronization-metadata-100.4.3.0.zip", + "shasum": "c71353b2d5ab08f0668440698121fd6222664c66" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-media-gallery-api": "101.0.*", + "magento/module-media-gallery-metadata-api": "100.4.*", + "magento/module-media-gallery-synchronization-api": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGallerySynchronizationMetadata\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for images metadata synchronization" + }, + { + "name": "magento/module-media-gallery-ui", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-ui/magento-module-media-gallery-ui-100.4.6.0.zip", + "shasum": "e13896eeb0e1408b57cd051866cd0b9a4e6c5ae9" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-cms": "104.0.*", + "magento/module-directory": "100.4.*", + "magento/module-media-content-api": "100.4.*", + "magento/module-media-gallery-api": "101.0.*", + "magento/module-media-gallery-metadata-api": "100.4.*", + "magento/module-media-gallery-synchronization-api": "100.4.*", + "magento/module-media-gallery-ui-api": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for the media gallery UI implementation" + }, + { + "name": "magento/module-media-gallery-ui-api", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-gallery-ui-api/magento-module-media-gallery-ui-api-100.4.5.0.zip", + "shasum": "6fcaf31a4d47588b22864bd60b528cd2f21c2090" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-cms": "104.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaGalleryUiApi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module responsible for the media gallery UI implementation API" + }, + { + "name": "magento/module-media-storage", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-media-storage/magento-module-media-storage-100.4.6.0.zip", + "shasum": "b0614c27d38e2d54131b6cd434b02ca469c6203e" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-bulk": "101.0.*", + "magento/module-asynchronous-operations": "100.4.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MediaStorage\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-message-queue", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-message-queue/magento-module-message-queue-100.4.7.0.zip", + "shasum": "914a6697815881268f0b5c3bb368ca5359404973" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-message-queue": "100.4.*", + "magento/magento-composer-installer": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MessageQueue\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-msrp", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-msrp/magento-module-msrp-100.4.6.0.zip", + "shasum": "5c08a65a5c3d26f914326c4ccbb65226fa6c5ea7" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-downloadable": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-bundle": "101.0.*", + "magento/module-msrp-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Msrp\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-msrp-configurable-product", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-msrp-configurable-product/magento-module-msrp-configurable-product-100.4.4.0.zip", + "shasum": "ba1aef847e4eae875db9b17e5ed9a8f910c42c33" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-configurable-product": "100.4.*", + "magento/module-msrp": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MsrpConfigurableProduct\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-msrp-grouped-product", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-msrp-grouped-product/magento-module-msrp-grouped-product-100.4.4.0.zip", + "shasum": "150f6c6d1cd88b04acb217a0854c4251c5f5b65d" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-grouped-product": "100.4.*", + "magento/module-msrp": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MsrpGroupedProduct\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-multishipping", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-multishipping/magento-module-multishipping-100.4.7.0.zip", + "shasum": "ef813346d4d5526f975c1aa21e68b6b3d613edb2" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-captcha": "100.4.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-payment": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-theme": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Multishipping\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-mysql-mq", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-mysql-mq/magento-module-mysql-mq-100.4.5.0.zip", + "shasum": "81e5299220920c4b67b1ddaaf88689086e0815c7" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-message-queue": "100.4.*", + "magento/magento-composer-installer": "*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\MysqlMq\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-new-relic-reporting", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-new-relic-reporting/magento-module-new-relic-reporting-100.4.5.0.zip", + "shasum": "63622670b8573709c0652b69f7c23d449aff94b5" + }, + "require": { + "magento/framework": "103.0.*", + "magento/magento-composer-installer": "*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-configurable-product": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\NewRelicReporting\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-newsletter", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-newsletter/magento-module-newsletter-100.4.7.0.zip", + "shasum": "f69cf50ecced995bcf923d12d48545777f42be48" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-cms": "104.0.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-email": "101.1.*", + "magento/module-require-js": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-widget": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Newsletter\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-newsletter-graph-ql", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-newsletter-graph-ql/magento-module-newsletter-graph-ql-100.4.4.0.zip", + "shasum": "422d9c4e2258aca36af6ce07b5c58adc77198ed3" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-customer": "103.0.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-graph-ql-resolver-cache": "100.4.*", + "magento/module-newsletter": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\NewsletterGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Provides GraphQl functionality for the newsletter subscriptions." + }, + { + "name": "magento/module-offline-payments", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-offline-payments/magento-module-offline-payments-100.4.5.0.zip", + "shasum": "01143954df3c70a8f5073f2f43656b852ff83b58" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-payment": "100.4.*", + "magento/module-quote": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\OfflinePayments\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-offline-shipping", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-offline-shipping/magento-module-offline-shipping-100.4.6.0.zip", + "shasum": "7fb9d6faaf8f22e241c9c459274ce13186ec8923" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-async-config": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-directory": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-sales-rule": "101.2.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-checkout": "100.4.*", + "magento/module-offline-shipping-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\OfflineShipping\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-open-search", + "version": "100.4.1", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-open-search/magento-module-open-search-100.4.1.0.zip", + "shasum": "07afcb0e588b1f2cd89581b72e2f46c4b499a1b0" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-advanced-search": "100.4.*", + "magento/module-catalog-search": "102.0.*", + "magento/module-config": "101.2.*", + "magento/module-elasticsearch": "101.0.*", + "magento/module-search": "101.1.*", + "opensearch-project/opensearch-php": "^1.0 || ^2.0", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\OpenSearch\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-order-cancellation", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-order-cancellation/magento-module-order-cancellation-100.4.0.0.zip", + "shasum": "c33d4a3bea1dce0cdbf994d7cdbbc338cbe75c66" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-config": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\OrderCancellation\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-order-cancellation-graph-ql", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-order-cancellation-graph-ql/magento-module-order-cancellation-graph-ql-100.4.0.0.zip", + "shasum": "28b101d085f7b2103ac4a872ec25dbbf3cd559d2" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-order-cancellation": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-sales-graph-ql": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\OrderCancellationGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-order-cancellation-ui", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-order-cancellation-ui/magento-module-order-cancellation-ui-100.4.0.0.zip", + "shasum": "3c5d9f6e26b3115a8fc0b6bce7be586f41101128" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-customer": "103.0.*", + "magento/module-order-cancellation": "100.4.*", + "magento/module-sales": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\OrderCancellationUi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module that implements order cancellation UI." + }, + { + "name": "magento/module-page-builder", + "version": "2.2.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-page-builder/magento-module-page-builder-2.2.5.0.zip", + "shasum": "a054d22b1b635b589e737e34954ed6246dc85ab7" + }, + "require": { + "magento/framework": "*", + "magento/module-backend": "*", + "magento/module-catalog": "*", + "magento/module-catalog-inventory": "*", + "magento/module-catalog-widget": "*", + "magento/module-cms": "*", + "magento/module-config": "*", + "magento/module-directory": "*", + "magento/module-eav": "*", + "magento/module-email": "*", + "magento/module-media-storage": "*", + "magento/module-require-js": "*", + "magento/module-rule": "*", + "magento/module-store": "*", + "magento/module-theme": "*", + "magento/module-ui": "*", + "magento/module-variable": "*", + "magento/module-widget": "*", + "magento/module-wishlist": "*", + "php": "~8.1.0||~8.2.0||~8.3.0", + "phpgt/dom": "^4.1" + }, + "conflict": { + "gene/bluefoot": "*" + }, + "suggest": { + "magento/module-review": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PageBuilder\\": "" + } + }, + "license": [ + "proprietary" + ], + "description": "Page Builder module" + }, + { + "name": "magento/module-page-builder-admin-analytics", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-page-builder-admin-analytics/magento-module-page-builder-admin-analytics-1.1.4.0.zip", + "shasum": "7817e051cc233140e4b271b0b63d28b4460b8427" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-admin-analytics": "*", + "magento/module-page-builder": "2.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PageBuilderAdminAnalytics\\": "" + } + }, + "license": [ + "proprietary" + ], + "description": "Page Builder Admin Analytics module" + }, + { + "name": "magento/module-page-builder-analytics", + "version": "1.6.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-page-builder-analytics/magento-module-page-builder-analytics-1.6.4.0.zip", + "shasum": "23198bf13b08f61570508ff78a6c2b3b9bc0f566" + }, + "require": { + "magento/framework": "*", + "magento/module-analytics": "*", + "magento/module-page-builder": "2.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PageBuilderAnalytics\\": "" + } + }, + "license": [ + "proprietary" + ], + "description": "Page Builder Analytics module" + }, + { + "name": "magento/module-page-cache", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-page-cache/magento-module-page-cache-100.4.7.0.zip", + "shasum": "35149c1ba6e9511c203d0697cfc1af89203cd173" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PageCache\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-payment", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-payment/magento-module-payment-100.4.7.0.zip", + "shasum": "f242e4d51677f47de207c345e148ccd4c06439c4" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-directory": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Payment\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-payment-graph-ql", + "version": "100.4.2", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-payment-graph-ql/magento-module-payment-graph-ql-100.4.2.0.zip", + "shasum": "a43b87bd0c3809286ec8b553433cbce1306c9983" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-payment": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-store-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PaymentGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-payment-services-base", + "version": "2.9.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-payment-services-base/magento-module-payment-services-base-2.9.0.0.zip", + "shasum": "13d2009618ee0e12622f1b076d0c750844330399" + }, + "require": { + "magento/framework": ">=103.0.4 <104.0.0", + "magento/module-backend": ">=102.0.4 <103.0.0", + "magento/module-config": ">=101.2.4 <102.0.0", + "magento/module-directory": ">=100.4.4 <101.0.0", + "magento/module-payment": ">=100.4.4 <101.0.0", + "magento/module-payment-services-dashboard": "2.9.0", + "magento/module-sales": ">=103.0.4 <104.0.0", + "magento/module-service-proxy": "2.9.0", + "magento/module-services-id": "^3.2.0", + "magento/module-services-id-graph-ql-server": "^1.1.0", + "magento/module-services-id-layout": "^1.1.0", + "magento/module-store": ">=101.1.4 <102.0.0", + "magento/module-ui": ">=101.2.4 <102.0.0", + "magento/services-connector": "^1.3.0", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-paypal": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PaymentServicesBase\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Payment Services Base module" + }, + { + "name": "magento/module-payment-services-dashboard", + "version": "2.9.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-payment-services-dashboard/magento-module-payment-services-dashboard-2.9.0.0.zip", + "shasum": "0a679645b77a00c7a4d92fc3e1e94405f2dfda57" + }, + "require": { + "ext-json": "*", + "magento/framework": ">=103.0.4 <104.0.0", + "magento/module-backend": ">=102.0.4 <103.0.0", + "magento/module-config": ">=101.2.4 <102.0.0", + "magento/module-payment-services-base": "2.9.0", + "magento/module-payment-services-paypal": "2.9.0", + "magento/module-service-proxy": "2.9.0", + "magento/module-store": ">=101.1.4 <102.0.0", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PaymentServicesDashboard\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Payment Services Dashboard module" + }, + { + "name": "magento/module-payment-services-paypal", + "version": "2.9.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-payment-services-paypal/magento-module-payment-services-paypal-2.9.0.0.zip", + "shasum": "37e165a950699a861d79998f97adc9a8cbdc8691" + }, + "require": { + "magento/framework": ">=103.0.4 <104.0.0", + "magento/module-backend": ">=102.0.4 <103.0.0", + "magento/module-catalog": ">=104.0.4 <105.0.0", + "magento/module-checkout": ">=100.4.4 <101.0.0", + "magento/module-checkout-agreements": ">=100.4.3 <101.0.0", + "magento/module-config": ">=101.2.4 <102.0.0", + "magento/module-csp": ">=100.4.3 <101.0.0", + "magento/module-customer": ">=103.0.4 <104.0.0", + "magento/module-instant-purchase": ">=100.4.3 <101.0.0", + "magento/module-payment": ">=100.4.4 <101.0.0", + "magento/module-payment-services-base": "2.9.0", + "magento/module-query-xml": "^103.0.3", + "magento/module-quote": ">=101.2.4 <102.0.0", + "magento/module-sales": ">=103.0.4 <104.0.0", + "magento/module-service-proxy": "2.9.0", + "magento/module-store": ">=101.1.4 <102.0.0", + "magento/module-tax": ">=100.4.4 <101.0.0", + "magento/module-theme": ">=101.1.4 <102.0.0", + "magento/module-vault": ">=101.2.4 <102.0.0", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PaymentServicesPaypal\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Payment Services PayPal module" + }, + { + "name": "magento/module-payment-services-paypal-graph-ql", + "version": "2.9.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-payment-services-paypal-graph-ql/magento-module-payment-services-paypal-graph-ql-2.9.0.0.zip", + "shasum": "ad95dfe6ec89d4233c9cabf1451e33cbdbbc0157" + }, + "require": { + "magento/framework": ">=103.0.4 <104.0.0", + "magento/module-payment-services-paypal": "2.9.0", + "magento/module-quote": ">=101.2.4 <102.0.0", + "magento/module-quote-graph-ql": ">=100.4.4 <101.0.0", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PaymentServicesPaypalGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Payment Services PayPal GraphQL module" + }, + { + "name": "magento/module-payment-services-saas-export", + "version": "2.9.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-payment-services-saas-export/magento-module-payment-services-saas-export-2.9.0.0.zip", + "shasum": "7bc0337083495b6c97d22c843158fe99fac2a8db" + }, + "require": { + "magento/framework": ">=103.0.4 <104.0.0", + "magento/module-data-exporter": "^103.0.3", + "magento/module-payment-services-base": "2.9.0", + "magento/module-saas-common": "^103.0.3", + "magento/module-sales-data-exporter": "2.9.0", + "magento/module-services-id": "^3.2.0", + "magento/module-store-data-exporter": "2.9.0", + "magento/services-connector": "^1.3.0", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PaymentServicesSaaSExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento 2 Payment Services SaaS Export module exports necessary Payment Services data to Magento cloud services that rely on it" + }, + { + "name": "magento/module-paypal", + "version": "101.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-paypal/magento-module-paypal-101.0.7.0.zip", + "shasum": "7da5aa3bafb3dcb0640abcb53ec3e682189398a1" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-csp": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-instant-purchase": "100.4.*", + "magento/module-payment": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-vault": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-checkout-agreements": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Paypal\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-paypal-captcha", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-paypal-captcha/magento-module-paypal-captcha-100.4.4.0.zip", + "shasum": "b48f801208ad7718ec10fc8c733c6620320750d9" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-captcha": "100.4.*", + "magento/module-checkout": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-paypal": "101.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PaypalCaptcha\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Provides CAPTCHA validation for PayPal Payflow Pro" + }, + { + "name": "magento/module-paypal-graph-ql", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-paypal-graph-ql/magento-module-paypal-graph-ql-100.4.5.0.zip", + "shasum": "f1981b45e335e03e6c3287d9d5e59db73b1a8fd5" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-payment": "100.4.*", + "magento/module-paypal": "101.0.*", + "magento/module-quote": "101.2.*", + "magento/module-quote-graph-ql": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-vault": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-graph-ql": "100.4.*", + "magento/module-store-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\PaypalGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "GraphQl support for Paypal" + }, + { + "name": "magento/module-persistent", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-persistent/magento-module-persistent-100.4.7.0.zip", + "shasum": "ee4002ce8bd887ba3fdab242385515c7889238b7" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-cron": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-page-cache": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-login-as-customer-api": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Persistent\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-product-alert", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-product-alert/magento-module-product-alert-100.4.6.0.zip", + "shasum": "5aa74d4e2e4b4009beaad14e02a388606f56871e" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-bulk": "101.0.*", + "magento/module-asynchronous-operations": "100.4.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-customer": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ProductAlert\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-product-video", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-product-video/magento-module-product-video-100.4.7.0.zip", + "shasum": "4528a77fec653532995c0797ac10c15b1d3d4dc5" + }, + "require": { + "magento/framework": "103.0.*", + "magento/magento-composer-installer": "*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-eav": "102.1.*", + "magento/module-media-storage": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-theme": "101.1.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ProductVideo\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Add Video to Products" + }, + { + "name": "magento/module-query-xml", + "version": "103.3.14", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-query-xml/magento-module-query-xml-103.3.14.0.zip", + "shasum": "89357121f78c8486b2620dfdfcef657847c8da87" + }, + "require": { + "magento/framework": ">=103.0.4", + "magento/module-analytics": ">=100.4.4", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\QueryXml\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Query Xml" + }, + { + "name": "magento/module-quote", + "version": "101.2.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-quote/magento-module-quote-101.2.7.0.zip", + "shasum": "c9174f5d52bb6b0ad301708b4d3f48b160bac222" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-payment": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-sales-sequence": "100.4.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-webapi": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Quote\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-quote-analytics", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-quote-analytics/magento-module-quote-analytics-100.4.6.0.zip", + "shasum": "f1e6811706820bafc4145de432b7600b8965a4b3" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-analytics": "100.4.*", + "magento/module-quote": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\QuoteAnalytics\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-quote-bundle-options", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-quote-bundle-options/magento-module-quote-bundle-options-100.4.3.0.zip", + "shasum": "5b4b8bce2aebd951d6ef826fdba10c1ba4830d65" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-quote": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\QuoteBundleOptions\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides data provider for creating buy request for bundle products" + }, + { + "name": "magento/module-quote-configurable-options", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-quote-configurable-options/magento-module-quote-configurable-options-100.4.3.0.zip", + "shasum": "8e8c103a2fe44d549bb9c31ec53de9a9e8857ca2" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-quote": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\QuoteConfigurableOptions\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides data provider for creating buy request for configurable products" + }, + { + "name": "magento/module-quote-downloadable-links", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-quote-downloadable-links/magento-module-quote-downloadable-links-100.4.3.0.zip", + "shasum": "cb830405cda538e624a680b78bd6124b9a39091a" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-quote": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\QuoteDownloadableLinks\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento module provides data provider for creating buy request for links of downloadable products" + }, + { + "name": "magento/module-quote-graph-ql", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-quote-graph-ql/magento-module-quote-graph-ql-100.4.7.0.zip", + "shasum": "6c2d960e02838c04145e49d88c2c6aeb15daabec" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-customer-graph-ql": "100.4.*", + "magento/module-directory": "100.4.*", + "magento/module-eav-graph-ql": "100.4.*", + "magento/module-gift-message": "100.4.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-sales-graph-ql": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-inventory-graph-ql": "100.4.*", + "magento/module-graph-ql-cache": "100.4.*", + "magento/module-payment-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\QuoteGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-re-captcha-admin-ui", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-admin-ui/magento-module-re-captcha-admin-ui-1.1.4.0.zip", + "shasum": "f043957561d99e0797ae1e21f89152eaa78d78ea" + }, + "require": { + "magento/framework": "*", + "magento/module-config": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaAdminUi\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-checkout", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-checkout/magento-module-re-captcha-checkout-1.1.4.0.zip", + "shasum": "f1074987e61bfd950849cf304874fab507e86080" + }, + "require": { + "magento/framework": "*", + "magento/module-checkout": "*", + "magento/module-re-captcha-admin-ui": "1.1.*", + "magento/module-re-captcha-frontend-ui": "1.1.*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "magento/module-re-captcha-webapi-ui": "1.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaCheckout\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-checkout-sales-rule", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-checkout-sales-rule/magento-module-re-captcha-checkout-sales-rule-1.1.3.0.zip", + "shasum": "03fa4e8e4235a66bc7636c0857daf020ba7a04c7" + }, + "require": { + "magento/framework": "*", + "magento/module-checkout": "*", + "magento/module-re-captcha-admin-ui": "1.1.*", + "magento/module-re-captcha-frontend-ui": "1.1.*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "magento/module-re-captcha-webapi-ui": "1.0.*", + "magento/module-sales-rule": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaCheckoutSalesRule\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google ReCaptcha integration for Magento2 coupons" + }, + { + "name": "magento/module-re-captcha-contact", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-contact/magento-module-re-captcha-contact-1.1.3.0.zip", + "shasum": "21eccda8ae49b99f748a8d49c3c9155f356b91c3" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-ui": "1.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaContact\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-customer", + "version": "1.1.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-customer/magento-module-re-captcha-customer-1.1.5.0.zip", + "shasum": "06bf1624f9a7ace5967c9969e108f24059a67ad8" + }, + "require": { + "magento/framework": "*", + "magento/module-customer": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaCustomer\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-frontend-ui", + "version": "1.1.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-frontend-ui/magento-module-re-captcha-frontend-ui-1.1.5.0.zip", + "shasum": "c36367b0aa9b7120a10298b012b4e5595f4362ce" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaFrontendUi\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-migration", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-migration/magento-module-re-captcha-migration-1.1.4.0.zip", + "shasum": "dc8a836438b9dc78fb03f703cd4fcc20c28d0d11" + }, + "require": { + "magento/framework": "*", + "magento/module-config": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaMigration\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA config migration for Magento2" + }, + { + "name": "magento/module-re-captcha-newsletter", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-newsletter/magento-module-re-captcha-newsletter-1.1.4.0.zip", + "shasum": "fe879917ab11aae2f68e15e1a932f89cf0039df3" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaNewsletter\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-paypal", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-paypal/magento-module-re-captcha-paypal-1.1.4.0.zip", + "shasum": "caebe903f58a2cfbc7fdc7797778057e99eceab0" + }, + "require": { + "magento/framework": "*", + "magento/module-checkout": "*", + "magento/module-paypal": "*", + "magento/module-quote": "*", + "magento/module-re-captcha-checkout": "1.1.*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaPaypal\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCaptcha integration for Magento2 PayPal PayflowPro payment form" + }, + { + "name": "magento/module-re-captcha-review", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-review/magento-module-re-captcha-review-1.1.4.0.zip", + "shasum": "9f3f96acacf027909bb76bd0c7c1c5ab44697d37" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaReview\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-send-friend", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-send-friend/magento-module-re-captcha-send-friend-1.1.4.0.zip", + "shasum": "a89a507c9c2fac5f85c52810b3c5f5fe65373c1e" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaSendFriend\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-store-pickup", + "version": "1.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-store-pickup/magento-module-re-captcha-store-pickup-1.0.3.0.zip", + "shasum": "f9090be0e24fe23f79b19cece3d3f6e49ecb8993" + }, + "require": { + "magento/framework": "*", + "magento/module-checkout": "*", + "magento/module-re-captcha-ui": "1.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-inventory-in-store-pickup-frontend": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaStorePickup\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCaptcha integration for Magento2 Inventory Store Pickup shipping form" + }, + { + "name": "magento/module-re-captcha-ui", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-ui/magento-module-re-captcha-ui-1.1.4.0.zip", + "shasum": "627fb12305748f74e15c82d644670a097e19f024" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-validation-api": "1.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaUi\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "authors": [ + { + "name": "Riccardo Tempesta", + "email": "riccardo.tempesta@magespecialist.it" + } + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-user", + "version": "1.1.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-user/magento-module-re-captcha-user-1.1.4.0.zip", + "shasum": "f5a387a956947763c6f1ed8cdd79ecec05b736cc" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaUser\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-validation", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-validation/magento-module-re-captcha-validation-1.1.3.0.zip", + "shasum": "f344008867269a4cc1560e6f4953814250dbb7b1" + }, + "require": { + "google/recaptcha": "^1.2", + "magento/framework": "*", + "magento/module-re-captcha-validation-api": "1.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaValidation\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-validation-api", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-validation-api/magento-module-re-captcha-validation-api-1.1.3.0.zip", + "shasum": "759f1f9b2d6babd29b84f4b507cb3bc652229217" + }, + "require": { + "magento/framework": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaValidationApi\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-version-2-checkbox", + "version": "2.0.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-version-2-checkbox/magento-module-re-captcha-version-2-checkbox-2.0.4.0.zip", + "shasum": "18d15f40048765c88027484e1313d292537c59c3" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "*", + "magento/module-re-captcha-admin-ui": "1.1.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaVersion2Checkbox\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-version-2-invisible", + "version": "2.0.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-version-2-invisible/magento-module-re-captcha-version-2-invisible-2.0.4.0.zip", + "shasum": "662f8d3f9c24cd48bc61aa8b56da78443cfe4e7a" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "*", + "magento/module-re-captcha-admin-ui": "1.1.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaVersion2Invisible\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-version-3-invisible", + "version": "2.0.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-version-3-invisible/magento-module-re-captcha-version-3-invisible-2.0.4.0.zip", + "shasum": "6c267964d91cf3863ca1345c77219423e0b6f7df" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "*", + "magento/module-re-captcha-admin-ui": "1.1.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaVersion3Invisible\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-webapi-api", + "version": "1.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-webapi-api/magento-module-re-captcha-webapi-api-1.0.3.0.zip", + "shasum": "410e9910328f965d0ac6a435779b4f381b290105" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-validation-api": "1.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaWebapiApi\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-webapi-graph-ql", + "version": "1.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-webapi-graph-ql/magento-module-re-captcha-webapi-graph-ql-1.0.3.0.zip", + "shasum": "b3a080737361ce76356476db5fb1accd07ca3644" + }, + "require": { + "magento/framework": "*", + "magento/module-authorization": "*", + "magento/module-re-captcha-frontend-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-version-3-invisible": "2.0.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaWebapiGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-webapi-rest", + "version": "1.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-webapi-rest/magento-module-re-captcha-webapi-rest-1.0.3.0.zip", + "shasum": "d2f1acf6c2fbd58d78356519d90ab38004f6b40a" + }, + "require": { + "magento/framework": "*", + "magento/module-authorization": "*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "magento/module-webapi": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaWebapiRest\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-re-captcha-webapi-ui", + "version": "1.0.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-re-captcha-webapi-ui/magento-module-re-captcha-webapi-ui-1.0.3.0.zip", + "shasum": "9d962010016e122513278e01944541a49968423d" + }, + "require": { + "magento/framework": "*", + "magento/module-re-captcha-frontend-ui": "1.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReCaptchaWebapiUi\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Google reCAPTCHA integration for Magento2" + }, + { + "name": "magento/module-related-product-graph-ql", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-related-product-graph-ql/magento-module-related-product-graph-ql-100.4.4.0.zip", + "shasum": "cc8aa2ff2887b4c47f24891da88122c0a95a7671" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-graph-ql": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\RelatedProductGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-release-notification", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-release-notification/magento-module-release-notification-100.4.5.0.zip", + "shasum": "016c632228871d38a58266c2cedbb0c2b7c02d9e" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-ui": "101.2.*", + "magento/module-user": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReleaseNotification\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-remote-storage", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-remote-storage/magento-module-remote-storage-100.4.5.0.zip", + "shasum": "dae65c973aa0d0966a80069876ca22f217005f02" + }, + "require": { + "league/flysystem": "^2.4", + "league/flysystem-aws-s3-v3": "^2.4", + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-import-export": "101.1.*", + "magento/module-cms": "104.0.*", + "magento/module-downloadable": "100.4.*", + "magento/module-downloadable-import-export": "100.4.*", + "magento/module-import-export": "101.0.*", + "magento/module-media-gallery-metadata": "100.4.*", + "magento/module-media-gallery-synchronization": "100.4.*", + "magento/module-media-storage": "100.4.*", + "magento/module-sitemap": "100.4.*", + "predis/predis": "*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\RemoteStorage\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-reports", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-reports/magento-module-reports-100.4.7.0.zip", + "shasum": "2eae7e56b34f0da7f5de97fa4b0c6ab7e17231e8" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-cms": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-downloadable": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-quote": "101.2.*", + "magento/module-review": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-sales-rule": "101.2.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-widget": "101.2.*", + "magento/module-wishlist": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Reports\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-require-js", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-require-js/magento-module-require-js-100.4.3.0.zip", + "shasum": "28a2e7b1c42b097ce48d47d06943fa070e58861b" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\RequireJs\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-review", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-review/magento-module-review-100.4.7.0.zip", + "shasum": "ca8f6b0cf1cd5e73db6fda6cc5d1014ab2270bfa" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-newsletter": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-cookie": "100.4.*", + "magento/module-review-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Review\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-review-analytics", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-review-analytics/magento-module-review-analytics-100.4.4.0.zip", + "shasum": "40dc44eeb86d22b2b8b3b801113ee440a4fd6825" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-analytics": "100.4.*", + "magento/module-review": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReviewAnalytics\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-review-graph-ql", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-review-graph-ql/magento-module-review-graph-ql-100.4.3.0.zip", + "shasum": "13f34715b365d587dd80028d241db1923335b8b9" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-review": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-graph-ql": "100.4.*", + "magento/module-graph-ql-cache": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ReviewGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-robots", + "version": "101.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-robots/magento-module-robots-101.1.3.0.zip", + "shasum": "b3fb5bf35f61f90f453513ac05afeafefdf04b17" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-theme": "101.1.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Robots\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-rss", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-rss/magento-module-rss-100.4.5.0.zip", + "shasum": "07cd33c74ded5583b5a9c57a9ba58d7c9aed4de1" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-customer": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Rss\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-rule", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-rule/magento-module-rule-100.4.6.0.zip", + "shasum": "5f1a8aa08243925ec2029fe6ff800dbc57c34786" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-eav": "102.1.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Rule\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-saas-common", + "version": "103.3.14", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-saas-common/magento-module-saas-common-103.3.14.0.zip", + "shasum": "46dd24d119507d6eadd857ac11a19055c197ddd4" + }, + "require": { + "magento/framework": ">=103.0.4", + "magento/module-data-exporter": "^103.3.4", + "magento/module-indexer": ">=100.4.4", + "magento/module-services-id": "^3.1.2", + "magento/services-connector": "^1.2.5", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.5.0" + }, + "suggest": { + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SaaSCommon\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Magento 2 SaaS Common module for shared saas export functionality" + }, + { + "name": "magento/module-sales", + "version": "103.0.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-sales/magento-module-sales-103.0.7.0.zip", + "shasum": "1defb7199a0931f86642fd4ef7c72b2b71c0d2c4" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-bundle": "101.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-checkout": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-gift-message": "100.4.*", + "magento/module-media-storage": "100.4.*", + "magento/module-payment": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-reports": "100.4.*", + "magento/module-sales-rule": "101.2.*", + "magento/module-sales-sequence": "100.4.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-widget": "101.2.*", + "magento/module-wishlist": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-sales-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Sales\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales-analytics", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-sales-analytics/magento-module-sales-analytics-100.4.4.0.zip", + "shasum": "80f8926abd9452b7fe46f19c1eaf4eb652facfa3" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-analytics": "100.4.*", + "magento/module-sales": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SalesAnalytics\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales-data-exporter", + "version": "2.9.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-sales-data-exporter/magento-module-sales-data-exporter-2.9.0.0.zip", + "shasum": "dc326604a51618069d9c3ba7e314b7f6b75a8e93" + }, + "require": { + "magento/framework": ">=103.0.4 <104.0.0", + "magento/module-data-exporter": "^103.0.3", + "magento/module-query-xml": "^103.0.3", + "magento/module-sales": ">=103.0.4 <104.0.0", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SalesDataExporter\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Sales data exporter" + }, + { + "name": "magento/module-sales-graph-ql", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-sales-graph-ql/magento-module-sales-graph-ql-100.4.7.0.zip", + "shasum": "b06d781a55f194302d63213675c1b751415e7033" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SalesGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales-inventory", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-sales-inventory/magento-module-sales-inventory-100.4.4.0.zip", + "shasum": "2b8aea377cdf95ded206a9cd6e8bad0017072dca" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SalesInventory\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales-rule", + "version": "101.2.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-sales-rule/magento-module-sales-rule-101.2.7.0.zip", + "shasum": "1bfb4eee1c1f2103f7c5235c891b0c092dfade5a" + }, + "require": { + "magento/framework": "103.0.*", + "magento/framework-bulk": "101.0.*", + "magento/module-asynchronous-operations": "100.4.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-captcha": "100.4.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-rule": "101.2.*", + "magento/module-checkout": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-payment": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-reports": "100.4.*", + "magento/module-rule": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-widget": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-sales-rule-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SalesRule\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales-rule-graph-ql", + "version": "100.4.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-sales-rule-graph-ql/magento-module-sales-rule-graph-ql-100.4.0.0.zip", + "shasum": "bf32c46e58202972a12a0b6b3a8ea58735e74725" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-sales-rule": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SalesRuleGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sales-sequence", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-sales-sequence/magento-module-sales-sequence-100.4.4.0.zip", + "shasum": "19993cdfd44d129bb946a3088f79d2958767a067" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SalesSequence\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sample-data", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-sample-data/magento-module-sample-data-100.4.5.0.zip", + "shasum": "3c8bb68781e263d3d0acbad3622a9da3d86c2d4a" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/sample-data-media": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "cli_commands.php", + "registration.php" + ], + "psr-4": { + "Magento\\SampleData\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Sample Data fixtures" + }, + { + "name": "magento/module-search", + "version": "101.1.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-search/magento-module-search-101.1.7.0.zip", + "shasum": "7c1d2fc1da30e3674731ec998fdc2713d26589e7" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog-search": "102.0.*", + "magento/module-reports": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Search\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-security", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-security/magento-module-security-100.4.7.0.zip", + "shasum": "b3b46c8d852e0e8448fa4c69bea6749637c7936b" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-config": "101.2.*", + "magento/module-store": "101.1.*", + "magento/module-user": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-customer": "103.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Security\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Security management module" + }, + { + "name": "magento/module-securitytxt", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-securitytxt/magento-module-securitytxt-1.1.3.0.zip", + "shasum": "7233d6559947338d46c4c72d361d7cbc30bd2946" + }, + "require": { + "magento/framework": "*", + "magento/module-config": "*", + "magento/module-store": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Securitytxt\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "authors": [ + { + "name": "Kalpesh Mehta", + "email": "k@lpe.sh" + } + ], + "description": "Security.txt file for Magento 2 websites" + }, + { + "name": "magento/module-send-friend", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-send-friend/magento-module-send-friend-100.4.5.0.zip", + "shasum": "fc68f7f70564b50c61a4966ba628d038afd9232f" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-captcha": "100.4.*", + "magento/module-catalog": "104.0.*", + "magento/module-customer": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SendFriend\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-send-friend-graph-ql", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-send-friend-graph-ql/magento-module-send-friend-graph-ql-100.4.3.0.zip", + "shasum": "15b2b4e8b1a2a84c51fa100d4f80bccd567836f0" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-send-friend": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SendFriendGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-service-proxy", + "version": "2.9.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-service-proxy/magento-module-service-proxy-2.9.0.0.zip", + "shasum": "e356667302ba0a600bab0a83cab7b96a44ea7021" + }, + "require": { + "magento/framework": ">=103.0.4 <104.0.0", + "magento/module-backend": ">=102.0.4 <103.0.0", + "magento/module-page-cache": ">=100.4.4 <101.0.0", + "magento/module-store": ">=101.1.4 <102.0.0", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ServiceProxy\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Service Proxy module" + }, + { + "name": "magento/module-services-id", + "version": "3.2.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-services-id/magento-module-services-id-3.2.6.0.zip", + "shasum": "8ae04f79127d640f44b372166b8f9d1c0a7a4a02" + }, + "require": { + "magento/framework": ">=102.0.0 <104.0.0", + "magento/module-config": ">=101.1.0 <101.3.0", + "magento/services-connector": "^1.3.5", + "php": "~7.2.0||~7.3.0||~7.4.0||~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ServicesId\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Commerce Services identity" + }, + { + "name": "magento/module-services-id-graph-ql-server", + "version": "1.1.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-services-id-graph-ql-server/magento-module-services-id-graph-ql-server-1.1.5.0.zip", + "shasum": "ce0ff8e9b88a12bbac99514c88f73b5c14955e63" + }, + "require": { + "magento/framework": ">=102.0.0 <104.0.0", + "magento/module-admin-graph-ql-server": "^1.0.1", + "magento/module-backend": ">=101.0.0 <103.0.0", + "magento/module-services-id": "^3.2.6", + "magento/services-connector": "^1.3.5", + "php": "~7.2.0||~7.3.0||~7.4.0||~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ServicesIdGraphQlServer\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Commerce Services identity GraphQL server" + }, + { + "name": "magento/module-services-id-layout", + "version": "1.1.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-services-id-layout/magento-module-services-id-layout-1.1.3.0.zip", + "shasum": "81850efbfcc3f163a9b63f1fdd3524c69de804ef" + }, + "require": { + "magento/framework": ">=102.0.0 <104.0.0", + "magento/module-backend": ">=101.0.0 <103.0.0", + "magento/module-config": ">=101.1.0 <101.3.0", + "magento/module-graph-ql-server": "^1.0.1", + "magento/module-services-id": "^3.2.4", + "magento/module-services-id-graph-ql-server": "^1.1.3", + "magento/module-store": ">=101.0.0 <101.2.0", + "php": "~7.2.0||~7.3.0||~7.4.0||~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ServicesIdLayout\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Commerce Services identity Layout" + }, + { + "name": "magento/module-shipping", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-shipping/magento-module-shipping-100.4.7.0.zip", + "shasum": "0bb1ed1c510704ec7077247710259cd981fdfd4e" + }, + "require": { + "ext-gd": "*", + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-contact": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-payment": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-ui": "101.2.*", + "magento/module-user": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*", + "magento/module-fedex": "100.4.*", + "magento/module-ups": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Shipping\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-sitemap", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-sitemap/magento-module-sitemap-100.4.6.0.zip", + "shasum": "68da3a91857f7650822787968491a4e6f02a7824" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-url-rewrite": "100.4.*", + "magento/module-cms": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-eav": "102.1.*", + "magento/module-media-storage": "100.4.*", + "magento/module-robots": "101.1.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Sitemap\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-store", + "version": "101.1.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-store/magento-module-store-101.1.7.0.zip", + "shasum": "87a2019793760259a3dde6f98ab33773366e0f36" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-media-storage": "100.4.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-deploy": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Store\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-store-data-exporter", + "version": "2.9.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-store-data-exporter/magento-module-store-data-exporter-2.9.0.0.zip", + "shasum": "1c5cd051d7e3cdcf4504a056c62092962191b9ee" + }, + "require": { + "magento/framework": ">=103.0.4 <104.0.0", + "magento/module-data-exporter": "^103.0.3", + "magento/module-query-xml": "^103.0.3", + "magento/module-store": ">=101.1.4 <102.0.0", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\StoreDataExporter\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Store data exporter" + }, + { + "name": "magento/module-store-graph-ql", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-store-graph-ql/magento-module-store-graph-ql-100.4.5.0.zip", + "shasum": "f6cc6ec93f22ddd8c9b9463d7f50c4737ea0e90f" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-graph-ql-cache": "100.4.*", + "magento/module-graph-ql-resolver-cache": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\StoreGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-swagger", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-swagger/magento-module-swagger-100.4.6.0.zip", + "shasum": "0645218960a25979233dd31a915012912d2ab5a4" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Swagger\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-swagger-webapi", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-swagger-webapi/magento-module-swagger-webapi-100.4.3.0.zip", + "shasum": "e6661668a74c8b43e52b1f98e82c3dc66878699f" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-swagger": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SwaggerWebapi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-swagger-webapi-async", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-swagger-webapi-async/magento-module-swagger-webapi-async-100.4.3.0.zip", + "shasum": "20d79683bfaaf7155a18dbe6b7a7355dc26afa38" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-swagger": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SwaggerWebapiAsync\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-swatches", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-swatches/magento-module-swatches-100.4.7.0.zip", + "shasum": "1280d371a3b4db1a3af2766e1f41f4ad1826dcee" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-configurable-product": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-media-storage": "100.4.*", + "magento/module-page-cache": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-layered-navigation": "100.4.*", + "magento/module-swatches-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Swatches\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Add Swatches to Products" + }, + { + "name": "magento/module-swatches-graph-ql", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-swatches-graph-ql/magento-module-swatches-graph-ql-100.4.5.0.zip", + "shasum": "d92d0f2f148bb082feda8aab0333c1492c3d25fc" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-swatches": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-configurable-product-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SwatchesGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-swatches-layered-navigation", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-swatches-layered-navigation/magento-module-swatches-layered-navigation-100.4.3.0.zip", + "shasum": "bd8a008cdd1220f2f78e2d8f2da529f7feeb0cf8" + }, + "require": { + "magento/framework": "103.0.*", + "magento/magento-composer-installer": "*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\SwatchesLayeredNavigation\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-tax", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-tax/magento-module-tax-100.4.7.0.zip", + "shasum": "20a9031e65782b488153c5b04faf99394a1c1fa1" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-page-cache": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-reports": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-tax-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Tax\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-tax-graph-ql", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-tax-graph-ql/magento-module-tax-graph-ql-100.4.3.0.zip", + "shasum": "485df504f13dade9b6658db81b1688f380fd0680" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-tax": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\TaxGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-tax-import-export", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-tax-import-export/magento-module-tax-import-export-100.4.6.0.zip", + "shasum": "6f6e8b31f8284b50267f95cb18e756fb02ed561f" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-directory": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\TaxImportExport\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-theme", + "version": "101.1.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-theme/magento-module-theme-101.1.7.0.zip", + "shasum": "5c8a49308063a7d9d350c1e308894b3d6d086e59" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-cms": "104.0.*", + "magento/module-config": "101.2.*", + "magento/module-customer": "103.0.*", + "magento/module-eav": "102.1.*", + "magento/module-media-storage": "100.4.*", + "magento/module-require-js": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-widget": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-deploy": "100.4.*", + "magento/module-directory": "100.4.*", + "magento/module-theme-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Theme\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-theme-graph-ql", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-theme-graph-ql/magento-module-theme-graph-ql-100.4.4.0.zip", + "shasum": "a89078d7cbba860eded9aa12ecca054ec160da49" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-store-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ThemeGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-translation", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-translation/magento-module-translation-100.4.7.0.zip", + "shasum": "a428159436ff8d5fdc999d999e5469cc4d055116" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-deploy": "100.4.*", + "magento/module-developer": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-deploy": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Translation\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-two-factor-auth", + "version": "1.1.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-two-factor-auth/magento-module-two-factor-auth-1.1.6.0.zip", + "shasum": "3e02b6e0360669479b26cfd25ea32597380d30d9" + }, + "require": { + "2tvenom/cborencode": "^1.0", + "christian-riesen/base32": "^1.3", + "endroid/qr-code": "^4.3.5", + "magento/framework": "*", + "magento/magento-composer-installer": "*", + "magento/module-authorization": "*", + "magento/module-backend": "*", + "magento/module-config": "*", + "magento/module-integration": "*", + "magento/module-store": "*", + "magento/module-ui": "*", + "magento/module-user": "*", + "php": "~8.1.0||~8.2.0||~8.3.0", + "spomky-labs/otphp": "^11.2" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\TwoFactorAuth\\": "" + } + }, + "license": [ + "OSL-3.0" + ], + "description": "Two Factor Authentication module for Magento2" + }, + { + "name": "magento/module-ui", + "version": "101.2.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-ui/magento-module-ui-101.2.7.0.zip", + "shasum": "fb1db996d7ce9df1ce8b75e24800aa9161fa41b0" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-eav": "102.1.*", + "magento/module-store": "101.1.*", + "magento/module-user": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Ui\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-ups", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-ups/magento-module-ups-100.4.7.0.zip", + "shasum": "8e6fce8c3776fd7ad4e968d3ca22ade9c05d73e4" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-directory": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-config": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Ups\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-url-rewrite", + "version": "102.0.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-url-rewrite/magento-module-url-rewrite-102.0.6.0.zip", + "shasum": "1a67f8aab1f2d9549c9b9eb24c9ef7ce959aaaa4" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-url-rewrite": "100.4.*", + "magento/module-cms": "104.0.*", + "magento/module-cms-url-rewrite": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\UrlRewrite\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-url-rewrite-graph-ql", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-url-rewrite-graph-ql/magento-module-url-rewrite-graph-ql-100.4.6.0.zip", + "shasum": "9e281b3104751ca277b037cb99d10ff499764b08" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-url-rewrite": "102.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\UrlRewriteGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-user", + "version": "101.2.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-user/magento-module-user-101.2.7.0.zip", + "shasum": "556aa29978b793d7156e0ff4d0a27741ec2dbbda" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-email": "101.1.*", + "magento/module-integration": "100.4.*", + "magento/module-security": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\User\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-usps", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-usps/magento-module-usps-100.4.6.0.zip", + "shasum": "4add54419dda85d968c4ac204a4e69790ff7ccba" + }, + "require": { + "lib-libxml": "*", + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-config": "101.2.*", + "magento/module-directory": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-shipping": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Usps\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-variable", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-variable/magento-module-variable-100.4.5.0.zip", + "shasum": "8c308edb6caeaf9edd499841af8ffb5dfb34c4f5" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-config": "101.2.*", + "magento/module-store": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Variable\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-vault", + "version": "101.2.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-vault/magento-module-vault-101.2.7.0.zip", + "shasum": "42b33bebe29ae7755fde0a8005d801fe5acd47b8" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-payment": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Vault\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ] + }, + { + "name": "magento/module-vault-graph-ql", + "version": "100.4.3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-vault-graph-ql/magento-module-vault-graph-ql-100.4.3.0.zip", + "shasum": "c7910b4264ce5efb55e7f050ca104b9e3efc8c4e" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-graph-ql": "100.4.*", + "magento/module-vault": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\VaultGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-version", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-version/magento-module-version-100.4.4.0.zip", + "shasum": "8c07c3d82ea97fe66437c4450f4f948ac54347b0" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Version\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-webapi", + "version": "100.4.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-webapi/magento-module-webapi-100.4.6.0.zip", + "shasum": "4a244c6e93bde37bf561de2e7200185aa477996a" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "102.0.*", + "magento/module-integration": "100.4.*", + "magento/module-store": "101.1.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-customer": "103.0.*", + "magento/module-user": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Webapi\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-webapi-async", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-webapi-async/magento-module-webapi-async-100.4.5.0.zip", + "shasum": "332c143a5317bc99a062753d2281ff937b2fc555" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-asynchronous-operations": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-webapi": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-customer": "103.0.*", + "magento/module-user": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\WebapiAsync\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-webapi-security", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-webapi-security/magento-module-webapi-security-100.4.4.0.zip", + "shasum": "d34d7432a564e8aff21282e4ecacecd74a8b7fe7" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-webapi": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\WebapiSecurity\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "WebapiSecurity module provides option to loosen security on some webapi resources." + }, + { + "name": "magento/module-weee", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-weee/magento-module-weee-100.4.7.0.zip", + "shasum": "86e39dfc8d233c1be1f536d847ae31b07d36aca2" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-directory": "100.4.*", + "magento/module-eav": "102.1.*", + "magento/module-page-cache": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-bundle": "101.0.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Weee\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-weee-graph-ql", + "version": "100.4.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-weee-graph-ql/magento-module-weee-graph-ql-100.4.4.0.zip", + "shasum": "b6c0e103600031aa1b1f9db2ad3cf7c7cd816a34" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-tax": "100.4.*", + "magento/module-weee": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-catalog-graph-ql": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\WeeeGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-widget", + "version": "101.2.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-widget/magento-module-widget-101.2.7.0.zip", + "shasum": "ca6b43386bf64a66f522d7ef342c752ea8e3ea89" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-cms": "104.0.*", + "magento/module-email": "101.1.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "magento/module-variable": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-widget-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Widget\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-wishlist", + "version": "101.2.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-wishlist/magento-module-wishlist-101.2.7.0.zip", + "shasum": "336b9dea97386bb79387c97a9b7f52ff80f4cbfc" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-backend": "102.0.*", + "magento/module-captcha": "100.4.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-inventory": "100.4.*", + "magento/module-checkout": "100.4.*", + "magento/module-customer": "103.0.*", + "magento/module-rss": "100.4.*", + "magento/module-sales": "103.0.*", + "magento/module-store": "101.1.*", + "magento/module-theme": "101.1.*", + "magento/module-ui": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-bundle": "101.0.*", + "magento/module-configurable-product": "100.4.*", + "magento/module-cookie": "100.4.*", + "magento/module-downloadable": "100.4.*", + "magento/module-grouped-product": "100.4.*", + "magento/module-wishlist-sample-data": "Sample Data version: 100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\Wishlist\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-wishlist-analytics", + "version": "100.4.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-wishlist-analytics/magento-module-wishlist-analytics-100.4.5.0.zip", + "shasum": "4742de9e6ead06c2a9bd53b86081514b7bee5f7b" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-analytics": "100.4.*", + "magento/module-wishlist": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\WishlistAnalytics\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/module-wishlist-graph-ql", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/module-wishlist-graph-ql/magento-module-wishlist-graph-ql-100.4.7.0.zip", + "shasum": "447e00d9daa70660cd3b838535b829159be1603e" + }, + "require": { + "magento/framework": "103.0.*", + "magento/module-catalog": "104.0.*", + "magento/module-catalog-graph-ql": "100.4.*", + "magento/module-quote": "101.2.*", + "magento/module-quote-graph-ql": "100.4.*", + "magento/module-store": "101.1.*", + "magento/module-wishlist": "101.2.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\WishlistGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/page-builder", + "version": "1.7.4", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/page-builder/magento-page-builder-1.7.4.0.zip", + "shasum": "0629bc7b8d9848feb8954b0c860fc71993b2cac8" + }, + "require": { + "magento/module-aws-s3-page-builder": "1.0.4", + "magento/module-catalog-page-builder-analytics": "1.6.4", + "magento/module-cms-page-builder-analytics": "1.6.4", + "magento/module-page-builder": "2.2.5", + "magento/module-page-builder-admin-analytics": "1.1.4", + "magento/module-page-builder-analytics": "1.6.4" + }, + "type": "metapackage", + "description": "Page Builder metapackage" + }, + { + "name": "magento/payment-services", + "version": "2.9.0", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/payment-services/magento-payment-services-2.9.0.0.zip", + "shasum": "b06666fde0b55442d217fdde778eca6743f50c19" + }, + "require": { + "magento/module-payment-services-base": "2.9.0", + "magento/module-payment-services-dashboard": "2.9.0", + "magento/module-payment-services-paypal": "2.9.0", + "magento/module-payment-services-paypal-graph-ql": "2.9.0", + "magento/module-payment-services-saas-export": "2.9.0", + "magento/module-sales-data-exporter": "2.9.0", + "magento/module-service-proxy": "2.9.0", + "magento/module-store-data-exporter": "2.9.0", + "magento/services-id": "^3.2.0" + }, + "type": "metapackage", + "description": "Payment Services metapackage" + }, + { + "name": "magento/product-community-edition", + "version": "2.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/product-community-edition/magento-product-community-edition-2.4.7.0.zip", + "shasum": "366521fc545daf2b89c33de4f873b81589b1d019" + }, + "require": { + "adobe-commerce/os-extensions-metapackage": "~1.0", + "colinmollenhour/cache-backend-file": "^1.4", + "colinmollenhour/cache-backend-redis": "^1.16", + "colinmollenhour/credis": "^1.15", + "colinmollenhour/php-redis-session-abstract": "^1.5", + "composer/composer": "^2.0, !=2.2.16", + "elasticsearch/elasticsearch": "~7.17.0 || ~8.5.0", + "ext-bcmath": "*", + "ext-ctype": "*", + "ext-curl": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-hash": "*", + "ext-iconv": "*", + "ext-intl": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-pdo_mysql": "*", + "ext-simplexml": "*", + "ext-soap": "*", + "ext-sodium": "*", + "ext-xsl": "*", + "ext-zip": "*", + "ezyang/htmlpurifier": "^4.17", + "guzzlehttp/guzzle": "^7.5", + "laminas/laminas-captcha": "^2.17", + "laminas/laminas-code": "^4.13", + "laminas/laminas-db": "^2.19", + "laminas/laminas-di": "^3.13", + "laminas/laminas-escaper": "^2.13", + "laminas/laminas-eventmanager": "^3.11", + "laminas/laminas-feed": "^2.22", + "laminas/laminas-file": "^2.13", + "laminas/laminas-filter": "^2.33", + "laminas/laminas-http": "^2.15", + "laminas/laminas-i18n": "^2.17", + "laminas/laminas-mail": "^2.16", + "laminas/laminas-mime": "^2.9", + "laminas/laminas-modulemanager": "^2.11", + "laminas/laminas-mvc": "^3.6", + "laminas/laminas-oauth": "^2.6", + "laminas/laminas-permissions-acl": "^2.10", + "laminas/laminas-server": "^2.16", + "laminas/laminas-servicemanager": "^3.16", + "laminas/laminas-soap": "^2.10", + "laminas/laminas-stdlib": "^3.11", + "laminas/laminas-uri": "^2.9", + "laminas/laminas-validator": "^2.23", + "league/flysystem": "^2.4", + "league/flysystem-aws-s3-v3": "^2.4", + "lib-libxml": "*", + "magento/composer": "^1.10.0-beta1", + "magento/composer-dependency-version-audit-plugin": "^0.1", + "magento/framework": "103.0.7", + "magento/framework-amqp": "100.4.5", + "magento/framework-bulk": "101.0.3", + "magento/framework-message-queue": "100.4.7", + "magento/inventory-metapackage": "1.2.7", + "magento/language-de_de": "100.4.0", + "magento/language-en_us": "100.4.0", + "magento/language-es_es": "100.4.0", + "magento/language-fr_fr": "100.4.0", + "magento/language-nl_nl": "100.4.0", + "magento/language-pt_br": "100.4.0", + "magento/language-zh_hans_cn": "100.4.0", + "magento/magento-composer-installer": ">=0.4.0", + "magento/magento2-base": "2.4.7", + "magento/module-admin-analytics": "100.4.6", + "magento/module-admin-notification": "100.4.6", + "magento/module-advanced-pricing-import-export": "100.4.7", + "magento/module-advanced-search": "100.4.5", + "magento/module-amqp": "100.4.4", + "magento/module-analytics": "100.4.7", + "magento/module-application-performance-monitor": "100.4.0", + "magento/module-application-performance-monitor-new-relic": "100.4.0", + "magento/module-async-config": "100.4.0", + "magento/module-asynchronous-operations": "100.4.7", + "magento/module-authorization": "100.4.7", + "magento/module-aws-s3": "100.4.5", + "magento/module-backend": "102.0.7", + "magento/module-backup": "100.4.7", + "magento/module-bundle": "101.0.7", + "magento/module-bundle-graph-ql": "100.4.7", + "magento/module-bundle-import-export": "100.4.6", + "magento/module-cache-invalidate": "100.4.5", + "magento/module-captcha": "100.4.7", + "magento/module-cardinal-commerce": "100.4.5", + "magento/module-catalog": "104.0.7", + "magento/module-catalog-analytics": "100.4.4", + "magento/module-catalog-cms-graph-ql": "100.4.3", + "magento/module-catalog-customer-graph-ql": "100.4.6", + "magento/module-catalog-graph-ql": "100.4.7", + "magento/module-catalog-import-export": "101.1.7", + "magento/module-catalog-inventory": "100.4.7", + "magento/module-catalog-inventory-graph-ql": "100.4.4", + "magento/module-catalog-rule": "101.2.7", + "magento/module-catalog-rule-configurable": "100.4.6", + "magento/module-catalog-rule-graph-ql": "100.4.4", + "magento/module-catalog-search": "102.0.7", + "magento/module-catalog-url-rewrite": "100.4.7", + "magento/module-catalog-url-rewrite-graph-ql": "100.4.5", + "magento/module-catalog-widget": "100.4.7", + "magento/module-checkout": "100.4.7", + "magento/module-checkout-agreements": "100.4.6", + "magento/module-checkout-agreements-graph-ql": "100.4.3", + "magento/module-cms": "104.0.7", + "magento/module-cms-graph-ql": "100.4.4", + "magento/module-cms-url-rewrite": "100.4.6", + "magento/module-cms-url-rewrite-graph-ql": "100.4.5", + "magento/module-compare-list-graph-ql": "100.4.3", + "magento/module-config": "101.2.7", + "magento/module-configurable-import-export": "100.4.5", + "magento/module-configurable-product": "100.4.7", + "magento/module-configurable-product-graph-ql": "100.4.7", + "magento/module-configurable-product-sales": "100.4.4", + "magento/module-contact": "100.4.6", + "magento/module-contact-graph-ql": "100.4.0", + "magento/module-cookie": "100.4.7", + "magento/module-cron": "100.4.7", + "magento/module-csp": "100.4.6", + "magento/module-currency-symbol": "100.4.5", + "magento/module-customer": "103.0.7", + "magento/module-customer-analytics": "100.4.4", + "magento/module-customer-downloadable-graph-ql": "100.4.3", + "magento/module-customer-graph-ql": "100.4.7", + "magento/module-customer-import-export": "100.4.7", + "magento/module-deploy": "100.4.7", + "magento/module-developer": "100.4.7", + "magento/module-dhl": "100.4.6", + "magento/module-directory": "100.4.7", + "magento/module-directory-graph-ql": "100.4.5", + "magento/module-downloadable": "100.4.7", + "magento/module-downloadable-graph-ql": "100.4.7", + "magento/module-downloadable-import-export": "100.4.6", + "magento/module-eav": "102.1.7", + "magento/module-eav-graph-ql": "100.4.4", + "magento/module-elasticsearch": "101.0.7", + "magento/module-elasticsearch-7": "100.4.7", + "magento/module-email": "101.1.7", + "magento/module-encryption-key": "100.4.5", + "magento/module-fedex": "100.4.5", + "magento/module-gift-message": "100.4.6", + "magento/module-gift-message-graph-ql": "100.4.5", + "magento/module-google-adwords": "100.4.4", + "magento/module-google-analytics": "100.4.3", + "magento/module-google-gtag": "100.4.2", + "magento/module-google-optimizer": "100.4.6", + "magento/module-graph-ql": "100.4.7", + "magento/module-graph-ql-cache": "100.4.4", + "magento/module-graph-ql-new-relic": "100.4.0", + "magento/module-graph-ql-resolver-cache": "100.4.0", + "magento/module-grouped-catalog-inventory": "100.4.4", + "magento/module-grouped-import-export": "100.4.5", + "magento/module-grouped-product": "100.4.7", + "magento/module-grouped-product-graph-ql": "100.4.7", + "magento/module-import-export": "101.0.7", + "magento/module-indexer": "100.4.7", + "magento/module-instant-purchase": "100.4.6", + "magento/module-integration": "100.4.7", + "magento/module-integration-graph-ql": "100.4.0", + "magento/module-jwt-framework-adapter": "100.4.3", + "magento/module-jwt-user-token": "100.4.2", + "magento/module-layered-navigation": "100.4.7", + "magento/module-login-as-customer": "100.4.7", + "magento/module-login-as-customer-admin-ui": "100.4.7", + "magento/module-login-as-customer-api": "100.4.6", + "magento/module-login-as-customer-assistance": "100.4.6", + "magento/module-login-as-customer-frontend-ui": "100.4.6", + "magento/module-login-as-customer-graph-ql": "100.4.4", + "magento/module-login-as-customer-log": "100.4.5", + "magento/module-login-as-customer-page-cache": "100.4.6", + "magento/module-login-as-customer-quote": "100.4.5", + "magento/module-login-as-customer-sales": "100.4.6", + "magento/module-marketplace": "100.4.5", + "magento/module-media-content": "100.4.5", + "magento/module-media-content-api": "100.4.6", + "magento/module-media-content-catalog": "100.4.5", + "magento/module-media-content-cms": "100.4.5", + "magento/module-media-content-synchronization": "100.4.6", + "magento/module-media-content-synchronization-api": "100.4.5", + "magento/module-media-content-synchronization-catalog": "100.4.4", + "magento/module-media-content-synchronization-cms": "100.4.4", + "magento/module-media-gallery": "100.4.6", + "magento/module-media-gallery-api": "101.0.6", + "magento/module-media-gallery-catalog": "100.4.4", + "magento/module-media-gallery-catalog-integration": "100.4.4", + "magento/module-media-gallery-catalog-ui": "100.4.4", + "magento/module-media-gallery-cms-ui": "100.4.4", + "magento/module-media-gallery-integration": "100.4.6", + "magento/module-media-gallery-metadata": "100.4.5", + "magento/module-media-gallery-metadata-api": "100.4.4", + "magento/module-media-gallery-renditions": "100.4.5", + "magento/module-media-gallery-renditions-api": "100.4.4", + "magento/module-media-gallery-synchronization": "100.4.6", + "magento/module-media-gallery-synchronization-api": "100.4.5", + "magento/module-media-gallery-synchronization-metadata": "100.4.3", + "magento/module-media-gallery-ui": "100.4.6", + "magento/module-media-gallery-ui-api": "100.4.5", + "magento/module-media-storage": "100.4.6", + "magento/module-message-queue": "100.4.7", + "magento/module-msrp": "100.4.6", + "magento/module-msrp-configurable-product": "100.4.4", + "magento/module-msrp-grouped-product": "100.4.4", + "magento/module-multishipping": "100.4.7", + "magento/module-mysql-mq": "100.4.5", + "magento/module-new-relic-reporting": "100.4.5", + "magento/module-newsletter": "100.4.7", + "magento/module-newsletter-graph-ql": "100.4.4", + "magento/module-offline-payments": "100.4.5", + "magento/module-offline-shipping": "100.4.6", + "magento/module-open-search": "100.4.1", + "magento/module-order-cancellation": "100.4.0", + "magento/module-order-cancellation-graph-ql": "100.4.0", + "magento/module-order-cancellation-ui": "100.4.0", + "magento/module-page-cache": "100.4.7", + "magento/module-payment": "100.4.7", + "magento/module-payment-graph-ql": "100.4.2", + "magento/module-paypal": "101.0.7", + "magento/module-paypal-captcha": "100.4.4", + "magento/module-paypal-graph-ql": "100.4.5", + "magento/module-persistent": "100.4.7", + "magento/module-product-alert": "100.4.6", + "magento/module-product-video": "100.4.7", + "magento/module-quote": "101.2.7", + "magento/module-quote-analytics": "100.4.6", + "magento/module-quote-bundle-options": "100.4.3", + "magento/module-quote-configurable-options": "100.4.3", + "magento/module-quote-downloadable-links": "100.4.3", + "magento/module-quote-graph-ql": "100.4.7", + "magento/module-related-product-graph-ql": "100.4.4", + "magento/module-release-notification": "100.4.5", + "magento/module-remote-storage": "100.4.5", + "magento/module-reports": "100.4.7", + "magento/module-require-js": "100.4.3", + "magento/module-review": "100.4.7", + "magento/module-review-analytics": "100.4.4", + "magento/module-review-graph-ql": "100.4.3", + "magento/module-robots": "101.1.3", + "magento/module-rss": "100.4.5", + "magento/module-rule": "100.4.6", + "magento/module-sales": "103.0.7", + "magento/module-sales-analytics": "100.4.4", + "magento/module-sales-graph-ql": "100.4.7", + "magento/module-sales-inventory": "100.4.4", + "magento/module-sales-rule": "101.2.7", + "magento/module-sales-rule-graph-ql": "100.4.0", + "magento/module-sales-sequence": "100.4.4", + "magento/module-sample-data": "100.4.5", + "magento/module-search": "101.1.7", + "magento/module-security": "100.4.7", + "magento/module-send-friend": "100.4.5", + "magento/module-send-friend-graph-ql": "100.4.3", + "magento/module-shipping": "100.4.7", + "magento/module-sitemap": "100.4.6", + "magento/module-store": "101.1.7", + "magento/module-store-graph-ql": "100.4.5", + "magento/module-swagger": "100.4.6", + "magento/module-swagger-webapi": "100.4.3", + "magento/module-swagger-webapi-async": "100.4.3", + "magento/module-swatches": "100.4.7", + "magento/module-swatches-graph-ql": "100.4.5", + "magento/module-swatches-layered-navigation": "100.4.3", + "magento/module-tax": "100.4.7", + "magento/module-tax-graph-ql": "100.4.3", + "magento/module-tax-import-export": "100.4.6", + "magento/module-theme": "101.1.7", + "magento/module-theme-graph-ql": "100.4.4", + "magento/module-translation": "100.4.7", + "magento/module-ui": "101.2.7", + "magento/module-ups": "100.4.7", + "magento/module-url-rewrite": "102.0.6", + "magento/module-url-rewrite-graph-ql": "100.4.6", + "magento/module-user": "101.2.7", + "magento/module-usps": "100.4.6", + "magento/module-variable": "100.4.5", + "magento/module-vault": "101.2.7", + "magento/module-vault-graph-ql": "100.4.3", + "magento/module-version": "100.4.4", + "magento/module-webapi": "100.4.6", + "magento/module-webapi-async": "100.4.5", + "magento/module-webapi-security": "100.4.4", + "magento/module-weee": "100.4.7", + "magento/module-weee-graph-ql": "100.4.4", + "magento/module-widget": "101.2.7", + "magento/module-wishlist": "101.2.7", + "magento/module-wishlist-analytics": "100.4.5", + "magento/module-wishlist-graph-ql": "100.4.7", + "magento/page-builder": "1.7.4", + "magento/security-package": "1.1.6", + "magento/theme-adminhtml-backend": "100.4.7", + "magento/theme-frontend-blank": "100.4.7", + "magento/theme-frontend-luma": "100.4.7", + "magento/zend-cache": "^1.16", + "magento/zend-db": "^1.16", + "magento/zend-pdf": "^1.16", + "monolog/monolog": "^2.7", + "opensearch-project/opensearch-php": "^1.0 || ^2.0", + "pelago/emogrifier": "^7.0", + "php": "~8.1.0||~8.2.0||~8.3.0", + "php-amqplib/php-amqplib": "^3.2", + "phpseclib/mcrypt_compat": "^2.0", + "phpseclib/phpseclib": "^3.0", + "psr/log": "^2 || ^3", + "ramsey/uuid": "^4.2", + "symfony/console": "^6.4", + "symfony/intl": "^6.4", + "symfony/process": "^6.4", + "symfony/string": "^6.4", + "tedivm/jshrink": "^1.4", + "tubalmartin/cssmin": "^4.1", + "web-token/jwt-framework": "^3.1", + "webonyx/graphql-php": "^15.0", + "wikimedia/less.php": "^3.2" + }, + "type": "metapackage", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "eCommerce Platform for Growth (Community Edition)" + }, + { + "name": "magento/security-package", + "version": "1.1.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/security-package/magento-security-package-1.1.6.0.zip", + "shasum": "cd3b1a57ad120a1e7db1753cdee7fc955de060a4" + }, + "require": { + "google/recaptcha": "^1.2", + "magento/module-re-captcha-admin-ui": "1.1.4", + "magento/module-re-captcha-checkout": "1.1.4", + "magento/module-re-captcha-checkout-sales-rule": "1.1.3", + "magento/module-re-captcha-contact": "1.1.3", + "magento/module-re-captcha-customer": "1.1.5", + "magento/module-re-captcha-frontend-ui": "1.1.5", + "magento/module-re-captcha-migration": "1.1.4", + "magento/module-re-captcha-newsletter": "1.1.4", + "magento/module-re-captcha-paypal": "1.1.4", + "magento/module-re-captcha-review": "1.1.4", + "magento/module-re-captcha-send-friend": "1.1.4", + "magento/module-re-captcha-store-pickup": "1.0.3", + "magento/module-re-captcha-ui": "1.1.4", + "magento/module-re-captcha-user": "1.1.4", + "magento/module-re-captcha-validation": "1.1.3", + "magento/module-re-captcha-validation-api": "1.1.3", + "magento/module-re-captcha-version-2-checkbox": "2.0.4", + "magento/module-re-captcha-version-2-invisible": "2.0.4", + "magento/module-re-captcha-version-3-invisible": "2.0.4", + "magento/module-re-captcha-webapi-api": "1.0.3", + "magento/module-re-captcha-webapi-graph-ql": "1.0.3", + "magento/module-re-captcha-webapi-rest": "1.0.3", + "magento/module-re-captcha-webapi-ui": "1.0.3", + "magento/module-securitytxt": "1.1.3", + "magento/module-two-factor-auth": "1.1.6" + }, + "type": "metapackage", + "description": "Magento Security Package" + }, + { + "name": "magento/services-connector", + "version": "1.3.5", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/services-connector/magento-services-connector-1.3.5.0.zip", + "shasum": "e1792e6cbb5e89c91f1da9d8fbfb9fabb177ee4c" + }, + "require": { + "firebase/php-jwt": "^6.0.0", + "guzzlehttp/guzzle": "^6.0.0||^7.3.0", + "magento/framework": ">=101.0.0", + "php": "~7.2.0||~7.3.0||~7.4.0||~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "Magento\\ServicesConnector\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Saas utilities module" + }, + { + "name": "magento/services-id", + "version": "3.2.6", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/services-id/magento-services-id-3.2.6.0.zip", + "shasum": "71fef4aef8b0176d7e59f930a73d4bf5c6a2a8e7" + }, + "require": { + "magento/framework": ">=102.0.0 <104.0.0", + "magento/module-admin-graph-ql-server": "^1.0.1", + "magento/module-backend": ">=101.0.0 <103.0.0", + "magento/module-config": ">=101.1.0 <101.3.0", + "magento/module-graph-ql-server": "^1.0.1", + "magento/module-services-id": "3.2.6", + "magento/module-services-id-graph-ql-server": "1.1.5", + "magento/module-services-id-layout": "1.1.3", + "magento/module-store": ">=101.0.0 <101.2.0", + "magento/services-connector": "^1.3.5", + "php": "~7.2.0||~7.3.0||~7.4.0||~8.1.0||~8.2.0||~8.3.0" + }, + "type": "metapackage", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "Commerce Services identity metapackage" + }, + { + "name": "magento/theme-adminhtml-backend", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/theme-adminhtml-backend/magento-theme-adminhtml-backend-100.4.7.0.zip", + "shasum": "24c2c815b3b80b36287629c33369ef6c8b00166b" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-theme", + "autoload": { + "files": [ + "registration.php" + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/theme-frontend-blank", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/theme-frontend-blank/magento-theme-frontend-blank-100.4.7.0.zip", + "shasum": "1a66242f246e874977ccf6d085a8d2553bbd7c87" + }, + "require": { + "magento/framework": "103.0.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-theme", + "autoload": { + "files": [ + "registration.php" + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/theme-frontend-luma", + "version": "100.4.7", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/magento/theme-frontend-luma/magento-theme-frontend-luma-100.4.7.0.zip", + "shasum": "299288163e1c0c91a1f9ee86e34c3ab2910bc2d5" + }, + "require": { + "magento/framework": "103.0.*", + "magento/theme-frontend-blank": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "type": "magento2-theme", + "autoload": { + "files": [ + "registration.php" + ] + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "magento/zend-cache", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-zend-cache.git", + "reference": "75e6a43f198b17ea4b0c3f46b700b7a757eba84d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-zend-cache/zipball/75e6a43f198b17ea4b0c3f46b700b7a757eba84d", + "reference": "75e6a43f198b17ea4b0c3f46b700b7a757eba84d", + "shasum": "" + }, + "require": { + "magento/zend-exception": "^1.16", + "magento/zend-log": "^1.16", + "php": ">=7.0.0" + }, + "replace": { + "zf1/zend-cache": "^1.12", + "zfs1/zend-cache": "^1.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.16.x-dev" + } + }, + "autoload": { + "psr-0": { + "Zend_Cache": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Zend Framework 1 Cache package", + "homepage": "http://framework.zend.com/", + "keywords": [ + "ZF1", + "cache", + "framework", + "zend" + ], + "support": { + "issues": "https://github.com/magento/magento-zend-cache/issues", + "source": "https://github.com/magento/magento-zend-cache/tree/1.16.0" + }, + "time": "2022-09-22T19:09:32+00:00" + }, + { + "name": "magento/zend-db", + "version": "1.16.1", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-zend-db.git", + "reference": "475addb06c0a417b2fd18effe5966bd3aa929b7b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-zend-db/zipball/475addb06c0a417b2fd18effe5966bd3aa929b7b", + "reference": "475addb06c0a417b2fd18effe5966bd3aa929b7b", + "shasum": "" + }, + "require": { + "magento/zend-exception": "^1.16", + "magento/zend-loader": "^1.16", + "php": ">=7.0.0" + }, + "replace": { + "zf1/zend-db": "^1.12", + "zfs1/zend-db": "^1.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.16.x-dev" + } + }, + "autoload": { + "psr-0": { + "Zend_Db": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Zend Framework 1 Db package", + "homepage": "http://framework.zend.com/", + "keywords": [ + "ZF1", + "db", + "framework", + "zend" + ], + "support": { + "issues": "https://github.com/magento/magento-zend-db/issues", + "source": "https://github.com/magento/magento-zend-db/tree/1.16.1" + }, + "time": "2023-08-25T13:52:30+00:00" + }, + { + "name": "magento/zend-exception", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-zend-exception.git", + "reference": "5219ba961e36dc1a713da3ad4f1594a87c71f758" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-zend-exception/zipball/5219ba961e36dc1a713da3ad4f1594a87c71f758", + "reference": "5219ba961e36dc1a713da3ad4f1594a87c71f758", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "replace": { + "zf1/zend-exception": "^1.12", + "zfs1/zend-exception": "^1.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.16.x-dev" + } + }, + "autoload": { + "psr-0": { + "Zend_Exception": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Zend Framework 1 Exception package", + "homepage": "http://framework.zend.com/", + "keywords": [ + "ZF1", + "exception", + "framework", + "zend" + ], + "support": { + "issues": "https://github.com/magento/magento-zend-exception/issues", + "source": "https://github.com/magento/magento-zend-exception/tree/1.16.0" + }, + "time": "2022-09-22T19:06:06+00:00" + }, + { + "name": "magento/zend-loader", + "version": "1.16.1", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-zend-loader.git", + "reference": "7eca22970a6b7cdaa3d3a6a6d117e4c0d3bef5e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-zend-loader/zipball/7eca22970a6b7cdaa3d3a6a6d117e4c0d3bef5e9", + "reference": "7eca22970a6b7cdaa3d3a6a6d117e4c0d3bef5e9", + "shasum": "" + }, + "require": { + "magento/zend-exception": "^1.16.0", + "php": ">=7.0.0" + }, + "replace": { + "zf1/zend-loader": "^1.12", + "zf1s/zend-loader": "^1.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.16.x-dev" + } + }, + "autoload": { + "psr-0": { + "Zend_Loader": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Zend Framework 1 Loader package", + "homepage": "http://framework.zend.com/", + "keywords": [ + "ZF1", + "framework", + "loader", + "zend" + ], + "support": { + "issues": "https://github.com/magento/magento-zend-loader/issues", + "source": "https://github.com/magento/magento-zend-loader/tree/1.16.1" + }, + "time": "2023-08-25T13:52:37+00:00" + }, + { + "name": "magento/zend-log", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-zend-log.git", + "reference": "c03b9febe92c501288cf441d41b49cd01f1e8a50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-zend-log/zipball/c03b9febe92c501288cf441d41b49cd01f1e8a50", + "reference": "c03b9febe92c501288cf441d41b49cd01f1e8a50", + "shasum": "" + }, + "require": { + "magento/zend-exception": "^1.16", + "php": ">=7.0.0" + }, + "replace": { + "zf1/zend-log": "^1.12", + "zfs1/zend-log": "^1.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.16.x-dev" + } + }, + "autoload": { + "psr-0": { + "Zend_Log": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Zend Framework 1 Log package", + "homepage": "http://framework.zend.com/", + "keywords": [ + "ZF1", + "framework", + "log", + "zend" + ], + "support": { + "issues": "https://github.com/magento/magento-zend-log/issues", + "source": "https://github.com/magento/magento-zend-log/tree/1.16.0" + }, + "time": "2022-09-22T19:03:03+00:00" + }, + { + "name": "magento/zend-memory", + "version": "1.16.0", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-zend-memory.git", + "reference": "0d48804c6718cc9f15e5c356e6192fd6fff8932b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-zend-memory/zipball/0d48804c6718cc9f15e5c356e6192fd6fff8932b", + "reference": "0d48804c6718cc9f15e5c356e6192fd6fff8932b", + "shasum": "" + }, + "require": { + "magento/zend-cache": "^1.16", + "magento/zend-exception": "^1.16", + "php": ">=7.0.0" + }, + "replace": { + "zf1/zend-memory": "^1.12", + "zfs1/zend-memory": "^1.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.16.x-dev" + } + }, + "autoload": { + "psr-0": { + "Zend_Memory": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Zend Framework 1 Memory package", + "homepage": "http://framework.zend.com/", + "keywords": [ + "ZF1", + "framework", + "memory", + "zend" + ], + "support": { + "issues": "https://github.com/magento/magento-zend-memory/issues", + "source": "https://github.com/magento/magento-zend-memory/tree/1.16.0" + }, + "time": "2022-09-22T18:17:46+00:00" + }, + { + "name": "magento/zend-pdf", + "version": "1.16.3", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-zend-pdf.git", + "reference": "4426cdf87d10ad9a45e21da1468665a97d01ef79" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-zend-pdf/zipball/4426cdf87d10ad9a45e21da1468665a97d01ef79", + "reference": "4426cdf87d10ad9a45e21da1468665a97d01ef79", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-zlib": "*", + "magento/zend-exception": "^1.16", + "magento/zend-log": "^1.16", + "magento/zend-memory": "^1.16", + "php": ">=7.0.0" + }, + "replace": { + "zf1/zend-pdf": "^1.12", + "zfs1/zend-pdf": "^1.12" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.16.x-dev" + } + }, + "autoload": { + "psr-0": { + "Zend_Pdf": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Zend Framework 1 Pdf package", + "homepage": "http://framework.zend.com/", + "keywords": [ + "ZF1", + "framework", + "pdf", + "zend" + ], + "support": { + "issues": "https://github.com/magento/magento-zend-pdf/issues", + "source": "https://github.com/magento/magento-zend-pdf/tree/1.16.3" + }, + "time": "2023-08-25T12:52:21+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.10.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "5cf826f2991858b54d5c3809bee745560a1042a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/5cf826f2991858b54d5c3809bee745560a1042a7", + "reference": "5cf826f2991858b54d5c3809bee745560a1042a7", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2@dev", + "guzzlehttp/guzzle": "^7.4", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "phpspec/prophecy": "^1.15", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^8.5.38 || ^9.6.19", + "predis/predis": "^1.1 || ^2.0", + "rollbar/rollbar": "^1.3 || ^2 || ^3", + "ruflin/elastica": "^7", + "swiftmailer/swiftmailer": "^5.3|^6.0", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.10.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2024-11-12T12:43:37+00:00" + }, + { + "name": "mtdowling/jmespath.php", + "version": "2.8.0", + "source": { + "type": "git", + "url": "https://github.com/jmespath/jmespath.php.git", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "symfony/polyfill-mbstring": "^1.17" + }, + "require-dev": { + "composer/xdebug-handler": "^3.0.3", + "phpunit/phpunit": "^8.5.33" + }, + "bin": [ + "bin/jp.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.8-dev" + } + }, + "autoload": { + "files": [ + "src/JmesPath.php" + ], + "psr-4": { + "JmesPath\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + } + ], + "description": "Declaratively specify how to extract elements from a JSON document", + "keywords": [ + "json", + "jsonpath" + ], + "support": { + "issues": "https://github.com/jmespath/jmespath.php/issues", + "source": "https://github.com/jmespath/jmespath.php/tree/2.8.0" + }, + "time": "2024-09-04T18:46:31+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.3.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" + }, + "time": "2024-10-08T18:51:32+00:00" + }, + { + "name": "opensearch-project/opensearch-php", + "version": "2.3.1", + "source": { + "type": "git", + "url": "https://github.com/opensearch-project/opensearch-php.git", + "reference": "1866e6ee95c15036038d6c95a5c54c6fe648de36" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opensearch-project/opensearch-php/zipball/1866e6ee95c15036038d6c95a5c54c6fe648de36", + "reference": "1866e6ee95c15036038d6c95a5c54c6fe648de36", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": ">=1.3.7", + "ezimuel/ringphp": "^1.2.2", + "php": "^7.3 || ^8.0", + "psr/log": "^1|^2|^3", + "symfony/yaml": "*" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.0", + "mockery/mockery": "^1.2", + "phpstan/phpstan": "^1.7.15", + "phpstan/phpstan-mockery": "^1.1.0", + "phpunit/phpunit": "^9.3", + "symfony/finder": "~4.0 || ~5.0" + }, + "suggest": { + "aws/aws-sdk-php": "Required (^3.0.0) in order to use the SigV4 handler", + "monolog/monolog": "Allows for client-level logging and tracing" + }, + "type": "library", + "autoload": { + "psr-4": { + "OpenSearch\\": "src/OpenSearch/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0", + "LGPL-2.1-only" + ], + "authors": [ + { + "name": "Elastic" + }, + { + "name": "OpenSearch Contributors" + } + ], + "description": "PHP Client for OpenSearch", + "keywords": [ + "client", + "elasticsearch", + "opensearch", + "search" + ], + "support": { + "issues": "https://github.com/opensearch-project/opensearch-php/issues", + "source": "https://github.com/opensearch-project/opensearch-php/tree/2.3.1" + }, + "time": "2024-08-27T10:13:25+00:00" + }, + { + "name": "paragonie/constant_time_encoding", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/constant_time_encoding.git", + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/df1e7fde177501eee2037dd159cf04f5f301a512", + "reference": "df1e7fde177501eee2037dd159cf04f5f301a512", + "shasum": "" + }, + "require": { + "php": "^8" + }, + "require-dev": { + "phpunit/phpunit": "^9", + "vimeo/psalm": "^4|^5" + }, + "type": "library", + "autoload": { + "psr-4": { + "ParagonIE\\ConstantTime\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com", + "role": "Maintainer" + }, + { + "name": "Steve 'Sc00bz' Thomas", + "email": "steve@tobtu.com", + "homepage": "https://www.tobtu.com", + "role": "Original Developer" + } + ], + "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", + "keywords": [ + "base16", + "base32", + "base32_decode", + "base32_encode", + "base64", + "base64_decode", + "base64_encode", + "bin2hex", + "encoding", + "hex", + "hex2bin", + "rfc4648" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/constant_time_encoding/issues", + "source": "https://github.com/paragonie/constant_time_encoding" + }, + "time": "2024-05-08T12:36:18+00:00" + }, + { + "name": "paragonie/random_compat", + "version": "v9.99.100", + "source": { + "type": "git", + "url": "https://github.com/paragonie/random_compat.git", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/996434e5492cb4c3edcb9168db6fbb1359ef965a", + "reference": "996434e5492cb4c3edcb9168db6fbb1359ef965a", + "shasum": "" + }, + "require": { + "php": ">= 7" + }, + "require-dev": { + "phpunit/phpunit": "4.*|5.*", + "vimeo/psalm": "^1" + }, + "suggest": { + "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." + }, + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com", + "homepage": "https://paragonie.com" + } + ], + "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", + "keywords": [ + "csprng", + "polyfill", + "pseudorandom", + "random" + ], + "support": { + "email": "info@paragonie.com", + "issues": "https://github.com/paragonie/random_compat/issues", + "source": "https://github.com/paragonie/random_compat" + }, + "time": "2020-10-15T08:29:30+00:00" + }, + { + "name": "paragonie/sodium_compat", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/paragonie/sodium_compat.git", + "reference": "a673d5f310477027cead2e2f2b6db5d8368157cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/a673d5f310477027cead2e2f2b6db5d8368157cb", + "reference": "a673d5f310477027cead2e2f2b6db5d8368157cb", + "shasum": "" + }, + "require": { + "php": "^8.1", + "php-64bit": "*" + }, + "require-dev": { + "phpunit/phpunit": "^7|^8|^9", + "vimeo/psalm": "^4|^5" + }, + "suggest": { + "ext-sodium": "Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "files": [ + "autoload.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Paragon Initiative Enterprises", + "email": "security@paragonie.com" + }, + { + "name": "Frank Denis", + "email": "jedisct1@pureftpd.org" + } + ], + "description": "Pure PHP implementation of libsodium; uses the PHP extension if it exists", + "keywords": [ + "Authentication", + "BLAKE2b", + "ChaCha20", + "ChaCha20-Poly1305", + "Chapoly", + "Curve25519", + "Ed25519", + "EdDSA", + "Edwards-curve Digital Signature Algorithm", + "Elliptic Curve Diffie-Hellman", + "Poly1305", + "Pure-PHP cryptography", + "RFC 7748", + "RFC 8032", + "Salpoly", + "Salsa20", + "X25519", + "XChaCha20-Poly1305", + "XSalsa20-Poly1305", + "Xchacha20", + "Xsalsa20", + "aead", + "cryptography", + "ecdh", + "elliptic curve", + "elliptic curve cryptography", + "encryption", + "libsodium", + "php", + "public-key cryptography", + "secret-key cryptography", + "side-channel resistant" + ], + "support": { + "issues": "https://github.com/paragonie/sodium_compat/issues", + "source": "https://github.com/paragonie/sodium_compat/tree/v2.1.0" + }, + "time": "2024-09-04T12:51:01+00:00" + }, + { + "name": "paypal/module-braintree", + "version": "4.6.1-p3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/paypal/module-braintree/paypal-module-braintree-4.6.1.0-patch3.zip", + "shasum": "864561fdf376966f6f52151b7a680954d5c67978" + }, + "require": { + "braintree/braintree_php": "6.13.0", + "magento/framework": "*", + "paypal/module-braintree-core": "4.6.1-p3", + "paypal/module-braintree-customer-balance": "4.6.1-p3", + "paypal/module-braintree-gift-card-account": "4.6.1-p3", + "paypal/module-braintree-gift-wrapping": "4.6.1-p3", + "paypal/module-braintree-graph-ql": "4.6.1-p3", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "metapackage", + "license": [ + "Apache-2.0" + ], + "description": "Braintree Magento" + }, + { + "name": "paypal/module-braintree-core", + "version": "4.6.1-p3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/paypal/module-braintree-core/paypal-module-braintree-core-4.6.1.0-patch3.zip", + "shasum": "103e37facd2b6f7c4e0cb88ab1fc0b3ed978f626" + }, + "require": { + "braintree/braintree_php": "6.13.0", + "ext-json": "*", + "ext-simplexml": "*", + "magento/framework": "*", + "magento/module-authorization": "100.4.*", + "magento/module-backend": "100.2.*||101.0.*||^102.0.0", + "magento/module-catalog": "102.0.*||103.0.*||^104.0.0", + "magento/module-checkout": "100.2.*||100.3.*||^100.4.0", + "magento/module-checkout-agreements": "100.4.*", + "magento/module-config": "101.0.*||101.1.*||^101.2.0", + "magento/module-configurable-product": "100.4.*", + "magento/module-customer": "101.0.*||102.0.*||^103.0.0", + "magento/module-directory": "100.2.*||100.3.*||^100.4.0", + "magento/module-downloadable": "100.4.*", + "magento/module-grouped-product": "100.4.*", + "magento/module-instant-purchase": "100.4.*", + "magento/module-multishipping": "100.4.*", + "magento/module-payment": "100.2.*||100.3.*||^100.4.0", + "magento/module-paypal": "100.2.*||100.3.*||^101.0.0", + "magento/module-quote": "101.0.*||101.1.*||^101.2.0", + "magento/module-quote-graph-ql": "^100", + "magento/module-re-captcha-admin-ui": "1.1.*", + "magento/module-re-captcha-frontend-ui": "1.1.*", + "magento/module-re-captcha-ui": "1.1.*", + "magento/module-re-captcha-validation-api": "1.1.*", + "magento/module-re-captcha-version-2-checkbox": "2.0.*", + "magento/module-re-captcha-version-2-invisible": "2.0.*", + "magento/module-re-captcha-version-3-invisible": "2.0.*", + "magento/module-re-captcha-webapi-api": "1.0.*", + "magento/module-re-captcha-webapi-ui": "1.0.*", + "magento/module-sales": "101.0.*||102.0.*||^102.1.0||^103", + "magento/module-store": "101.1.*", + "magento/module-theme": "100.2.*||101.0.*||^101.1.0", + "magento/module-ui": "101.0.*||101.1.*||^101.2.0", + "magento/module-vault": "101.0.*||101.1.*||^101.2.0", + "magento/module-webapi": "100.4.*", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "conflict": { + "gene/module-braintree": "*", + "magento/module-braintree": "*" + }, + "require-dev": { + "magento/magento-coding-standard": "^32.0" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "PayPal\\Braintree\\": "" + } + }, + "license": [ + "proprietary" + ], + "description": "Fork from the Magento Braintree 2.2.0 module by Gene Commerce for PayPal." + }, + { + "name": "paypal/module-braintree-customer-balance", + "version": "4.6.1-p3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/paypal/module-braintree-customer-balance/paypal-module-braintree-customer-balance-4.6.1.0-patch3.zip", + "shasum": "9468afa476d564050d84da27c0596e32723fdbcc" + }, + "require": { + "magento/framework": "*", + "magento/module-quote": "101.0.*||101.1.*||^101.2.0", + "magento/module-sales": "101.0.*||102.0.*||^102.1.0||^103", + "paypal/module-braintree-core": "4.6.1-p3", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-customer-balance": "100.4.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "PayPal\\BraintreeCustomerBalance\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "paypal/module-braintree-gift-card-account", + "version": "4.6.1-p3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/paypal/module-braintree-gift-card-account/paypal-module-braintree-gift-card-account-4.6.1.0-patch3.zip", + "shasum": "2ec37b1848d3c7eb927f047d55879cda3a0e6463" + }, + "require": { + "magento/framework": "*", + "magento/module-quote": "101.0.*||101.1.*||^101.2.0", + "magento/module-sales": "101.0.*||102.0.*||^102.1.0||^103", + "paypal/module-braintree-core": "4.6.1-p3", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-gift-card-account": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "PayPal\\BraintreeGiftCardAccount\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "paypal/module-braintree-gift-wrapping", + "version": "4.6.1-p3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/paypal/module-braintree-gift-wrapping/paypal-module-braintree-gift-wrapping-4.6.1.0-patch3.zip", + "shasum": "8d28e5bb10937372d758f53dd9baecc30dcf5a09" + }, + "require": { + "magento/framework": "*", + "magento/module-quote": "101.0.*||101.1.*||^101.2.0", + "magento/module-sales": "101.0.*||102.0.*||^102.1.0||^103", + "paypal/module-braintree-core": "4.6.1-p3", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "suggest": { + "magento/module-gift-wrapping": "101.2.*" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "PayPal\\BraintreeGiftWrapping\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "paypal/module-braintree-graph-ql", + "version": "4.6.1-p3", + "dist": { + "type": "zip", + "url": "https://repo.magento.com/archives/paypal/module-braintree-graph-ql/paypal-module-braintree-graph-ql-4.6.1.0-patch3.zip", + "shasum": "3793044c9ba6ebe9e1ab50bee9e9df1306e73832" + }, + "require": { + "magento/framework": "*", + "magento/module-quote": "^101", + "magento/module-quote-graph-ql": "^100", + "magento/module-store": "^101", + "paypal/module-braintree-core": "4.6.1-p3", + "php": "~8.1.0||~8.2.0||~8.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "magento/module-graph-ql": "^100" + }, + "type": "magento2-module", + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "PayPal\\BraintreeGraphQl\\": "" + } + }, + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "N/A" + }, + { + "name": "pelago/emogrifier", + "version": "v7.3.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/emogrifier.git", + "reference": "6e00d9d8235e8cc8eec857e8dcd6cfeefdfd0cd6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/emogrifier/zipball/6e00d9d8235e8cc8eec857e8dcd6cfeefdfd0cd6", + "reference": "6e00d9d8235e8cc8eec857e8dcd6cfeefdfd0cd6", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "sabberworm/php-css-parser": "^8.7.0", + "symfony/css-selector": "^4.4.23 || ^5.4.0 || ^6.0.0 || ^7.0.0" + }, + "require-dev": { + "php-parallel-lint/php-parallel-lint": "1.4.0", + "phpstan/extension-installer": "1.4.3", + "phpstan/phpstan": "1.12.7", + "phpstan/phpstan-phpunit": "1.4.0", + "phpstan/phpstan-strict-rules": "1.6.1", + "phpunit/phpunit": "9.6.21", + "rawr/cross-data-providers": "2.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "8.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Pelago\\Emogrifier\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Zoli Szabó", + "email": "zoli.szabo+github@gmail.com" + }, + { + "name": "John Reeve", + "email": "jreeve@pelagodesign.com" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + }, + { + "name": "Cameron Brooks" + }, + { + "name": "Jaime Prado" + } + ], + "description": "Converts CSS styles into inline style attributes in your HTML code", + "homepage": "https://www.myintervals.com/emogrifier.php", + "keywords": [ + "css", + "email", + "pre-processing" + ], + "support": { + "issues": "https://github.com/MyIntervals/emogrifier/issues", + "source": "https://github.com/MyIntervals/emogrifier" + }, + "time": "2024-10-28T16:12:26+00:00" + }, + { + "name": "php-amqplib/php-amqplib", + "version": "v3.2.0", + "source": { + "type": "git", + "url": "https://github.com/php-amqplib/php-amqplib.git", + "reference": "0bec5b392428e0ac3b3f34fbc4e02d706995833e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/0bec5b392428e0ac3b3f34fbc4e02d706995833e", + "reference": "0bec5b392428e0ac3b3f34fbc4e02d706995833e", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-sockets": "*", + "php": "^7.1||^8.0", + "phpseclib/phpseclib": "^2.0|^3.0" + }, + "conflict": { + "php": "7.4.0 - 7.4.1" + }, + "replace": { + "videlalvaro/php-amqplib": "self.version" + }, + "require-dev": { + "ext-curl": "*", + "nategood/httpful": "^0.2.20", + "phpunit/phpunit": "^7.5|^9.5", + "squizlabs/php_codesniffer": "^3.6" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpAmqpLib\\": "PhpAmqpLib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Alvaro Videla", + "role": "Original Maintainer" + }, + { + "name": "Raúl Araya", + "email": "nubeiro@gmail.com", + "role": "Maintainer" + }, + { + "name": "Luke Bakken", + "email": "luke@bakken.io", + "role": "Maintainer" + }, + { + "name": "Ramūnas Dronga", + "email": "github@ramuno.lt", + "role": "Maintainer" + } + ], + "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", + "homepage": "https://github.com/php-amqplib/php-amqplib/", + "keywords": [ + "message", + "queue", + "rabbitmq" + ], + "support": { + "issues": "https://github.com/php-amqplib/php-amqplib/issues", + "source": "https://github.com/php-amqplib/php-amqplib/tree/v3.2.0" + }, + "time": "2022-03-10T19:16:00+00:00" + }, + { + "name": "phpgt/cssxpath", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/PhpGt/CssXPath.git", + "reference": "c0a06671fed8db601bb680dc4d5accf3cd9deb81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhpGt/CssXPath/zipball/c0a06671fed8db601bb680dc4d5accf3cd9deb81", + "reference": "c0a06671fed8db601bb680dc4d5accf3cd9deb81", + "shasum": "" + }, + "require": { + "php": ">=8.0" + }, + "require-dev": { + "ext-dom": "*", + "ext-libxml": "*", + "phpstan/phpstan": "^v1.8", + "phpunit/phpunit": "^v9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Gt\\CssXPath\\": "./src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Bowler", + "email": "greg.bowler@g105b.com", + "homepage": "https://www.g105b.com", + "role": "Developer" + } + ], + "description": "Convert CSS selectors to XPath queries.", + "support": { + "issues": "https://github.com/PhpGt/CssXPath/issues", + "source": "https://github.com/PhpGt/CssXPath/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/PhpGt", + "type": "github" + } + ], + "time": "2024-01-03T18:33:56+00:00" + }, + { + "name": "phpgt/dom", + "version": "v4.1.6", + "source": { + "type": "git", + "url": "https://github.com/PhpGt/Dom.git", + "reference": "b3fe4a5054ef0780d663389475972c7b09b70a48" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhpGt/Dom/zipball/b3fe4a5054ef0780d663389475972c7b09b70a48", + "reference": "b3fe4a5054ef0780d663389475972c7b09b70a48", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "php": ">=8.1", + "phpgt/cssxpath": "^1.1", + "phpgt/propfunc": "^1.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "require-dev": { + "phpmd/phpmd": "^2.13", + "phpstan/phpstan": "^1.9", + "phpunit/phpunit": "^10.4", + "squizlabs/php_codesniffer": "^3.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Gt\\Dom\\": "./src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Bowler", + "email": "greg.bowler@g105b.com", + "homepage": "https://www.g105b.com", + "role": "Developer" + }, + { + "name": "Alvaro Guimaraes", + "homepage": "https://github.com/aguimaraes", + "role": "Developer" + }, + { + "name": "James Fellows", + "homepage": "https://github.com/j4m3s", + "role": "Developer" + }, + { + "name": "Emile Ward", + "homepage": "https://github.com/emileward", + "role": "Developer" + }, + { + "name": "Jelmer Wijnja", + "homepage": "https://github.com/Jelmergu", + "role": "Developer" + }, + { + "name": "Ognjen Petrovic", + "homepage": "https://github.com/ognjen-petrovic", + "role": "Developer" + }, + { + "name": "Jacob Bearden", + "homepage": "https://github.com/jacobbearden", + "role": "Documentation contributor" + }, + { + "name": "Jaroslav Týc", + "homepage": "https://www.jaroslavtyc.com/", + "role": "Developer" + }, + { + "name": "Andrii Beziazychnyi", + "homepage": "https://www.atwix.com/", + "role": "Developer" + } + ], + "description": "Modern DOM API.", + "support": { + "issues": "https://github.com/PhpGt/Dom/issues", + "source": "https://github.com/PhpGt/Dom/tree/v4.1.6" + }, + "funding": [ + { + "url": "https://github.com/sponsors/PhpGt", + "type": "github" + } + ], + "time": "2023-12-31T11:26:08+00:00" + }, + { + "name": "phpgt/propfunc", + "version": "v1.0.1", + "source": { + "type": "git", + "url": "https://github.com/PhpGt/PropFunc.git", + "reference": "091213649e89ff22d1ef640b46fbee5215c65520" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhpGt/PropFunc/zipball/091213649e89ff22d1ef640b46fbee5215c65520", + "reference": "091213649e89ff22d1ef640b46fbee5215c65520", + "shasum": "" + }, + "require": { + "php": ">=8.0" + }, + "require-dev": { + "phpstan/phpstan": ">=0.12", + "phpunit/phpunit": ">=9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Gt\\PropFunc\\": "./src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Greg Bowler", + "email": "greg.bowler@g105b.com", + "homepage": "https://www.g105b.com", + "role": "Developer" + } + ], + "description": "Property accessor and mutator functions.", + "support": { + "issues": "https://github.com/PhpGt/PropFunc/issues", + "source": "https://github.com/PhpGt/PropFunc/tree/v1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/PhpGt", + "type": "github" + } + ], + "time": "2021-03-23T12:46:44+00:00" + }, + { + "name": "phpseclib/mcrypt_compat", + "version": "2.0.6", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/mcrypt_compat.git", + "reference": "e5924504997b4f90772034cefd89dc2f4ec189dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/mcrypt_compat/zipball/e5924504997b4f90772034cefd89dc2f4ec189dc", + "reference": "e5924504997b4f90772034cefd89dc2f4ec189dc", + "shasum": "" + }, + "require": { + "php": ">=5.6.1", + "phpseclib/phpseclib": ">=3.0.36 <4.0.0" + }, + "provide": { + "ext-mcrypt": "5.6.40" + }, + "require-dev": { + "phpunit/phpunit": "^5.7|^6.0|^9.4" + }, + "suggest": { + "ext-openssl": "Will enable faster cryptographic operations" + }, + "type": "library", + "autoload": { + "files": [ + "lib/mcrypt.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "homepage": "http://phpseclib.sourceforge.net" + } + ], + "description": "PHP 5.x-8.x polyfill for mcrypt extension", + "keywords": [ + "cryptograpy", + "encryption", + "mcrypt", + "polyfill" + ], + "support": { + "email": "terrafrost@php.net", + "issues": "https://github.com/phpseclib/mcrypt_compat/issues", + "source": "https://github.com/phpseclib/mcrypt_compat" + }, + "funding": [ + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/mcrypt_compat", + "type": "tidelift" + } + ], + "time": "2024-02-26T14:52:18+00:00" + }, + { + "name": "phpseclib/phpseclib", + "version": "3.0.42", + "source": { + "type": "git", + "url": "https://github.com/phpseclib/phpseclib.git", + "reference": "db92f1b1987b12b13f248fe76c3a52cadb67bb98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/db92f1b1987b12b13f248fe76c3a52cadb67bb98", + "reference": "db92f1b1987b12b13f248fe76c3a52cadb67bb98", + "shasum": "" + }, + "require": { + "paragonie/constant_time_encoding": "^1|^2|^3", + "paragonie/random_compat": "^1.4|^2.0|^9.99.99", + "php": ">=5.6.1" + }, + "require-dev": { + "phpunit/phpunit": "*" + }, + "suggest": { + "ext-dom": "Install the DOM extension to load XML formatted public keys.", + "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", + "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", + "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + }, + "type": "library", + "autoload": { + "files": [ + "phpseclib/bootstrap.php" + ], + "psr-4": { + "phpseclib3\\": "phpseclib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jim Wigginton", + "email": "terrafrost@php.net", + "role": "Lead Developer" + }, + { + "name": "Patrick Monnerat", + "email": "pm@datasphere.ch", + "role": "Developer" + }, + { + "name": "Andreas Fischer", + "email": "bantu@phpbb.com", + "role": "Developer" + }, + { + "name": "Hans-Jürgen Petrich", + "email": "petrich@tronic-media.com", + "role": "Developer" + }, + { + "name": "Graham Campbell", + "email": "graham@alt-three.com", + "role": "Developer" + } + ], + "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", + "homepage": "http://phpseclib.sourceforge.net", + "keywords": [ + "BigInteger", + "aes", + "asn.1", + "asn1", + "blowfish", + "crypto", + "cryptography", + "encryption", + "rsa", + "security", + "sftp", + "signature", + "signing", + "ssh", + "twofish", + "x.509", + "x509" + ], + "support": { + "issues": "https://github.com/phpseclib/phpseclib/issues", + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.42" + }, + "funding": [ + { + "url": "https://github.com/terrafrost", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpseclib", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", + "type": "tidelift" + } + ], + "time": "2024-09-16T03:06:04+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/clock", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/clock.git", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Clock\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for reading the clock.", + "homepage": "https://github.com/php-fig/clock", + "keywords": [ + "clock", + "now", + "psr", + "psr-20", + "time" + ], + "support": { + "issues": "https://github.com/php-fig/clock/issues", + "source": "https://github.com/php-fig/clock/tree/1.0.0" + }, + "time": "2022-11-25T14:36:26+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "psr/log", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "reference": "f16e1d5863e37f8d8c2a01719f5b34baa2b714d3", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.2" + }, + "time": "2024-09-11T13:17:53+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "reference": "a4b48764bfbb8f3a6a4d1aeb1a35bb5e9ecac4a5", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "captainhook/plugin-composer": "^5.3", + "ergebnis/composer-normalize": "^2.28.3", + "fakerphp/faker": "^1.21", + "hamcrest/hamcrest-php": "^2.0", + "jangregor/phpstan-prophecy": "^1.0", + "mockery/mockery": "^1.5", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpcsstandards/phpcsutils": "^1.0.0-rc1", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.9", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5", + "psalm/plugin-mockery": "^1.1", + "psalm/plugin-phpunit": "^0.18.4", + "ramsey/coding-standard": "^2.0.3", + "ramsey/conventional-commits": "^1.3", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + }, + "ramsey/conventional-commits": { + "configFile": "conventional-commits.json" + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/2.0.0" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2022-12-31T21:50:55+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.7.6", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", + "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "shasum": "" + }, + "require": { + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "ext-json": "*", + "php": "^8.0", + "ramsey/collection": "^1.2 || ^2.0" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^8.5 || ^9", + "ramsey/composer-repl": "^1.4", + "slevomat/coding-standard": "^8.4", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "captainhook": { + "force-install": true + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Ramsey\\Uuid\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.7.6" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2024-04-27T21:32:50+00:00" + }, + { + "name": "react/promise", + "version": "v2.11.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/promise.git", + "reference": "1a8460931ea36dc5c76838fec5734d55c88c6831" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/promise/zipball/1a8460931ea36dc5c76838fec5734d55c88c6831", + "reference": "1a8460931ea36dc5c76838fec5734d55c88c6831", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "React\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP", + "keywords": [ + "promise", + "promises" + ], + "support": { + "issues": "https://github.com/reactphp/promise/issues", + "source": "https://github.com/reactphp/promise/tree/v2.11.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-16T16:16:50+00:00" + }, + { + "name": "sabberworm/php-css-parser", + "version": "v8.7.0", + "source": { + "type": "git", + "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", + "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/f414ff953002a9b18e3a116f5e462c56f21237cf", + "reference": "f414ff953002a9b18e3a116f5e462c56f21237cf", + "shasum": "" + }, + "require": { + "ext-iconv": "*", + "php": "^5.6.20 || ^7.0.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0" + }, + "require-dev": { + "phpunit/phpunit": "5.7.27 || 6.5.14 || 7.5.20 || 8.5.40" + }, + "suggest": { + "ext-mbstring": "for parsing UTF-8 CSS" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Sabberworm\\CSS\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + }, + { + "name": "Oliver Klee", + "email": "github@oliverklee.de" + }, + { + "name": "Jake Hotson", + "email": "jake.github@qzdesign.co.uk" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "https://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.7.0" + }, + "time": "2024-10-27T17:38:32+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "reference": "1748aaf847fc731cfad7725aec413ee46f0cc3a2", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1.11", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "support": { + "issues": "https://github.com/Seldaek/jsonlint/issues", + "source": "https://github.com/Seldaek/jsonlint/tree/1.11.0" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", + "type": "tidelift" + } + ], + "time": "2024-07-11T14:55:45+00:00" + }, + { + "name": "seld/phar-utils", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\PharUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phar" + ], + "support": { + "issues": "https://github.com/Seldaek/phar-utils/issues", + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" + }, + "time": "2022-08-31T10:31:18+00:00" + }, + { + "name": "seld/signal-handler", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/signal-handler.git", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "reference": "04a6112e883ad76c0ada8e4a9f7520bbfdb6bb98", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^7.5.20 || ^8.5.23", + "psr/log": "^1 || ^2 || ^3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\Signal\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "keywords": [ + "posix", + "sigint", + "signal", + "sigterm", + "unix" + ], + "support": { + "issues": "https://github.com/Seldaek/signal-handler/issues", + "source": "https://github.com/Seldaek/signal-handler/tree/2.0.2" + }, + "time": "2023-09-03T09:24:00+00:00" + }, + { + "name": "spomky-labs/aes-key-wrap", + "version": "v7.0.0", + "source": { + "type": "git", + "url": "https://github.com/Spomky-Labs/aes-key-wrap.git", + "reference": "fbeb834b1f83aa8fbdfbd4c12124f71d4c1606ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Spomky-Labs/aes-key-wrap/zipball/fbeb834b1f83aa8fbdfbd4c12124f71d4c1606ae", + "reference": "fbeb834b1f83aa8fbdfbd4c12124f71d4c1606ae", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-openssl": "*", + "php": ">=8.0" + }, + "require-dev": { + "infection/infection": "^0.25.4", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-beberlei-assert": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.0", + "rector/rector": "^0.12.5", + "symplify/easy-coding-standard": "^10.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "AESKW\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky-Labs/aes-key-wrap/contributors" + } + ], + "description": "AES Key Wrap for PHP.", + "homepage": "https://github.com/Spomky-Labs/aes-key-wrap", + "keywords": [ + "A128KW", + "A192KW", + "A256KW", + "RFC3394", + "RFC5649", + "aes", + "key", + "padding", + "wrap" + ], + "support": { + "issues": "https://github.com/Spomky-Labs/aes-key-wrap/issues", + "source": "https://github.com/Spomky-Labs/aes-key-wrap/tree/v7.0.0" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2021-12-08T20:36:59+00:00" + }, + { + "name": "spomky-labs/otphp", + "version": "11.3.0", + "source": { + "type": "git", + "url": "https://github.com/Spomky-Labs/otphp.git", + "reference": "2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Spomky-Labs/otphp/zipball/2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33", + "reference": "2d8ccb5fc992b9cc65ef321fa4f00fefdb3f4b33", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "paragonie/constant_time_encoding": "^2.0 || ^3.0", + "php": ">=8.1", + "psr/clock": "^1.0", + "symfony/deprecation-contracts": "^3.2" + }, + "require-dev": { + "ekino/phpstan-banned-code": "^1.0", + "infection/infection": "^0.26|^0.27|^0.28|^0.29", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5.26|^10.0|^11.0", + "qossmic/deptrac-shim": "^1.0", + "rector/rector": "^1.0", + "symfony/phpunit-bridge": "^6.1|^7.0", + "symplify/easy-coding-standard": "^12.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "OTPHP\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" + }, + { + "name": "All contributors", + "homepage": "https://github.com/Spomky-Labs/otphp/contributors" + } + ], + "description": "A PHP library for generating one time passwords according to RFC 4226 (HOTP Algorithm) and the RFC 6238 (TOTP Algorithm) and compatible with Google Authenticator", + "homepage": "https://github.com/Spomky-Labs/otphp", + "keywords": [ + "FreeOTP", + "RFC 4226", + "RFC 6238", + "google authenticator", + "hotp", + "otp", + "totp" + ], + "support": { + "issues": "https://github.com/Spomky-Labs/otphp/issues", + "source": "https://github.com/Spomky-Labs/otphp/tree/11.3.0" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2024-06-12T11:22:32+00:00" + }, + { + "name": "spomky-labs/pki-framework", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/Spomky-Labs/pki-framework.git", + "reference": "0b10c8b53366729417d6226ae89a665f9e2d61b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Spomky-Labs/pki-framework/zipball/0b10c8b53366729417d6226ae89a665f9e2d61b6", + "reference": "0b10c8b53366729417d6226ae89a665f9e2d61b6", + "shasum": "" + }, + "require": { + "brick/math": "^0.10|^0.11|^0.12", + "ext-mbstring": "*", + "php": ">=8.1" + }, + "require-dev": { + "ekino/phpstan-banned-code": "^1.0", + "ext-gmp": "*", + "ext-openssl": "*", + "infection/infection": "^0.28", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-beberlei-assert": "^1.0", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.3", + "phpunit/phpunit": "^10.1|^11.0", + "rector/rector": "^1.0", + "roave/security-advisories": "dev-latest", + "symfony/phpunit-bridge": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symplify/easy-coding-standard": "^12.0" + }, + "suggest": { + "ext-bcmath": "For better performance (or GMP)", + "ext-gmp": "For better performance (or BCMath)", + "ext-openssl": "For OpenSSL based cyphering" + }, + "type": "library", + "autoload": { + "psr-4": { + "SpomkyLabs\\Pki\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joni Eskelinen", + "email": "jonieske@gmail.com", + "role": "Original developer" + }, + { + "name": "Florent Morselli", + "email": "florent.morselli@spomky-labs.com", + "role": "Spomky-Labs PKI Framework developer" + } + ], + "description": "A PHP framework for managing Public Key Infrastructures. It comprises X.509 public key certificates, attribute certificates, certification requests and certification path validation.", + "homepage": "https://github.com/spomky-labs/pki-framework", + "keywords": [ + "DER", + "Private Key", + "ac", + "algorithm identifier", + "asn.1", + "asn1", + "attribute certificate", + "certificate", + "certification request", + "cryptography", + "csr", + "decrypt", + "ec", + "encrypt", + "pem", + "pkcs", + "public key", + "rsa", + "sign", + "signature", + "verify", + "x.509", + "x.690", + "x509", + "x690" + ], + "support": { + "issues": "https://github.com/Spomky-Labs/pki-framework/issues", + "source": "https://github.com/Spomky-Labs/pki-framework/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2024-03-30T18:03:49+00:00" + }, + { + "name": "symfony/config", + "version": "v6.4.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "4e55e7e4ffddd343671ea972216d4509f46c22ef" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/4e55e7e4ffddd343671ea972216d4509f46c22ef", + "reference": "4e55e7e4ffddd343671ea972216d4509f46c22ef", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "require-dev": { + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v6.4.14" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-04T11:33:53+00:00" + }, + { + "name": "symfony/console", + "version": "v6.4.15", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", + "reference": "f1fc6f47283e27336e7cebb9e8946c8de7bff9bd", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/string": "^5.4|^6.0|^7.0" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/lock": "^5.4|^6.0|^7.0", + "symfony/messenger": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0", + "symfony/stopwatch": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command-line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v6.4.15" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-06T14:19:14+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "cb23e97813c5837a041b73a6d63a9ddff0778f5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/cb23e97813c5837a041b73a6d63a9ddff0778f5e", + "reference": "cb23e97813c5837a041b73a6d63a9ddff0778f5e", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:18:03+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v6.4.16", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "7a379d8871f6a36f01559c14e11141cc02eb8dc8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/7a379d8871f6a36f01559c14e11141cc02eb8dc8", + "reference": "7a379d8871f6a36f01559c14e11141cc02eb8dc8", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.2.10|^7.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.1", + "symfony/finder": "<5.4", + "symfony/proxy-manager-bridge": "<6.3", + "symfony/yaml": "<5.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^6.1|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v6.4.16" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-25T14:52:46+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "672b3dd1ef8b87119b446d67c58c106c43f965fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/672b3dd1ef8b87119b446d67c58c106c43f965fe", + "reference": "672b3dd1ef8b87119b446d67c58c106c43f965fe", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-05T15:35:02+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "reference": "0ffc48080ab3e9132ea74ef4e09d8dcf26bf897e", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-foundation": "^5.4|^6.0|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:18:03+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", + "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/4856c9cf585d5a0313d8d35afd681a526f038dd3", + "reference": "4856c9cf585d5a0313d8d35afd681a526f038dd3", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^5.4|^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:07:50+00:00" + }, + { + "name": "symfony/finder", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "reference": "daea9eca0b08d0ed1dc9ab702a46128fd1be4958", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-01T08:30:56+00:00" + }, + { + "name": "symfony/http-client", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "955e43336aff03df1e8a8e17daefabb0127a313b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/955e43336aff03df1e8a8e17daefabb0127a313b", + "reference": "955e43336aff03df1e8a8e17daefabb0127a313b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "~3.4.3|^3.5.1", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "amphp/amp": "<2.5", + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/http-client": "^4.2.1|^5.0", + "amphp/http-tunnel": "^1.0|^2.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/amphp-http-client-meta": "^1.0|^2.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-29T08:22:02+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "c2f3ad828596624ca39ea40f83617ef51ca8bbf9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/c2f3ad828596624ca39ea40f83617ef51ca8bbf9", + "reference": "c2f3ad828596624ca39ea40f83617ef51ca8bbf9", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-25T12:02:18+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v6.4.16", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/431771b7a6f662f1575b3cfc8fd7617aa9864d57", + "reference": "431771b7a6f662f1575b3cfc8fd7617aa9864d57", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "symfony/cache": "<6.4.12|>=7.0,<7.1.5" + }, + "require-dev": { + "doctrine/dbal": "^2.13.1|^3|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4.12|^7.1.5", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/expression-language": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4|^7.0", + "symfony/mime": "^5.4|^6.0|^7.0", + "symfony/rate-limiter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v6.4.16" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-13T18:58:10+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d", + "reference": "6b4722a25e0aed1ccb4914b9bcbd493cc4676b4d", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.12" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-29T08:42:40+00:00" + }, + { + "name": "symfony/intl", + "version": "v6.4.15", + "source": { + "type": "git", + "url": "https://github.com/symfony/intl.git", + "reference": "b1d5e8d82615b60f229216edfee0b59e2ef66da6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/intl/zipball/b1d5e8d82615b60f229216edfee0b59e2ef66da6", + "reference": "b1d5e8d82615b60f229216edfee0b59e2ef66da6", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "require-dev": { + "symfony/filesystem": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Intl\\": "" + }, + "exclude-from-classmap": [ + "/Tests/", + "/Resources/data/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + }, + { + "name": "Eriksen Costa", + "email": "eriksen.costa@infranology.com.br" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides access to the localization data of the ICU library", + "homepage": "https://symfony.com", + "keywords": [ + "i18n", + "icu", + "internationalization", + "intl", + "l10n", + "localization" + ], + "support": { + "source": "https://github.com/symfony/intl/tree/v6.4.15" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-08T15:28:48+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/a3cc8b044a6ea513310cbd48ef7333b384945638", + "reference": "a3cc8b044a6ea513310cbd48ef7333b384945638", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", + "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "symfony/polyfill-intl-normalizer": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", + "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "reference": "0f68c03565dcaaf25a890667542e8bd75fe7e5bb", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "reference": "4a4cfc2d253c21a5ad0e53071df248ed48c6ce5c", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/2fb86d65e2d424369ad2905e83b236a8805ba491", + "reference": "2fb86d65e2d424369ad2905e83b236a8805ba491", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/process", + "version": "v6.4.15", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/3cb242f059c14ae08591c5c4087d1fe443564392", + "reference": "3cb242f059c14ae08591c5c4087d1fe443564392", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v6.4.15" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-06T14:19:14+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:20:29+00:00" + }, + { + "name": "symfony/string", + "version": "v6.4.15", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "reference": "73a5e66ea2e1677c98d4449177c5a9cf9d8b4c6f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/intl": "^6.2|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.4.15" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-13T13:31:12+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c6a22929407dec8765d6e2b6ff85b800b245879c", + "reference": "c6a22929407dec8765d6e2b6ff85b800b245879c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.12" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-08T15:48:14+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "0f605f72a363f8743001038a176eeb2a11223b51" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f605f72a363f8743001038a176eeb2a11223b51", + "reference": "0f605f72a363f8743001038a176eeb2a11223b51", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:18:03+00:00" + }, + { + "name": "symfony/yaml", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/099581e99f557e9f16b43c5916c26380b54abb22", + "reference": "099581e99f557e9f16b43c5916c26380b54abb22", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-23T06:56:12+00:00" + }, + { + "name": "tedivm/jshrink", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/tedious/JShrink.git", + "reference": "7a35f5a4651ca2ce77295eb8a3b4e133ba47e19e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tedious/JShrink/zipball/7a35f5a4651ca2ce77295eb8a3b4e133ba47e19e", + "reference": "7a35f5a4651ca2ce77295eb8a3b4e133ba47e19e", + "shasum": "" + }, + "require": { + "php": "^7.0|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.14", + "php-coveralls/php-coveralls": "^2.5.0", + "phpunit/phpunit": "^9|^10" + }, + "type": "library", + "autoload": { + "psr-0": { + "JShrink": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Robert Hafner", + "email": "tedivm@tedivm.com" + } + ], + "description": "Javascript Minifier built in PHP", + "homepage": "http://github.com/tedious/JShrink", + "keywords": [ + "javascript", + "minifier" + ], + "support": { + "issues": "https://github.com/tedious/JShrink/issues", + "source": "https://github.com/tedious/JShrink/tree/v1.7.0" + }, + "funding": [ + { + "url": "https://github.com/tedivm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/tedivm/jshrink", + "type": "tidelift" + } + ], + "time": "2023-10-04T17:23:23+00:00" + }, + { + "name": "tubalmartin/cssmin", + "version": "v4.1.1", + "source": { + "type": "git", + "url": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port.git", + "reference": "3cbf557f4079d83a06f9c3ff9b957c022d7805cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tubalmartin/YUI-CSS-compressor-PHP-port/zipball/3cbf557f4079d83a06f9c3ff9b957c022d7805cf", + "reference": "3cbf557f4079d83a06f9c3ff9b957c022d7805cf", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "php": ">=5.3.2" + }, + "require-dev": { + "cogpowered/finediff": "0.3.*", + "phpunit/phpunit": "4.8.*" + }, + "bin": [ + "cssmin" + ], + "type": "library", + "autoload": { + "psr-4": { + "tubalmartin\\CssMin\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Túbal Martín", + "homepage": "http://tubalmartin.me/" + } + ], + "description": "A PHP port of the YUI CSS compressor", + "homepage": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port", + "keywords": [ + "compress", + "compressor", + "css", + "cssmin", + "minify", + "yui" + ], + "support": { + "issues": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port/issues", + "source": "https://github.com/tubalmartin/YUI-CSS-compressor-PHP-port" + }, + "time": "2018-01-15T15:26:51+00:00" + }, + { + "name": "web-token/jwt-framework", + "version": "3.4.6", + "source": { + "type": "git", + "url": "https://github.com/web-token/jwt-framework.git", + "reference": "1e9f8bf0c3f5c60e65c11e096832dec7a2c70cde" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/web-token/jwt-framework/zipball/1e9f8bf0c3f5c60e65c11e096832dec7a2c70cde", + "reference": "1e9f8bf0c3f5c60e65c11e096832dec7a2c70cde", + "shasum": "" + }, + "require": { + "brick/math": "^0.9|^0.10|^0.11|^0.12", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "ext-sodium": "*", + "paragonie/constant_time_encoding": "^2.6|^3.0", + "paragonie/sodium_compat": "^1.20|^2.0", + "php": ">=8.1", + "psr/cache": "^3.0", + "psr/clock": "^1.0", + "psr/event-dispatcher": "^1.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "spomky-labs/aes-key-wrap": "^7.0", + "spomky-labs/pki-framework": "^1.2.1", + "symfony/config": "^5.4|^6.0|^7.0", + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/event-dispatcher": "^5.4|^6.0|^7.0", + "symfony/http-client": "^5.4|^6.0|^7.0", + "symfony/http-kernel": "^5.4|^6.0|^7.0", + "symfony/polyfill-mbstring": "^1.12" + }, + "conflict": { + "spomky-labs/jose": "*" + }, + "replace": { + "web-token/encryption-pack": "self.version", + "web-token/jwt-bundle": "self.version", + "web-token/jwt-checker": "self.version", + "web-token/jwt-console": "self.version", + "web-token/jwt-core": "self.version", + "web-token/jwt-encryption": "self.version", + "web-token/jwt-encryption-algorithm-aescbc": "self.version", + "web-token/jwt-encryption-algorithm-aesgcm": "self.version", + "web-token/jwt-encryption-algorithm-aesgcmkw": "self.version", + "web-token/jwt-encryption-algorithm-aeskw": "self.version", + "web-token/jwt-encryption-algorithm-dir": "self.version", + "web-token/jwt-encryption-algorithm-ecdh-es": "self.version", + "web-token/jwt-encryption-algorithm-experimental": "self.version", + "web-token/jwt-encryption-algorithm-pbes2": "self.version", + "web-token/jwt-encryption-algorithm-rsa": "self.version", + "web-token/jwt-experimental": "self.version", + "web-token/jwt-key-mgmt": "self.version", + "web-token/jwt-library": "self.version", + "web-token/jwt-nested-token": "self.version", + "web-token/jwt-signature": "self.version", + "web-token/jwt-signature-algorithm-ecdsa": "self.version", + "web-token/jwt-signature-algorithm-eddsa": "self.version", + "web-token/jwt-signature-algorithm-experimental": "self.version", + "web-token/jwt-signature-algorithm-hmac": "self.version", + "web-token/jwt-signature-algorithm-none": "self.version", + "web-token/jwt-signature-algorithm-rsa": "self.version", + "web-token/jwt-signature-pack": "self.version", + "web-token/jwt-util-ecc": "self.version", + "web-token/signature-pack": "self.version" + }, + "require-dev": { + "bjeavons/zxcvbn-php": "^1.3", + "ekino/phpstan-banned-code": "^1.0", + "ext-curl": "*", + "ext-gmp": "*", + "infection/infection": "^0.29", + "matthiasnoback/symfony-config-test": "^5.0", + "nyholm/psr7": "^1.8", + "php-http/mock-client": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.3", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.3", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.4", + "phpunit/phpunit": "^10.1|^11.0", + "qossmic/deptrac": "^2.0", + "rector/rector": "^1.0", + "roave/security-advisories": "dev-latest", + "symfony/browser-kit": "^5.4|^6.0|^7.0", + "symfony/finder": "^5.4|^6.0|^7.0", + "symfony/framework-bundle": "^5.4|^6.0|^7.0", + "symfony/phpunit-bridge": "^5.4|^6.0|^7.0", + "symfony/serializer": "^5.4|^6.0|^7.0", + "symfony/var-dumper": "^5.4|^6.0|^7.0", + "symfony/yaml": "^5.4|^6.0|^7.0", + "symplify/easy-coding-standard": "^12.0" + }, + "suggest": { + "bjeavons/zxcvbn-php": "Adds key quality check for oct keys.", + "php-http/httplug": "To enable JKU/X5U support.", + "php-http/httplug-bundle": "To enable JKU/X5U support.", + "php-http/message-factory": "To enable JKU/X5U support.", + "spomky-labs/aes-key-wrap": "To enable AES Key Wrap algorithm.", + "symfony/serializer": "Use the Symfony serializer to serialize/unserialize JWS and JWE tokens.", + "symfony/var-dumper": "Used to show data on the debug toolbar." + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Jose\\": "src/", + "Jose\\Component\\": "src/Library/", + "Jose\\Experimental\\": "src/Experimental/", + "Jose\\Bundle\\JoseFramework\\": "src/Bundle/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florent Morselli", + "homepage": "https://github.com/Spomky" + }, + { + "name": "All contributors", + "homepage": "https://github.com/web-token/jwt-bundle/contributors" + } + ], + "description": "JSON Object Signing and Encryption library for PHP and Symfony Bundle.", + "homepage": "https://github.com/web-token/jwt-framework", + "keywords": [ + "JOSE", + "JWE", + "JWK", + "JWKSet", + "JWS", + "Jot", + "RFC7515", + "RFC7516", + "RFC7517", + "RFC7518", + "RFC7519", + "RFC7520", + "bundle", + "jwa", + "jwt", + "symfony" + ], + "support": { + "issues": "https://github.com/web-token/jwt-framework/issues", + "source": "https://github.com/web-token/jwt-framework/tree/3.4.6" + }, + "funding": [ + { + "url": "https://github.com/Spomky", + "type": "github" + }, + { + "url": "https://www.patreon.com/FlorentMorselli", + "type": "patreon" + } + ], + "time": "2024-07-02T16:35:11+00:00" + }, + { + "name": "webimpress/safe-writer", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/webimpress/safe-writer.git", + "reference": "9d37cc8bee20f7cb2f58f6e23e05097eab5072e6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webimpress/safe-writer/zipball/9d37cc8bee20f7cb2f58f6e23e05097eab5072e6", + "reference": "9d37cc8bee20f7cb2f58f6e23e05097eab5072e6", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.4", + "vimeo/psalm": "^4.7", + "webimpress/coding-standard": "^1.2.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev", + "dev-develop": "2.3.x-dev", + "dev-release-1.0": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Webimpress\\SafeWriter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "description": "Tool to write files safely, to avoid race conditions", + "keywords": [ + "concurrent write", + "file writer", + "race condition", + "safe writer", + "webimpress" + ], + "support": { + "issues": "https://github.com/webimpress/safe-writer/issues", + "source": "https://github.com/webimpress/safe-writer/tree/2.2.0" + }, + "funding": [ + { + "url": "https://github.com/michalbundyra", + "type": "github" + } + ], + "time": "2021-04-19T16:34:45+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + }, + { + "name": "webonyx/graphql-php", + "version": "v15.18.1", + "source": { + "type": "git", + "url": "https://github.com/webonyx/graphql-php.git", + "reference": "a167afab66d8aa74b7f552759c0bbd906afb4134" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webonyx/graphql-php/zipball/a167afab66d8aa74b7f552759c0bbd906afb4134", + "reference": "a167afab66d8aa74b7f552759c0bbd906afb4134", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "php": "^7.4 || ^8" + }, + "require-dev": { + "amphp/amp": "^2.6", + "amphp/http-server": "^2.1", + "dms/phpunit-arraysubset-asserts": "dev-master", + "ergebnis/composer-normalize": "^2.28", + "friendsofphp/php-cs-fixer": "3.64.0", + "mll-lab/php-cs-fixer-config": "^5.9.2", + "nyholm/psr7": "^1.5", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "1.12.10", + "phpstan/phpstan-phpunit": "1.4.1", + "phpstan/phpstan-strict-rules": "1.6.1", + "phpunit/phpunit": "^9.5 || ^10.5.21 || ^11", + "psr/http-message": "^1 || ^2", + "react/http": "^1.6", + "react/promise": "^2.0 || ^3.0", + "rector/rector": "^1.0", + "symfony/polyfill-php81": "^1.23", + "symfony/var-exporter": "^5 || ^6 || ^7", + "thecodingmachine/safe": "^1.3 || ^2" + }, + "suggest": { + "amphp/http-server": "To leverage async resolving with webserver on AMPHP platform", + "psr/http-message": "To use standard GraphQL server", + "react/promise": "To leverage async resolving on React PHP platform" + }, + "type": "library", + "autoload": { + "psr-4": { + "GraphQL\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP port of GraphQL reference implementation", + "homepage": "https://github.com/webonyx/graphql-php", + "keywords": [ + "api", + "graphql" + ], + "support": { + "issues": "https://github.com/webonyx/graphql-php/issues", + "source": "https://github.com/webonyx/graphql-php/tree/v15.18.1" + }, + "funding": [ + { + "url": "https://opencollective.com/webonyx-graphql-php", + "type": "open_collective" + } + ], + "time": "2024-11-13T16:21:54+00:00" + }, + { + "name": "wikimedia/less.php", + "version": "v3.2.1", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/less.php.git", + "reference": "0d5b30ba792bdbf8991a646fc9c30561b38a5559" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/less.php/zipball/0d5b30ba792bdbf8991a646fc9c30561b38a5559", + "reference": "0d5b30ba792bdbf8991a646fc9c30561b38a5559", + "shasum": "" + }, + "require": { + "php": ">=7.2.9" + }, + "require-dev": { + "mediawiki/mediawiki-codesniffer": "40.0.1", + "mediawiki/mediawiki-phan-config": "0.12.0", + "mediawiki/minus-x": "1.1.1", + "php-parallel-lint/php-console-highlighter": "1.0.0", + "php-parallel-lint/php-parallel-lint": "1.3.2", + "phpunit/phpunit": "^8.5" + }, + "bin": [ + "bin/lessc" + ], + "type": "library", + "autoload": { + "psr-0": { + "Less": "lib/" + }, + "classmap": [ + "lessc.inc.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Timo Tijhof", + "homepage": "https://timotijhof.net" + }, + { + "name": "Josh Schmidt", + "homepage": "https://github.com/oyejorge" + }, + { + "name": "Matt Agar", + "homepage": "https://github.com/agar" + }, + { + "name": "Martin Jantošovič", + "homepage": "https://github.com/Mordred" + } + ], + "description": "PHP port of the LESS processor", + "homepage": "https://gerrit.wikimedia.org/g/mediawiki/libs/less.php", + "keywords": [ + "css", + "less", + "less.js", + "lesscss", + "php", + "stylesheet" + ], + "support": { + "issues": "https://github.com/wikimedia/less.php/issues", + "source": "https://github.com/wikimedia/less.php/tree/v3.2.1" + }, + "time": "2023-02-03T06:43:41+00:00" + } + ], + "packages-dev": [ + { + "name": "allure-framework/allure-codeception", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/allure-framework/allure-codeception.git", + "reference": "854320894b5e65952eb0cafd1555e9efb4543350" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/allure-framework/allure-codeception/zipball/854320894b5e65952eb0cafd1555e9efb4543350", + "reference": "854320894b5e65952eb0cafd1555e9efb4543350", + "shasum": "" + }, + "require": { + "allure-framework/allure-php-commons": "^2.3.1", + "codeception/codeception": "^5.0.3", + "ext-json": "*", + "php": "^8" + }, + "require-dev": { + "psalm/plugin-phpunit": "^0.19.0", + "remorhaz/php-json-data": "^0.5.3", + "remorhaz/php-json-path": "^0.7.7", + "squizlabs/php_codesniffer": "^3.7.2", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Qameta\\Allure\\Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Ivan Krutov", + "email": "vania-pooh@aerokube.com", + "role": "Developer" + }, + { + "name": "Edward Surov", + "email": "zoohie@gmail.com", + "role": "Developer" + } + ], + "description": "Allure Codeception integration", + "homepage": "https://allurereport.org/", + "keywords": [ + "allure", + "attachments", + "cases", + "codeception", + "report", + "steps", + "testing" + ], + "support": { + "email": "allure@qameta.io", + "issues": "https://github.com/allure-framework/allure-codeception/issues", + "source": "https://github.com/allure-framework/allure-codeception" + }, + "time": "2024-05-28T09:54:01+00:00" + }, + { + "name": "allure-framework/allure-php-commons", + "version": "v2.3.1", + "source": { + "type": "git", + "url": "https://github.com/allure-framework/allure-php-commons2.git", + "reference": "5d7ed5ab510339652163ca1473eb499d4b7ec488" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/allure-framework/allure-php-commons2/zipball/5d7ed5ab510339652163ca1473eb499d4b7ec488", + "reference": "5d7ed5ab510339652163ca1473eb499d4b7ec488", + "shasum": "" + }, + "require": { + "doctrine/annotations": "^1.12 || ^2", + "ext-json": "*", + "php": "^8", + "psr/log": "^1 || ^2 || ^3", + "ramsey/uuid": "^3 || ^4" + }, + "conflict": { + "amphp/byte-stream": "<1.5.1" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1", + "phpunit/phpunit": "^9.6.8", + "psalm/plugin-phpunit": "^0.18.4", + "squizlabs/php_codesniffer": "^3.7.2", + "vimeo/psalm": "^5.12" + }, + "type": "library", + "autoload": { + "psr-4": { + "Qameta\\Allure\\": "src", + "Yandex\\Allure\\Adapter\\": "src/Legacy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Dmitry Baev", + "email": "baev.dm@gmail.com", + "role": "Developer" + }, + { + "name": "Edward Surov", + "email": "zoohie@gmail.com", + "role": "Developer" + } + ], + "description": "Allure PHP commons", + "homepage": "http://allure.qatools.ru/", + "keywords": [ + "allure", + "commons", + "php", + "report", + "testing" + ], + "support": { + "email": "allure@qameta.io", + "issues": "https://github.com/allure-framework/allure-php-commons2/issues", + "source": "https://github.com/allure-framework/allure-php-commons" + }, + "time": "2023-05-30T10:55:43+00:00" + }, + { + "name": "allure-framework/allure-phpunit", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/allure-framework/allure-phpunit.git", + "reference": "a08e0092cdddfc8ead1953cf5bddf80b48595109" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/allure-framework/allure-phpunit/zipball/a08e0092cdddfc8ead1953cf5bddf80b48595109", + "reference": "a08e0092cdddfc8ead1953cf5bddf80b48595109", + "shasum": "" + }, + "require": { + "allure-framework/allure-php-commons": "^2", + "php": "^8", + "phpunit/phpunit": "^9" + }, + "conflict": { + "amphp/byte-stream": "<1.5.1" + }, + "require-dev": { + "brianium/paratest": "^6.8", + "psalm/plugin-phpunit": "^0.18.4", + "squizlabs/php_codesniffer": "^3.7.1", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Qameta\\Allure\\PHPUnit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Ivan Krutov", + "email": "vania-pooh@yandex-team.ru", + "role": "Developer" + }, + { + "name": "Edward Surov", + "email": "zoohie@gmail.com", + "role": "Developer" + } + ], + "description": "Allure PHPUnit integration", + "homepage": "http://allure.qatools.ru/", + "keywords": [ + "allure", + "attachments", + "cases", + "phpunit", + "report", + "steps", + "testing" + ], + "support": { + "email": "allure@qameta.io", + "issues": "https://github.com/allure-framework/allure-phpunit/issues", + "source": "https://github.com/allure-framework/allure-phpunit" + }, + "time": "2023-01-12T14:27:20+00:00" + }, + { + "name": "behat/gherkin", + "version": "v4.10.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6", + "reference": "cbb83c4c435dd8d05a161f2a5ae322e61b2f4db6", + "shasum": "" + }, + "require": { + "php": "~7.2|~8.0" + }, + "require-dev": { + "cucumber/cucumber": "dev-gherkin-24.1.0", + "phpunit/phpunit": "~8|~9", + "symfony/yaml": "~3|~4|~5|~6|~7" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.10.0" + }, + "time": "2024-10-19T14:46:06+00:00" + }, + { + "name": "clue/ndjson-react", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/clue/reactphp-ndjson.git", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/clue/reactphp-ndjson/zipball/392dc165fce93b5bb5c637b67e59619223c931b0", + "reference": "392dc165fce93b5bb5c637b67e59619223c931b0", + "shasum": "" + }, + "require": { + "php": ">=5.3", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35", + "react/event-loop": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Clue\\React\\NDJson\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering" + } + ], + "description": "Streaming newline-delimited JSON (NDJSON) parser and encoder for ReactPHP.", + "homepage": "https://github.com/clue/reactphp-ndjson", + "keywords": [ + "NDJSON", + "json", + "jsonlines", + "newline", + "reactphp", + "streaming" + ], + "support": { + "issues": "https://github.com/clue/reactphp-ndjson/issues", + "source": "https://github.com/clue/reactphp-ndjson/tree/v1.3.0" + }, + "funding": [ + { + "url": "https://clue.engineering/support", + "type": "custom" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-12-23T10:58:28+00:00" + }, + { + "name": "codeception/codeception", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374", + "reference": "3b2d7d1a88e7e1d9dc0acb6d3c8f0acda0a37374", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.6.2", + "codeception/lib-asserts": "^2.0", + "codeception/stub": "^4.1", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "phpunit/php-code-coverage": "^9.2 || ^10.0 || ^11.0", + "phpunit/php-text-template": "^2.0 || ^3.0 || ^4.0", + "phpunit/php-timer": "^5.0.3 || ^6.0 || ^7.0", + "phpunit/phpunit": "^9.5.20 || ^10.0 || ^11.0", + "psy/psysh": "^0.11.2 || ^0.12", + "sebastian/comparator": "^4.0.5 || ^5.0 || ^6.0", + "sebastian/diff": "^4.0.3 || ^5.0 || ^6.0", + "symfony/console": ">=4.4.24 <8.0", + "symfony/css-selector": ">=4.4.24 <8.0", + "symfony/event-dispatcher": ">=4.4.24 <8.0", + "symfony/finder": ">=4.4.24 <8.0", + "symfony/var-dumper": ">=4.4.24 <8.0", + "symfony/yaml": ">=4.4.24 <8.0" + }, + "conflict": { + "codeception/lib-innerbrowser": "<3.1.3", + "codeception/module-filesystem": "<3.0", + "codeception/module-phpbrowser": "<2.5" + }, + "replace": { + "codeception/phpunit-wrapper": "*" + }, + "require-dev": { + "codeception/lib-innerbrowser": "*@dev", + "codeception/lib-web": "^1.0", + "codeception/module-asserts": "*@dev", + "codeception/module-cli": "*@dev", + "codeception/module-db": "*@dev", + "codeception/module-filesystem": "*@dev", + "codeception/module-phpbrowser": "*@dev", + "codeception/util-universalframework": "*@dev", + "ext-simplexml": "*", + "jetbrains/phpstorm-attributes": "^1.0", + "symfony/dotenv": ">=4.4.24 <8.0", + "symfony/process": ">=4.4.24 <8.0", + "vlucas/phpdotenv": "^5.1" + }, + "suggest": { + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "ext-simplexml": "For loading params from XML files", + "stecman/symfony-console-completion": "For BASH autocompletion", + "symfony/dotenv": "For loading params from .env files", + "symfony/phpunit-bridge": "For phpunit-bridge support", + "vlucas/phpdotenv": "For loading params from .env files" + }, + "bin": [ + "codecept" + ], + "type": "library", + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Codeception\\": "src/Codeception", + "Codeception\\Extension\\": "ext" + }, + "classmap": [ + "src/PHPUnit/TestCase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert.ua@gmail.com", + "homepage": "https://codeception.com" + } + ], + "description": "BDD-style testing framework", + "homepage": "https://codeception.com/", + "keywords": [ + "BDD", + "TDD", + "acceptance testing", + "functional testing", + "unit testing" + ], + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/5.1.2" + }, + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], + "time": "2024-03-07T07:19:42+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "b8c7dff552249e560879c682ba44a4b963af91bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/b8c7dff552249e560879c682ba44a4b963af91bc", + "reference": "b8c7dff552249e560879c682ba44a4b963af91bc", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": "^7.7.1 | ^8.0.3 | ^9.0", + "ext-dom": "*", + "php": "^7.4 | ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-asserts/issues", + "source": "https://github.com/Codeception/lib-asserts/tree/2.1.0" + }, + "time": "2023-02-10T18:36:23+00:00" + }, + { + "name": "codeception/lib-web", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-web.git", + "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-web/zipball/01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", + "reference": "01ff7f9ed8760ba0b0805a0b3a843b4e74165a60", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "guzzlehttp/psr7": "^2.0", + "php": "^8.0", + "phpunit/phpunit": "^9.5 | ^10.0 | ^11.0", + "symfony/css-selector": ">=4.4.24 <8.0" + }, + "conflict": { + "codeception/codeception": "<5.0.0-alpha3" + }, + "require-dev": { + "php-webdriver/webdriver": "^1.12" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gintautas Miselis" + } + ], + "description": "Library containing files used by module-webdriver and lib-innerbrowser or module-phpbrowser", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-web/issues", + "source": "https://github.com/Codeception/lib-web/tree/1.0.6" + }, + "time": "2024-02-06T20:50:08+00:00" + }, + { + "name": "codeception/module-asserts", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-asserts.git", + "reference": "1b6b150b30586c3614e7e5761b31834ed7968603" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/1b6b150b30586c3614e7e5761b31834ed7968603", + "reference": "1b6b150b30586c3614e7e5761b31834ed7968603", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-asserts": "^2.0", + "php": "^8.0" + }, + "conflict": { + "codeception/codeception": "<5.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Codeception module containing various assertions", + "homepage": "https://codeception.com/", + "keywords": [ + "assertions", + "asserts", + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-asserts/issues", + "source": "https://github.com/Codeception/module-asserts/tree/3.0.0" + }, + "time": "2022-02-16T19:48:08+00:00" + }, + { + "name": "codeception/module-sequence", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-sequence.git", + "reference": "9738e2eb06035a0975171a0aa3fce00d284b4dfb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-sequence/zipball/9738e2eb06035a0975171a0aa3fce00d284b4dfb", + "reference": "9738e2eb06035a0975171a0aa3fce00d284b4dfb", + "shasum": "" + }, + "require": { + "codeception/codeception": "^5.0", + "php": "^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/Codeception/Util/sq.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + } + ], + "description": "Sequence module for Codeception", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-sequence/issues", + "source": "https://github.com/Codeception/module-sequence/tree/3.0.0" + }, + "time": "2022-05-31T05:45:36+00:00" + }, + { + "name": "codeception/module-webdriver", + "version": "3.2.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-webdriver.git", + "reference": "06fe128460a313e171bfef894882c7c880aef6b8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-webdriver/zipball/06fe128460a313e171bfef894882c7c880aef6b8", + "reference": "06fe128460a313e171bfef894882c7c880aef6b8", + "shasum": "" + }, + "require": { + "codeception/codeception": "^5.0.0", + "codeception/lib-web": "^1.0.1", + "codeception/stub": "^4.0", + "ext-json": "*", + "ext-mbstring": "*", + "php": "^8.0", + "php-webdriver/webdriver": "^1.14.0", + "phpunit/phpunit": "^9.5" + }, + "suggest": { + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Zaahid Bateson" + } + ], + "description": "WebDriver module for Codeception", + "homepage": "https://codeception.com/", + "keywords": [ + "acceptance-testing", + "browser-testing", + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-webdriver/issues", + "source": "https://github.com/Codeception/module-webdriver/tree/3.2.2" + }, + "time": "2024-02-16T13:09:30+00:00" + }, + { + "name": "codeception/stub", + "version": "4.1.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/4fcad2c165f365377486dc3fd8703b07f1f2fcae", + "reference": "4fcad2c165f365377486dc3fd8703b07f1f2fcae", + "shasum": "" + }, + "require": { + "php": "^7.4 | ^8.0", + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | ^11" + }, + "conflict": { + "codeception/codeception": "<5.0.6" + }, + "require-dev": { + "consolidation/robo": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "support": { + "issues": "https://github.com/Codeception/Stub/issues", + "source": "https://github.com/Codeception/Stub/tree/4.1.3" + }, + "time": "2024-02-02T19:21:00+00:00" + }, + { + "name": "csharpru/vault-php", + "version": "4.4.0", + "source": { + "type": "git", + "url": "https://github.com/CSharpRU/vault-php.git", + "reference": "ba4cbd7b55f1ce10bc72a7e4c36cfd87a42d3573" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/CSharpRU/vault-php/zipball/ba4cbd7b55f1ce10bc72a7e4c36cfd87a42d3573", + "reference": "ba4cbd7b55f1ce10bc72a7e4c36cfd87a42d3573", + "shasum": "" + }, + "require": { + "aws/aws-sdk-php": "^3.0", + "ext-json": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1.0|^2.0|^3.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/log": "^1.0|^2.0|^3.0" + }, + "require-dev": { + "alextartan/guzzle-psr18-adapter": "^1.2 || ^2.0", + "cache/array-adapter": "^1.0", + "codeception/codeception": "^4.1", + "codeception/module-asserts": "^1.3", + "laminas/laminas-diactoros": "^2.3", + "php-vcr/php-vcr": "^1.5", + "symfony/event-dispatcher": "<5.0" + }, + "suggest": { + "cache/array-adapter": "For usage with CachedClient class" + }, + "type": "library", + "autoload": { + "psr-4": { + "Vault\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Yaroslav Lukyanov", + "email": "c_sharp@mail.ru" + } + ], + "description": "Best Vault client for PHP that you can find", + "keywords": [ + "hashicorp", + "secrets", + "vault" + ], + "support": { + "issues": "https://github.com/CSharpRU/vault-php/issues", + "source": "https://github.com/CSharpRU/vault-php/tree/4.4.0" + }, + "time": "2023-11-22T11:38:41+00:00" + }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/composer-installer.git", + "reference": "4be43904336affa5c2f70744a348312336afd0da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da", + "reference": "4be43904336affa5c2f70744a348312336afd0da", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "ext-json": "*", + "ext-zip": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "composer-plugin", + "extra": { + "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/composer-installer/issues", + "source": "https://github.com/PHPCSStandards/composer-installer" + }, + "time": "2023-01-05T11:28:13+00:00" + }, + { + "name": "dg/bypass-finals", + "version": "v1.8.0", + "source": { + "type": "git", + "url": "https://github.com/dg/bypass-finals.git", + "reference": "86b00f0d900c7e15d3341e687e0df89e8c2d4632" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dg/bypass-finals/zipball/86b00f0d900c7e15d3341e687e0df89e8c2d4632", + "reference": "86b00f0d900c7e15d3341e687e0df89e8c2d4632", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "require-dev": { + "nette/tester": "^2.3", + "phpstan/phpstan": "^0.12" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + } + ], + "description": "Removes final keyword from source code on-the-fly and allows mocking of final methods and classes", + "keywords": [ + "finals", + "mocking", + "phpunit", + "testing", + "unit" + ], + "support": { + "issues": "https://github.com/dg/bypass-finals/issues", + "source": "https://github.com/dg/bypass-finals/tree/v1.8.0" + }, + "time": "2024-07-02T22:24:43+00:00" + }, + { + "name": "doctrine/annotations", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/doctrine/annotations.git", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/annotations/zipball/901c2ee5d26eb64ff43c47976e114bf00843acf7", + "reference": "901c2ee5d26eb64ff43c47976e114bf00843acf7", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^2 || ^3", + "ext-tokenizer": "*", + "php": "^7.2 || ^8.0", + "psr/cache": "^1 || ^2 || ^3" + }, + "require-dev": { + "doctrine/cache": "^2.0", + "doctrine/coding-standard": "^10", + "phpstan/phpstan": "^1.10.28", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "symfony/cache": "^5.4 || ^6.4 || ^7", + "vimeo/psalm": "^4.30 || ^5.14" + }, + "suggest": { + "php": "PHP 8.0 or higher comes with attributes, a native replacement for annotations" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "Docblock Annotations Parser", + "homepage": "https://www.doctrine-project.org/projects/annotations.html", + "keywords": [ + "annotations", + "docblock", + "parser" + ], + "support": { + "issues": "https://github.com/doctrine/annotations/issues", + "source": "https://github.com/doctrine/annotations/tree/2.0.2" + }, + "time": "2024-09-05T10:17:24+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "doctrine/lexer", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "reference": "31ad66abc0fc9e1a1f2d9bc6a42668d2fbbcd6dd", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^12", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.5", + "psalm/plugin-phpunit": "^0.18.3", + "vimeo/psalm": "^5.21" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/3.0.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2024-02-05T11:56:58+00:00" + }, + { + "name": "evenement/evenement", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement.git", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/igorw/evenement/zipball/0a16b0d71ab13284339abb99d9d2bd813640efbc", + "reference": "0a16b0d71ab13284339abb99d9d2bd813640efbc", + "shasum": "" + }, + "require": { + "php": ">=7.0" + }, + "require-dev": { + "phpunit/phpunit": "^9 || ^6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Evenement\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + } + ], + "description": "Événement is a very simple event dispatching library for PHP", + "keywords": [ + "event-dispatcher", + "event-emitter" + ], + "support": { + "issues": "https://github.com/igorw/evenement/issues", + "source": "https://github.com/igorw/evenement/tree/v3.0.2" + }, + "time": "2023-08-08T05:53:35+00:00" + }, + { + "name": "fidry/cpu-core-counter", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/theofidry/cpu-core-counter.git", + "reference": "8520451a140d3f46ac33042715115e290cf5785f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f", + "reference": "8520451a140d3f46ac33042715115e290cf5785f", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "fidry/makefile": "^0.2.0", + "fidry/php-cs-fixer-config": "^1.1.2", + "phpstan/extension-installer": "^1.2.0", + "phpstan/phpstan": "^1.9.2", + "phpstan/phpstan-deprecation-rules": "^1.0.0", + "phpstan/phpstan-phpunit": "^1.2.2", + "phpstan/phpstan-strict-rules": "^1.4.4", + "phpunit/phpunit": "^8.5.31 || ^9.5.26", + "webmozarts/strict-phpunit": "^7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Fidry\\CpuCoreCounter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Théo FIDRY", + "email": "theo.fidry@gmail.com" + } + ], + "description": "Tiny utility to get the number of CPU cores.", + "keywords": [ + "CPU", + "core" + ], + "support": { + "issues": "https://github.com/theofidry/cpu-core-counter/issues", + "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/theofidry", + "type": "github" + } + ], + "time": "2024-08-06T10:04:20+00:00" + }, + { + "name": "friendsofphp/php-cs-fixer", + "version": "v3.65.0", + "source": { + "type": "git", + "url": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer.git", + "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHP-CS-Fixer/PHP-CS-Fixer/zipball/79d4f3e77b250a7d8043d76c6af8f0695e8a469f", + "reference": "79d4f3e77b250a7d8043d76c6af8f0695e8a469f", + "shasum": "" + }, + "require": { + "clue/ndjson-react": "^1.0", + "composer/semver": "^3.4", + "composer/xdebug-handler": "^3.0.3", + "ext-filter": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "fidry/cpu-core-counter": "^1.2", + "php": "^7.4 || ^8.0", + "react/child-process": "^0.6.5", + "react/event-loop": "^1.0", + "react/promise": "^2.0 || ^3.0", + "react/socket": "^1.0", + "react/stream": "^1.0", + "sebastian/diff": "^4.0 || ^5.0 || ^6.0", + "symfony/console": "^5.4 || ^6.0 || ^7.0", + "symfony/event-dispatcher": "^5.4 || ^6.0 || ^7.0", + "symfony/filesystem": "^5.4 || ^6.0 || ^7.0", + "symfony/finder": "^5.4 || ^6.0 || ^7.0", + "symfony/options-resolver": "^5.4 || ^6.0 || ^7.0", + "symfony/polyfill-mbstring": "^1.28", + "symfony/polyfill-php80": "^1.28", + "symfony/polyfill-php81": "^1.28", + "symfony/process": "^5.4 || ^6.0 || ^7.0", + "symfony/stopwatch": "^5.4 || ^6.0 || ^7.0" + }, + "require-dev": { + "facile-it/paraunit": "^1.3.1 || ^2.4", + "infection/infection": "^0.29.8", + "justinrainbow/json-schema": "^5.3 || ^6.0", + "keradus/cli-executor": "^2.1", + "mikey179/vfsstream": "^1.6.12", + "php-coveralls/php-coveralls": "^2.7", + "php-cs-fixer/accessible-object": "^1.1", + "php-cs-fixer/phpunit-constraint-isidenticalstring": "^1.5", + "php-cs-fixer/phpunit-constraint-xmlmatchesxsd": "^1.5", + "phpunit/phpunit": "^9.6.21 || ^10.5.38 || ^11.4.3", + "symfony/var-dumper": "^5.4.47 || ^6.4.15 || ^7.1.8", + "symfony/yaml": "^5.4.45 || ^6.4.13 || ^7.1.6" + }, + "suggest": { + "ext-dom": "For handling output formats in XML", + "ext-mbstring": "For handling non-UTF8 characters." + }, + "bin": [ + "php-cs-fixer" + ], + "type": "application", + "autoload": { + "psr-4": { + "PhpCsFixer\\": "src/" + }, + "exclude-from-classmap": [ + "src/Fixer/Internal/*" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Dariusz Rumiński", + "email": "dariusz.ruminski@gmail.com" + } + ], + "description": "A tool to automatically fix PHP code style", + "keywords": [ + "Static code analysis", + "fixer", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/issues", + "source": "https://github.com/PHP-CS-Fixer/PHP-CS-Fixer/tree/v3.65.0" + }, + "funding": [ + { + "url": "https://github.com/keradus", + "type": "github" + } + ], + "time": "2024-11-25T00:39:24+00:00" + }, + { + "name": "laminas/laminas-diactoros", + "version": "3.5.0", + "source": { + "type": "git", + "url": "https://github.com/laminas/laminas-diactoros.git", + "reference": "143a16306602ce56b8b092a7914fef03c37f9ed2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laminas/laminas-diactoros/zipball/143a16306602ce56b8b092a7914fef03c37f9ed2", + "reference": "143a16306602ce56b8b092a7914fef03c37f9ed2", + "shasum": "" + }, + "require": { + "php": "~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0", + "psr/http-factory": "^1.1", + "psr/http-message": "^1.1 || ^2.0" + }, + "conflict": { + "amphp/amp": "<2.6.4" + }, + "provide": { + "psr/http-factory-implementation": "^1.0", + "psr/http-message-implementation": "^1.1 || ^2.0" + }, + "require-dev": { + "ext-curl": "*", + "ext-dom": "*", + "ext-gd": "*", + "ext-libxml": "*", + "http-interop/http-factory-tests": "^2.2.0", + "laminas/laminas-coding-standard": "~2.5.0", + "php-http/psr7-integration-tests": "^1.4.0", + "phpunit/phpunit": "^10.5.36", + "psalm/plugin-phpunit": "^0.19.0", + "vimeo/psalm": "^5.26.1" + }, + "type": "library", + "extra": { + "laminas": { + "config-provider": "Laminas\\Diactoros\\ConfigProvider", + "module": "Laminas\\Diactoros" + } + }, + "autoload": { + "files": [ + "src/functions/create_uploaded_file.php", + "src/functions/marshal_headers_from_sapi.php", + "src/functions/marshal_method_from_sapi.php", + "src/functions/marshal_protocol_version_from_sapi.php", + "src/functions/normalize_server.php", + "src/functions/normalize_uploaded_files.php", + "src/functions/parse_cookie_header.php" + ], + "psr-4": { + "Laminas\\Diactoros\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "PSR HTTP Message implementations", + "homepage": "https://laminas.dev", + "keywords": [ + "http", + "laminas", + "psr", + "psr-17", + "psr-7" + ], + "support": { + "chat": "https://laminas.dev/chat", + "docs": "https://docs.laminas.dev/laminas-diactoros/", + "forum": "https://discourse.laminas.dev", + "issues": "https://github.com/laminas/laminas-diactoros/issues", + "rss": "https://github.com/laminas/laminas-diactoros/releases.atom", + "source": "https://github.com/laminas/laminas-diactoros" + }, + "funding": [ + { + "url": "https://funding.communitybridge.org/projects/laminas-project", + "type": "community_bridge" + } + ], + "time": "2024-10-14T11:59:49+00:00" + }, + { + "name": "lusitanian/oauth", + "version": "v0.8.11", + "source": { + "type": "git", + "url": "https://github.com/Lusitanian/PHPoAuthLib.git", + "reference": "fc11a53db4b66da555a6a11fce294f574a8374f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Lusitanian/PHPoAuthLib/zipball/fc11a53db4b66da555a6a11fce294f574a8374f9", + "reference": "fc11a53db4b66da555a6a11fce294f574a8374f9", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*", + "predis/predis": "0.8.*@dev", + "squizlabs/php_codesniffer": "2.*", + "symfony/http-foundation": "~2.1" + }, + "suggest": { + "ext-openssl": "Allows for usage of secure connections with the stream-based HTTP client.", + "predis/predis": "Allows using the Redis storage backend.", + "symfony/http-foundation": "Allows using the Symfony Session storage backend." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.1-dev" + } + }, + "autoload": { + "psr-0": { + "OAuth": "src", + "OAuth\\Unit": "tests" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "David Desberg", + "email": "david@daviddesberg.com" + }, + { + "name": "Elliot Chance", + "email": "elliotchance@gmail.com" + }, + { + "name": "Pieter Hordijk", + "email": "info@pieterhordijk.com" + } + ], + "description": "PHP 5.3+ oAuth 1/2 Library", + "keywords": [ + "Authentication", + "authorization", + "oauth", + "security" + ], + "support": { + "issues": "https://github.com/Lusitanian/PHPoAuthLib/issues", + "source": "https://github.com/Lusitanian/PHPoAuthLib/tree/master" + }, + "time": "2018-02-14T22:37:14+00:00" + }, + { + "name": "magento/magento-coding-standard", + "version": "35", + "source": { + "type": "git", + "url": "https://github.com/magento/magento-coding-standard.git", + "reference": "f5cf74fb1cdd7e9fc16b2b0a31c5a5336539505e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento-coding-standard/zipball/f5cf74fb1cdd7e9fc16b2b0a31c5a5336539505e", + "reference": "f5cf74fb1cdd7e9fc16b2b0a31c5a5336539505e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-simplexml": "*", + "magento/php-compatibility-fork": "^0.1", + "php": "~8.1.0 || ~8.2.0 || ~8.3.0", + "phpcsstandards/phpcsutils": "^1.0.5", + "rector/rector": "^1.2.4", + "squizlabs/php_codesniffer": "^3.6.1", + "webonyx/graphql-php": "^15.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5.10", + "yoast/phpunit-polyfills": "^1.0" + }, + "type": "phpcodesniffer-standard", + "autoload": { + "psr-4": { + "Magento2\\": "Magento2/", + "Magento2Framework\\": "Magento2Framework/" + }, + "classmap": [ + "PHP_CodeSniffer/Tokenizers/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "OSL-3.0", + "AFL-3.0" + ], + "description": "A set of Magento specific PHP CodeSniffer rules.", + "support": { + "issues": "https://github.com/magento/magento-coding-standard/issues", + "source": "https://github.com/magento/magento-coding-standard/tree/v35" + }, + "time": "2024-10-08T16:38:49+00:00" + }, + { + "name": "magento/magento2-functional-testing-framework", + "version": "4.7.3", + "source": { + "type": "git", + "url": "https://github.com/magento/magento2-functional-testing-framework.git", + "reference": "5bc7869f902366a06d0fae58b7c569158491967e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/magento2-functional-testing-framework/zipball/5bc7869f902366a06d0fae58b7c569158491967e", + "reference": "5bc7869f902366a06d0fae58b7c569158491967e", + "shasum": "" + }, + "require": { + "allure-framework/allure-codeception": "^2.1", + "allure-framework/allure-phpunit": "^2", + "aws/aws-sdk-php": "^3.132", + "codeception/codeception": "^5.0", + "codeception/module-asserts": "^3.0", + "codeception/module-sequence": "^3.0", + "codeception/module-webdriver": "^3.0", + "composer/composer": "^1.9||^2.0,!=2.2.16", + "csharpru/vault-php": "^4.2.1", + "ext-curl": "*", + "ext-dom": "*", + "ext-iconv": "*", + "ext-intl": "*", + "ext-json": "*", + "ext-openssl": "*", + "guzzlehttp/guzzle": "^7.3.0", + "laminas/laminas-diactoros": "^3.0", + "monolog/monolog": "^2.3||^3.0", + "mustache/mustache": "~2.5", + "nikic/php-parser": "^4.4||^5.0", + "php": ">=8.1", + "php-webdriver/webdriver": "^1.14.0", + "spomky-labs/otphp": "^10.0||^11.0", + "symfony/config": "^6.4", + "symfony/console": "^5.4||^6.4", + "symfony/css-selector": "^6.4", + "symfony/dependency-injection": "^6.4", + "symfony/dotenv": "^6.4", + "symfony/event-dispatcher": "^6.4", + "symfony/filesystem": "^6.4", + "symfony/finder": "^6.4", + "symfony/http-foundation": "^6.4", + "symfony/mime": "^6.4", + "symfony/process": "^6.4", + "symfony/stopwatch": "^6.4", + "symfony/string": "^6.4", + "symfony/var-exporter": "^6.4", + "weew/helpers-array": "^1.3" + }, + "require-dev": { + "brainmaestro/composer-git-hooks": "^2.8.5", + "php-coveralls/php-coveralls": "^1.0||^2.2", + "phpmd/phpmd": "^2.8.0", + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "~3.7.0" + }, + "suggest": { + "hoa/console": "Enables action and interactive console functionality" + }, + "bin": [ + "bin/mftf" + ], + "type": "library", + "extra": { + "hooks": { + "pre-push": "bin/all-checks" + } + }, + "autoload": { + "files": [ + "src/Magento/FunctionalTestingFramework/_bootstrap.php" + ], + "psr-4": { + "MFTF\\": "dev/tests/functional/tests/MFTF", + "Magento\\FunctionalTestingFramework\\": "src/Magento/FunctionalTestingFramework" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "AGPL-3.0" + ], + "description": "Magento2 Functional Testing Framework", + "keywords": [ + "automation", + "functional", + "magento", + "testing" + ], + "support": { + "issues": "https://github.com/magento/magento2-functional-testing-framework/issues", + "source": "https://github.com/magento/magento2-functional-testing-framework/tree/4.7.3" + }, + "time": "2024-11-12T08:46:03+00:00" + }, + { + "name": "magento/php-compatibility-fork", + "version": "v0.1.0", + "source": { + "type": "git", + "url": "https://github.com/magento/PHPCompatibilityFork.git", + "reference": "1cf031c2a68e3e52e460c5690ed8d1d6d45f4653" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/magento/PHPCompatibilityFork/zipball/1cf031c2a68e3e52e460c5690ed8d1d6d45f4653", + "reference": "1cf031c2a68e3e52e460c5690ed8d1d6d45f4653", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "phpcsstandards/phpcsutils": "^1.0.5", + "squizlabs/php_codesniffer": "^3.7.1" + }, + "replace": { + "phpcompatibility/php-compatibility": "*", + "wimg/php-compatibility": "*" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcsstandards/phpcsdevcs": "^1.1.3", + "phpcsstandards/phpcsdevtools": "^1.2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4 || ^10.1.0", + "yoast/phpunit-polyfills": "^1.0.5 || ^2.0.0" + }, + "suggest": { + "roave/security-advisories": "dev-master || Helps prevent installing dependencies with known security issues." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Wim Godden", + "homepage": "https://github.com/wimg", + "role": "lead" + }, + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCompatibility/PHPCompatibility/graphs/contributors" + } + ], + "description": "A set of sniffs for PHP_CodeSniffer that checks for PHP cross-version compatibility. This is a fork of phpcompatibility/php-compatibility", + "homepage": "http://techblog.wimgodden.be/tag/codesniffer/", + "keywords": [ + "compatibility", + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", + "source": "https://github.com/PHPCompatibility/PHPCompatibility" + }, + "time": "2023-11-29T22:34:17+00:00" + }, + { + "name": "mustache/mustache", + "version": "v2.14.2", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/mustache.php.git", + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "reference": "e62b7c3849d22ec55f3ec425507bf7968193a6cb", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.11", + "phpunit/phpunit": "~3.7|~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "support": { + "issues": "https://github.com/bobthecow/mustache.php/issues", + "source": "https://github.com/bobthecow/mustache.php/tree/v2.14.2" + }, + "time": "2022-08-23T13:07:01+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/123267b2c49fbf30d78a7b2d333f6be754b94845", + "reference": "123267b2c49fbf30d78a7b2d333f6be754b94845", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-11-08T17:47:46+00:00" + }, + { + "name": "pdepend/pdepend", + "version": "2.16.2", + "source": { + "type": "git", + "url": "https://github.com/pdepend/pdepend.git", + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pdepend/pdepend/zipball/f942b208dc2a0868454d01b29f0c75bbcfc6ed58", + "reference": "f942b208dc2a0868454d01b29f0c75bbcfc6ed58", + "shasum": "" + }, + "require": { + "php": ">=5.3.7", + "symfony/config": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/dependency-injection": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/filesystem": "^2.3.0|^3|^4|^5|^6.0|^7.0", + "symfony/polyfill-mbstring": "^1.19" + }, + "require-dev": { + "easy-doc/easy-doc": "0.0.0|^1.2.3", + "gregwar/rst": "^1.0", + "squizlabs/php_codesniffer": "^2.0.0" + }, + "bin": [ + "src/bin/pdepend" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "PDepend\\": "src/main/php/PDepend" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "Official version of pdepend to be handled with Composer", + "keywords": [ + "PHP Depend", + "PHP_Depend", + "dev", + "pdepend" + ], + "support": { + "issues": "https://github.com/pdepend/pdepend/issues", + "source": "https://github.com/pdepend/pdepend/tree/2.16.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/pdepend/pdepend", + "type": "tidelift" + } + ], + "time": "2023-12-17T18:09:59+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "php-webdriver/webdriver", + "version": "1.15.2", + "source": { + "type": "git", + "url": "https://github.com/php-webdriver/php-webdriver.git", + "reference": "998e499b786805568deaf8cbf06f4044f05d91bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-webdriver/php-webdriver/zipball/998e499b786805568deaf8cbf06f4044f05d91bf", + "reference": "998e499b786805568deaf8cbf06f4044f05d91bf", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-zip": "*", + "php": "^7.3 || ^8.0", + "symfony/polyfill-mbstring": "^1.12", + "symfony/process": "^5.0 || ^6.0 || ^7.0" + }, + "replace": { + "facebook/webdriver": "*" + }, + "require-dev": { + "ergebnis/composer-normalize": "^2.20.0", + "ondram/ci-detector": "^4.0", + "php-coveralls/php-coveralls": "^2.4", + "php-mock/php-mock-phpunit": "^2.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpunit/phpunit": "^9.3", + "squizlabs/php_codesniffer": "^3.5", + "symfony/var-dumper": "^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "ext-SimpleXML": "For Firefox profile creation" + }, + "type": "library", + "autoload": { + "files": [ + "lib/Exception/TimeoutException.php" + ], + "psr-4": { + "Facebook\\WebDriver\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP client for Selenium WebDriver. Previously facebook/webdriver.", + "homepage": "https://github.com/php-webdriver/php-webdriver", + "keywords": [ + "Chromedriver", + "geckodriver", + "php", + "selenium", + "webdriver" + ], + "support": { + "issues": "https://github.com/php-webdriver/php-webdriver/issues", + "source": "https://github.com/php-webdriver/php-webdriver/tree/1.15.2" + }, + "time": "2024-11-21T15:12:59+00:00" + }, + { + "name": "phpcsstandards/phpcsutils", + "version": "1.0.12", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", + "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/87b233b00daf83fb70f40c9a28692be017ea7c6c", + "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c", + "shasum": "" + }, + "require": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.10.0 || 4.0.x-dev@dev" + }, + "require-dev": { + "ext-filter": "*", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.3.2", + "phpcsstandards/phpcsdevcs": "^1.1.6", + "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0" + }, + "type": "phpcodesniffer-standard", + "extra": { + "branch-alias": { + "dev-stable": "1.x-dev", + "dev-develop": "1.x-dev" + } + }, + "autoload": { + "classmap": [ + "PHPCSUtils/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-or-later" + ], + "authors": [ + { + "name": "Juliette Reinders Folmer", + "homepage": "https://github.com/jrfnl", + "role": "lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors" + } + ], + "description": "A suite of utility functions for use with PHP_CodeSniffer", + "homepage": "https://phpcsutils.com/", + "keywords": [ + "PHP_CodeSniffer", + "phpcbf", + "phpcodesniffer-standard", + "phpcs", + "phpcs3", + "standards", + "static analysis", + "tokens", + "utility" + ], + "support": { + "docs": "https://phpcsutils.com/", + "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues", + "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy", + "source": "https://github.com/PHPCSStandards/PHPCSUtils" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-05-20T13:34:27+00:00" + }, + { + "name": "phpmd/phpmd", + "version": "2.15.0", + "source": { + "type": "git", + "url": "https://github.com/phpmd/phpmd.git", + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpmd/phpmd/zipball/74a1f56e33afad4128b886e334093e98e1b5e7c0", + "reference": "74a1f56e33afad4128b886e334093e98e1b5e7c0", + "shasum": "" + }, + "require": { + "composer/xdebug-handler": "^1.0 || ^2.0 || ^3.0", + "ext-xml": "*", + "pdepend/pdepend": "^2.16.1", + "php": ">=5.3.9" + }, + "require-dev": { + "easy-doc/easy-doc": "0.0.0 || ^1.3.2", + "ext-json": "*", + "ext-simplexml": "*", + "gregwar/rst": "^1.0", + "mikey179/vfsstream": "^1.6.8", + "squizlabs/php_codesniffer": "^2.9.2 || ^3.7.2" + }, + "bin": [ + "src/bin/phpmd" + ], + "type": "library", + "autoload": { + "psr-0": { + "PHPMD\\": "src/main/php" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Manuel Pichler", + "email": "github@manuel-pichler.de", + "homepage": "https://github.com/manuelpichler", + "role": "Project Founder" + }, + { + "name": "Marc Würth", + "email": "ravage@bluewin.ch", + "homepage": "https://github.com/ravage84", + "role": "Project Maintainer" + }, + { + "name": "Other contributors", + "homepage": "https://github.com/phpmd/phpmd/graphs/contributors", + "role": "Contributors" + } + ], + "description": "PHPMD is a spin-off project of PHP Depend and aims to be a PHP equivalent of the well known Java tool PMD.", + "homepage": "https://phpmd.org/", + "keywords": [ + "dev", + "mess detection", + "mess detector", + "pdepend", + "phpmd", + "pmd" + ], + "support": { + "irc": "irc://irc.freenode.org/phpmd", + "issues": "https://github.com/phpmd/phpmd/issues", + "source": "https://github.com/phpmd/phpmd/tree/2.15.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/phpmd/phpmd", + "type": "tidelift" + } + ], + "time": "2023-12-11T08:22:20+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.12.12", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0", + "reference": "b5ae1b88f471d3fd4ba1aa0046234b5ca3776dd0", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "keywords": [ + "dev", + "static analysis" + ], + "support": { + "docs": "https://phpstan.org/user-guide/getting-started", + "forum": "https://github.com/phpstan/phpstan/discussions", + "issues": "https://github.com/phpstan/phpstan/issues", + "security": "https://github.com/phpstan/phpstan/security/policy", + "source": "https://github.com/phpstan/phpstan-src" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + } + ], + "time": "2024-11-28T22:13:23+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.32", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:23:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.21", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-09-19T10:50:18+00:00" + }, + { + "name": "psy/psysh", + "version": "v0.12.5", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/psysh.git", + "reference": "36a03ff27986682c22985e56aabaf840dd173cb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/psysh/zipball/36a03ff27986682c22985e56aabaf840dd173cb5", + "reference": "36a03ff27986682c22985e56aabaf840dd173cb5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-tokenizer": "*", + "nikic/php-parser": "^5.0 || ^4.0", + "php": "^8.0 || ^7.4", + "symfony/console": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4", + "symfony/var-dumper": "^7.0 || ^6.0 || ^5.0 || ^4.0 || ^3.4" + }, + "conflict": { + "symfony/console": "4.4.37 || 5.3.14 || 5.3.15 || 5.4.3 || 5.4.4 || 6.0.3 || 6.0.4" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.2" + }, + "suggest": { + "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)", + "ext-pdo-sqlite": "The doc command requires SQLite to work.", + "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well." + }, + "bin": [ + "bin/psysh" + ], + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": false, + "forward-command": false + }, + "branch-alias": { + "dev-main": "0.12.x-dev" + } + }, + "autoload": { + "files": [ + "src/functions.php" + ], + "psr-4": { + "Psy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "An interactive shell for modern PHP.", + "homepage": "http://psysh.org", + "keywords": [ + "REPL", + "console", + "interactive", + "shell" + ], + "support": { + "issues": "https://github.com/bobthecow/psysh/issues", + "source": "https://github.com/bobthecow/psysh/tree/v0.12.5" + }, + "time": "2024-11-29T06:14:30+00:00" + }, + { + "name": "react/cache", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/cache.git", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/cache/zipball/d47c472b64aa5608225f47965a484b75c7817d5b", + "reference": "d47c472b64aa5608225f47965a484b75c7817d5b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/promise": "^3.0 || ^2.0 || ^1.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.35" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, Promise-based cache interface for ReactPHP", + "keywords": [ + "cache", + "caching", + "promise", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/cache/issues", + "source": "https://github.com/reactphp/cache/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2022-11-30T15:59:55+00:00" + }, + { + "name": "react/child-process", + "version": "v0.6.5", + "source": { + "type": "git", + "url": "https://github.com/reactphp/child-process.git", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/child-process/zipball/e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "reference": "e71eb1aa55f057c7a4a0d08d06b0b0a484bead43", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/event-loop": "^1.2", + "react/stream": "^1.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.35", + "react/socket": "^1.8", + "sebastian/environment": "^5.0 || ^3.0 || ^2.0 || ^1.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\ChildProcess\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven library for executing child processes with ReactPHP.", + "keywords": [ + "event-driven", + "process", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/child-process/issues", + "source": "https://github.com/reactphp/child-process/tree/v0.6.5" + }, + "funding": [ + { + "url": "https://github.com/WyriHaximus", + "type": "github" + }, + { + "url": "https://github.com/clue", + "type": "github" + } + ], + "time": "2022-09-16T13:41:56+00:00" + }, + { + "name": "react/dns", + "version": "v1.13.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/dns.git", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/dns/zipball/eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "reference": "eb8ae001b5a455665c89c1df97f6fb682f8fb0f5", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "react/cache": "^1.0 || ^0.6 || ^0.5", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.7 || ^1.2.1" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3 || ^2", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Dns\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async DNS resolver for ReactPHP", + "keywords": [ + "async", + "dns", + "dns-resolver", + "reactphp" + ], + "support": { + "issues": "https://github.com/reactphp/dns/issues", + "source": "https://github.com/reactphp/dns/tree/v1.13.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-13T14:18:03+00:00" + }, + { + "name": "react/event-loop", + "version": "v1.5.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/event-loop.git", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/event-loop/zipball/bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "reference": "bbe0bd8c51ffc05ee43f1729087ed3bdf7d53354", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "suggest": { + "ext-pcntl": "For signal handling support when using the StreamSelectLoop" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\EventLoop\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "ReactPHP's core reactor event loop that libraries can use for evented I/O.", + "keywords": [ + "asynchronous", + "event-loop" + ], + "support": { + "issues": "https://github.com/reactphp/event-loop/issues", + "source": "https://github.com/reactphp/event-loop/tree/v1.5.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2023-11-13T13:48:05+00:00" + }, + { + "name": "react/socket", + "version": "v1.16.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/socket.git", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/socket/zipball/23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "reference": "23e4ff33ea3e160d2d1f59a0e6050e4b0fb0eac1", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.0", + "react/dns": "^1.13", + "react/event-loop": "^1.2", + "react/promise": "^3.2 || ^2.6 || ^1.2.1", + "react/stream": "^1.4" + }, + "require-dev": { + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36", + "react/async": "^4.3 || ^3.3 || ^2", + "react/promise-stream": "^1.4", + "react/promise-timer": "^1.11" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Socket\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Async, streaming plaintext TCP/IP and secure TLS socket server and client connections for ReactPHP", + "keywords": [ + "Connection", + "Socket", + "async", + "reactphp", + "stream" + ], + "support": { + "issues": "https://github.com/reactphp/socket/issues", + "source": "https://github.com/reactphp/socket/tree/v1.16.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-07-26T10:38:09+00:00" + }, + { + "name": "react/stream", + "version": "v1.4.0", + "source": { + "type": "git", + "url": "https://github.com/reactphp/stream.git", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/reactphp/stream/zipball/1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "reference": "1e5b0acb8fe55143b5b426817155190eb6f5b18d", + "shasum": "" + }, + "require": { + "evenement/evenement": "^3.0 || ^2.0 || ^1.0", + "php": ">=5.3.8", + "react/event-loop": "^1.2" + }, + "require-dev": { + "clue/stream-filter": "~1.2", + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" + }, + "type": "library", + "autoload": { + "psr-4": { + "React\\Stream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christian Lück", + "email": "christian@clue.engineering", + "homepage": "https://clue.engineering/" + }, + { + "name": "Cees-Jan Kiewiet", + "email": "reactphp@ceesjankiewiet.nl", + "homepage": "https://wyrihaximus.net/" + }, + { + "name": "Jan Sorgalla", + "email": "jsorgalla@gmail.com", + "homepage": "https://sorgalla.com/" + }, + { + "name": "Chris Boden", + "email": "cboden@gmail.com", + "homepage": "https://cboden.dev/" + } + ], + "description": "Event-driven readable and writable streams for non-blocking I/O in ReactPHP", + "keywords": [ + "event-driven", + "io", + "non-blocking", + "pipe", + "reactphp", + "readable", + "stream", + "writable" + ], + "support": { + "issues": "https://github.com/reactphp/stream/issues", + "source": "https://github.com/reactphp/stream/tree/v1.4.0" + }, + "funding": [ + { + "url": "https://opencollective.com/reactphp", + "type": "open_collective" + } + ], + "time": "2024-06-11T12:45:25+00:00" + }, + { + "name": "rector/rector", + "version": "1.2.10", + "source": { + "type": "git", + "url": "https://github.com/rectorphp/rector.git", + "reference": "40f9cf38c05296bd32f444121336a521a293fa61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/40f9cf38c05296bd32f444121336a521a293fa61", + "reference": "40f9cf38c05296bd32f444121336a521a293fa61", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "phpstan/phpstan": "^1.12.5" + }, + "conflict": { + "rector/rector-doctrine": "*", + "rector/rector-downgrade-php": "*", + "rector/rector-phpunit": "*", + "rector/rector-symfony": "*" + }, + "suggest": { + "ext-dom": "To manipulate phpunit.xml via the custom-rule command" + }, + "bin": [ + "bin/rector" + ], + "type": "library", + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Instant Upgrade and Automated Refactoring of any PHP code", + "keywords": [ + "automation", + "dev", + "migration", + "refactoring" + ], + "support": { + "issues": "https://github.com/rectorphp/rector/issues", + "source": "https://github.com/rectorphp/rector/tree/1.2.10" + }, + "funding": [ + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2024-11-08T13:59:10+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:33:00+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:35:11+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/phpcpd", + "version": "6.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpcpd.git", + "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpcpd/zipball/f3683aa0db2e8e09287c2bb33a595b2873ea9176", + "reference": "f3683aa0db2e8e09287c2bb33a595b2873ea9176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0", + "phpunit/php-timer": "^5.0", + "sebastian/cli-parser": "^1.0", + "sebastian/version": "^3.0" + }, + "bin": [ + "phpcpd" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Copy/Paste Detector (CPD) for PHP code.", + "homepage": "https://github.com/sebastianbergmann/phpcpd", + "support": { + "issues": "https://github.com/sebastianbergmann/phpcpd/issues", + "source": "https://github.com/sebastianbergmann/phpcpd/tree/6.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "abandoned": true, + "time": "2020-12-07T05:39:23+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.11.1", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "19473c30efe4f7b3cd42522d0b2e6e7f243c6f87" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/19473c30efe4f7b3cd42522d0b2e6e7f243c6f87", + "reference": "19473c30efe4f7b3cd42522d0b2e6e7f243c6f87", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-11-16T12:02:36+00:00" + }, + { + "name": "symfony/dotenv", + "version": "v6.4.16", + "source": { + "type": "git", + "url": "https://github.com/symfony/dotenv.git", + "reference": "1ac5e7e7e862d4d574258daf08bd569ba926e4a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/1ac5e7e7e862d4d574258daf08bd569ba926e4a5", + "reference": "1ac5e7e7e862d4d574258daf08bd569ba926e4a5", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "conflict": { + "symfony/console": "<5.4", + "symfony/process": "<5.4" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.0|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Dotenv\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Registers environment variables from a .env file", + "homepage": "https://symfony.com", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "source": "https://github.com/symfony/dotenv/tree/v6.4.16" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-27T11:08:19+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "reference": "1de1cf14d99b12c7ebbb850491ec6ae3ed468855", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<5.4", + "symfony/serializer": "<6.4.3|>7.0,<7.0.3" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1|^4", + "league/html-to-markdown": "^5.0", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^5.4|^6.0|^7.0", + "symfony/process": "^5.4|^6.4|^7.0", + "symfony/property-access": "^5.4|^6.0|^7.0", + "symfony/property-info": "^5.4|^6.0|^7.0", + "symfony/serializer": "^6.4.3|^7.0.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-10-25T15:07:50+00:00" + }, + { + "name": "symfony/options-resolver", + "version": "v7.2.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/options-resolver.git", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\OptionsResolver\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an improved replacement for the array_replace PHP function", + "homepage": "https://symfony.com", + "keywords": [ + "config", + "configuration", + "options" + ], + "support": { + "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-11-20T11:17:29+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v6.4.13", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/2cae0a6f8d04937d02f6d19806251e2104d54f92", + "reference": "2cae0a6f8d04937d02f6d19806251e2104d54f92", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "symfony/service-contracts": "^2.5|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v6.4.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-25T14:18:03+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "weew/helpers-array", + "version": "v1.3.1", + "source": { + "type": "git", + "url": "https://github.com/weew/helpers-array.git", + "reference": "9bff63111f9765b4277750db8d276d92b3e16ed0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/weew/helpers-array/zipball/9bff63111f9765b4277750db8d276d92b3e16ed0", + "reference": "9bff63111f9765b4277750db8d276d92b3e16ed0", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^4.7", + "satooshi/php-coveralls": "^0.6.1" + }, + "type": "library", + "autoload": { + "files": [ + "src/array.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxim Kott", + "email": "maximkott@gmail.com" + } + ], + "description": "Useful collection of php array helpers.", + "support": { + "issues": "https://github.com/weew/helpers-array/issues", + "source": "https://github.com/weew/helpers-array/tree/master" + }, + "time": "2016-07-21T11:18:01+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} From 73f1b62aaabce890828df0318b9c150822d91dc2 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Wed, 19 Mar 2025 20:54:36 +0200 Subject: [PATCH 02/34] 1263: test attempt with minimum tests --- .../magento2plugin/BaseProjectTestCase.java | 88 ----- .../generator/AclXmlGeneratorTest.java | 93 ----- .../ArgumentInjectionGeneratorTest.java | 338 ------------------ .../generator/BaseGeneratorTestCase.java | 70 ---- .../CLICommandClassGeneratorTest.java | 45 --- .../CLICommandDiXmlGeneratorTest.java | 83 ----- ...ributePropertySetupPatchGeneratorTest.java | 94 ----- .../generator/CronjobClassGeneratorTest.java | 29 -- .../generator/CrontabXmlGeneratorTest.java | 140 -------- ...tomerAttributeSetupPatchGeneratorTest.java | 63 ---- .../generator/DataModelGeneratorTest.java | 70 ---- .../DataModelInterfaceGeneratorTest.java | 36 -- .../DataProviderDeclarationGeneratorTest.java | 53 --- .../DbSchemaWhitelistGeneratorTest.java | 146 -------- .../generator/DbSchemaXmlGeneratorTest.java | 188 ---------- .../DeleteEntityCommandGeneratorTest.java | 65 ---- .../generator/DeleteEntityGeneratorTest.java | 62 ---- .../EditEntityActionGeneratorTest.java | 48 --- .../EntityDataMapperClassGeneratorTest.java | 49 --- .../FormButtonBlockGeneratorTest.java | 189 ---------- .../FormGenericButtonBlockGeneratorTest.java | 56 --- .../GridActionColumnFileGeneratorTest.java | 53 --- .../IndexControllerGeneratorTest.java | 39 -- .../generator/LayoutXmlGeneratorTest.java | 45 --- .../generator/MenuXmlGeneratorTest.java | 54 --- .../MessageQueueClassGeneratorTest.java | 87 ----- .../ModuleBlockClassGeneratorTest.java | 33 -- .../ModuleCollectionGeneratorTest.java | 64 ---- .../ModuleComposerJsonGeneratorTest.java | 118 ------ .../ModuleControllerClassGeneratorTest.java | 102 ------ .../ModuleCronGroupXmlGeneratorTest.java | 138 ------- .../ModuleEmailTemplateHtmlGeneratorTest.java | 110 ------ .../ModuleEmailTemplatesXmlGeneratorTest.java | 116 ------ ...duleGraphQlResolverClassGeneratorTest.java | 38 -- .../generator/ModuleModelGeneratorTest.java | 62 ---- .../ModuleObserverGeneratorTest.java | 41 --- .../ModuleReadmeMdGeneratorTest.java | 36 -- .../ModuleRegistrationPhpGeneratorTest.java | 69 ---- .../ModuleResourceModelGeneratorTest.java | 81 ----- .../ModuleSetupDataPatchGeneratorTest.java | 40 --- .../ModuleViewModelClassGeneratorTest.java | 37 -- ...oduleXmlGeneratorHaveSetupVersionTest.java | 44 --- .../generator/ModuleXmlGeneratorTest.java | 80 ----- .../NewActionEntityGeneratorTest.java | 53 --- .../NewEntityLayoutGeneratorTest.java | 46 --- .../generator/ObserverClassGeneratorTest.java | 39 -- .../ObserverEventsXmlGeneratorTest.java | 117 ------ .../generator/PluginClassGeneratorTest.java | 76 ---- .../generator/PluginDiXmlGeneratorTest.java | 189 ---------- .../PreferenceClassGeneratorTest.java | 127 ------- .../PreferenceDiXmlGeneratorTest.java | 138 ------- ...ributePropertySetupPatchGeneratorTest.java | 215 ----------- .../generator/QueryModelGeneratorTest.java | 46 --- .../QueueCommunicationGeneratorTest.java | 44 --- .../generator/QueueConsumerGeneratorTest.java | 74 ---- .../QueuePublisherGeneratorTest.java | 42 --- .../generator/QueueTopologyGeneratorTest.java | 46 --- .../generator/RoutesXmlGeneratorTest.java | 40 --- .../SaveEntityActionGeneratorTest.java | 90 ----- .../SaveEntityCommandGeneratorTest.java | 54 --- .../SearchResultsFilesGeneratorTest.java | 102 ------ .../generator/SourceModelGeneratorTest.java | 61 ---- .../UiComponentFormGeneratorTest.java | 173 --------- ...omponentGridDataProviderGeneratorTest.java | 107 ------ .../UiComponentGridXmlGeneratorTest.java | 163 --------- .../WebApiInterfaceGeneratorTest.java | 265 -------------- .../WebApiXmlDeclarationGeneratorTest.java | 53 --- .../pool/NewEntityGeneratorPoolTest.java | 133 ------- .../DbSchemaGeneratorDataProviderUtil.java | 51 --- .../completion/BaseCompletionTestCase.java | 128 ------- .../php/CompletionPhpFixtureTestCase.java | 18 - ...onfigPhpModuleCompletionRegistrarTest.java | 33 -- ...ackendModelXmlCompletionRegistrarTest.java | 115 ------ .../xml/CompletionXmlFixtureTestCase.java | 18 - ...figurationTypeCompletionRegistrarTest.java | 21 -- ...ructorArgumentCompletionRegistrarTest.java | 21 -- .../xml/CrontabCompletionRegistrarTest.java | 68 ---- .../LayoutBlockCompletionRegistrarTest.java | 20 -- ...ayoutContainerCompletionRegistrarTest.java | 26 -- ...outUIComponentCompletionRegistrarTest.java | 24 -- ...utUpdateHandleCompletionRegistrarTest.java | 24 -- .../xml/MenuCompletionRegistrarTest.java | 26 -- ...MftfEntityNameCompletionRegistrarTest.java | 106 ------ .../xml/MftfNameCompletionRegistrarTest.java | 41 --- .../MftfPageUrlCompletionRegistrarTest.java | 68 ---- .../MftfSelectorCompletionRegistrarTest.java | 52 --- .../ModuleNameCompletionRegistrarTest.java | 33 -- .../xml/ObserverCompletionRegistrarTest.java | 38 -- ...PhpClassMemberCompletionRegistrarTest.java | 21 -- ...pServiceMethodCompletionRegistrarTest.java | 19 - .../PluginTypeCompletionRegistrarTest.java | 22 -- .../xml/RequireJsCompletionRegistrarTest.java | 46 --- ...SourceModelXmlCompletionRegistrarTest.java | 82 ----- ...ystemConfigurationPathsCompletionTest.java | 66 ---- ...eAndColumnNameCompletionRegistrarTest.java | 60 ---- ...ponentTemplateCompletionRegistrarTest.java | 28 -- .../inspections/BaseInspectionsTestCase.java | 52 --- .../InspectionGraphqlsFixtureTestCase.java | 35 -- .../SchemaResolverInspectionTest.java | 59 --- .../php/GraphQlResolverInspectionTest.java | 47 --- .../php/InspectionPhpFixtureTestCase.java | 35 -- ...rationInRegistrationPhpInspectionTest.java | 85 ----- .../inspections/php/PluginInspectionTest.java | 64 ---- .../xml/AclResourceXmlInspectionTest.java | 64 ---- ...bleFalseInDefaultLayoutInspectionTest.java | 33 -- .../xml/InspectionXmlFixtureTestCase.java | 34 -- ...eDeclarationInModuleXmlInspectionTest.java | 131 ------- .../xml/ModuleScopeInspectionTest.java | 50 --- .../ObserverDeclarationInspectionTest.java | 42 --- .../PluginAttributeTypeInspectionTest.java | 89 ----- .../xml/PluginDeclarationInspectionTest.java | 129 ------- .../PreferenceDeclarationInspectionTest.java | 150 -------- ...peConfigurationTagTypesInspectionTest.java | 130 ------- .../xml/WebApiServiceInspectionTest.java | 126 ------- .../linemarker/LinemarkerFixtureTestCase.java | 82 ----- ...lResolverClassLinemarkerRegistrarTest.java | 20 -- ...ationTypeClassLinemarkerRegistrarTest.java | 29 -- ...lResolverUsageLinemarkerRegistrarTest.java | 29 -- .../ObserverClassLinemarkerRegistrarTest.java | 29 -- .../php/PluginLinemarkerRegistrarTest.java | 29 -- .../PluginTargetLinemarkerRegistrarTest.java | 42 --- .../TestFixtureLinemarkerRegistrarTest.java | 29 -- .../php/WebApiLinemarkerRegistrarTest.java | 82 ----- .../pages/WelcomeFrameFixture.java | 36 -- .../reference/BaseReferenceTestCase.java | 298 --------------- .../js/ReferenceJsFixtureTestCase.java | 17 - .../js/RequireJsReferenceRegistrarTest.java | 62 ---- ...ConfigPhpModuleReferenceRegistrarTest.java | 27 -- ...erDispatchEventReferenceRegistrarTest.java | 15 - .../php/ReferencePhpFixtureTestCase.java | 17 - ...nfigurationTypeReferenceRegistrarTest.java | 17 - ...tructorArgumentReferenceRegistrarTest.java | 31 -- .../xml/CrontabReferenceRegistrarTest.java | 43 --- .../DisabledPluginReferenceRegistrarTest.java | 20 -- .../LayoutBlockReferenceRegistrarTest.java | 17 - ...LayoutContainerReferenceRegistrarTest.java | 22 -- ...youtUIComponentReferenceRegistrarTest.java | 18 - ...outUpdateHandleReferenceRegistrarTest.java | 22 -- .../xml/MenuReferenceRegistrarTest.java | 22 -- .../MftfEntityNameReferenceRegistrarTest.java | 101 ------ .../xml/MftfNameReferenceRegistrarTest.java | 22 -- .../MftfPageUrlReferenceRegistrarTest.java | 73 ---- .../MftfSelectorReferenceRegistrarTest.java | 36 -- .../xml/ModuleNameReferenceRegistrarTest.java | 27 -- .../xml/ObserverReferenceRegistrarTest.java | 56 --- .../xml/PluginTypeReferenceRegistrarTest.java | 22 -- .../xml/ReferenceXmlFixtureTestCase.java | 17 - .../xml/RequireJsReferenceRegistrarTest.java | 36 -- ...leNameAndColumnReferenceRegistrarTest.java | 69 ---- ...mponentTemplateReferenceRegistrarTest.java | 15 - .../WebApiMethodReferenceRegistrarTest.java | 30 -- 151 files changed, 10174 deletions(-) delete mode 100644 src/test/java/com/magento/idea/magento2plugin/BaseProjectTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/AclXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ArgumentInjectionGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandDiXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CategoryAttributePropertySetupPatchGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CronjobClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CrontabXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CustomerAttributeSetupPatchGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelInterfaceGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataProviderDeclarationGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaWhitelistGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityCommandGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EditEntityActionGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EntityDataMapperClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormButtonBlockGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormGenericButtonBlockGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/GridActionColumnFileGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/IndexControllerGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/LayoutXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MenuXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MessageQueueClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleBlockClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCronGroupXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplateHtmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplatesXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleGraphQlResolverClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleObserverGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleRegistrationPhpGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleSetupDataPatchGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleViewModelClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorHaveSetupVersionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewActionEntityGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewEntityLayoutGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverEventsXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginDiXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceClassGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceDiXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ProductAttributePropertySetupPatchGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueryModelGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueCommunicationGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueConsumerGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueuePublisherGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueTopologyGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/RoutesXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityActionGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityCommandGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SearchResultsFilesGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SourceModelGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentFormGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridDataProviderGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridXmlGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiInterfaceGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiXmlDeclarationGeneratorTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/pool/NewEntityGeneratorPoolTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DbSchemaGeneratorDataProviderUtil.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/BaseCompletionTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/php/CompletionPhpFixtureTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/php/ConfigPhpModuleCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/BackendModelXmlCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/CompletionXmlFixtureTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/ConfigurationTypeCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/ConstructorArgumentCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/CrontabCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutBlockCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutContainerCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUIComponentCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUpdateHandleCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/MenuCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfEntityNameCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfNameCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfPageUrlCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfSelectorCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/ModuleNameCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/ObserverCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpClassMemberCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpServiceMethodCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/PluginTypeCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/RequireJsCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/SourceModelXmlCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/SystemConfigurationPathsCompletionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/TableAndColumnNameCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/UiComponentTemplateCompletionRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/BaseInspectionsTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/InspectionGraphqlsFixtureTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/SchemaResolverInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/php/GraphQlResolverInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/php/InspectionPhpFixtureTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/php/ModuleDeclarationInRegistrationPhpInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/php/PluginInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/AclResourceXmlInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/CacheableFalseInDefaultLayoutInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/InspectionXmlFixtureTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleDeclarationInModuleXmlInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleScopeInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/ObserverDeclarationInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginAttributeTypeInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginDeclarationInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/PreferenceDeclarationInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/TypeConfigurationTagTypesInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/WebApiServiceInspectionTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/LinemarkerFixtureTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/graphqls/GraphQlResolverClassLinemarkerRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/ConfigurationTypeClassLinemarkerRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/GraphQlResolverUsageLinemarkerRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/ObserverClassLinemarkerRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginLinemarkerRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLinemarkerRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLinemarkerRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/WebApiLinemarkerRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/pages/WelcomeFrameFixture.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/BaseReferenceTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/js/ReferenceJsFixtureTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/js/RequireJsReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/php/ConfigPhpModuleReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/php/ObserverDispatchEventReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/php/ReferencePhpFixtureTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/ConfigurationTypeReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/ConstructorArgumentReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/CrontabReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/DisabledPluginReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutBlockReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutContainerReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUIComponentReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUpdateHandleReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/MenuReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfEntityNameReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfNameReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfPageUrlReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfSelectorReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/ModuleNameReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/ObserverReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/PluginTypeReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/ReferenceXmlFixtureTestCase.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/RequireJsReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/TableNameAndColumnReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/UiComponentTemplateReferenceRegistrarTest.java delete mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/WebApiMethodReferenceRegistrarTest.java diff --git a/src/test/java/com/magento/idea/magento2plugin/BaseProjectTestCase.java b/src/test/java/com/magento/idea/magento2plugin/BaseProjectTestCase.java deleted file mode 100644 index 427237113..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/BaseProjectTestCase.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin; - -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.testFramework.IndexingTestUtil; -import com.intellij.testFramework.PlatformTestUtil; -import com.intellij.testFramework.fixtures.BasePlatformTestCase; -import com.magento.idea.magento2plugin.indexes.IndexManager; -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.project.Settings; - -/** - * Configure test environment with Magento 2 project. - */ -public abstract class BaseProjectTestCase extends BasePlatformTestCase { - private static final String testDataProjectPath = "testData" //NOPMD - + File.separator - + "project"; - - private static final String testDataProjectDirectory = "magento2"; //NOPMD - - @Override - public void setUp() throws Exception { - super.setUp(); - copyMagento2ToTestProject(); - enablePluginAndReindex(); - } - - private void copyMagento2ToTestProject() { - myFixture.setTestDataPath(testDataProjectPath); - myFixture.copyDirectoryToProject( - testDataProjectDirectory, - "" - ); - } - - @Override - protected String getTestDataPath() { - //configure specific test data in your test. - return "testData"; - } - - protected void enablePluginAndReindex() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.magentoPath = "/src"; - settings.pluginEnabled = true; - settings.mftfSupportEnabled = true; - IndexManager.manualReindex(); - PlatformTestUtil.dispatchAllEventsInIdeEventQueue(); - IndexingTestUtil.waitUntilIndexesAreReady(myFixture.getProject()); - } - - protected void disablePluginAndReindex() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.pluginEnabled = false; - IndexManager.manualReindex(); - PlatformTestUtil.dispatchAllEventsInIdeEventQueue(); - IndexingTestUtil.waitUntilIndexesAreReady(myFixture.getProject()); - } - - protected void disableMftfSupportAndReindex() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.mftfSupportEnabled = false; - IndexManager.manualReindex(); - PlatformTestUtil.dispatchAllEventsInIdeEventQueue(); - IndexingTestUtil.waitUntilIndexesAreReady(myFixture.getProject()); - } - - protected String prepareFixturePath( - final String fileName, - final String fixturesFolderPath - ) { - return fixturesFolderPath + getClass().getSimpleName().replace("Test", "") - + File.separator - + name() - + File.separator - + fileName; - } - - private String name() { - return StringUtil.trimEnd(getTestName(true), "Test"); - } - -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/AclXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/AclXmlGeneratorTest.java deleted file mode 100644 index b905ff571..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/AclXmlGeneratorTest.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.AclXmlData; -import com.magento.idea.magento2plugin.magento.files.ModuleAclXml; - -public class AclXmlGeneratorTest extends BaseGeneratorTestCase { - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String CONFIG_ACL_ID = "Magento_Config::config"; - private static final String FOO_BAR_MANAGE_ACL_ID = "Foo_Bar::manage"; - private static final String FOO_BAR_MANAGE_ACL_TITLE = "Bar Management"; - - /** - * Test checks whether acl.xml file generated correctly. - */ - public void testGenerateAclXmlFile() { - final String filePath = this.getFixturePath(ModuleAclXml.FILE_NAME); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - generateAclXmlFile( - CONFIG_ACL_ID, - FOO_BAR_MANAGE_ACL_ID, - FOO_BAR_MANAGE_ACL_TITLE - ) - ); - } - - /** - * Test checks whether acl.xml file generated correctly - * for non existed parent. - */ - public void testGenerateAclXmlFileForNonExistedParent() { - final String filePath = this.getFixturePath(ModuleAclXml.FILE_NAME); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - generateAclXmlFile( - "Non_Existed::test", - "Foo_Bar::test", - "Non Existed Test" - ) - ); - } - - /** - * Test adding new acl rule to existing acl.xml file. - */ - public void testGetAclXmlFileAndGenerateNewAcl() { - final String filePath = this.getFixturePath(ModuleAclXml.FILE_NAME); - generateAclXmlFile(CONFIG_ACL_ID, FOO_BAR_MANAGE_ACL_ID, FOO_BAR_MANAGE_ACL_TITLE); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - generateAclXmlFile( - FOO_BAR_MANAGE_ACL_ID, - "Foo_Bar::manage_save", - "Save" - ) - ); - } - - /** - * Generate ACL XML file. - * - * @param parentResourceId String - * @param resourceId String - * @param resourceTitle String - * - * @return PsiFile - */ - private PsiFile generateAclXmlFile( - final String parentResourceId, - final String resourceId, - final String resourceTitle - ) { - final AclXmlGenerator aclXmlGenerator = new AclXmlGenerator( - new AclXmlData(parentResourceId, resourceId, resourceTitle), - MODULE_NAME, - myFixture.getProject() - ); - return aclXmlGenerator.generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ArgumentInjectionGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ArgumentInjectionGeneratorTest.java deleted file mode 100644 index 496a86f5d..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ArgumentInjectionGeneratorTest.java +++ /dev/null @@ -1,338 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.xml.DiArgumentData; -import com.magento.idea.magento2plugin.actions.generation.data.xml.DiArrayValueData; -import com.magento.idea.magento2plugin.actions.generation.generator.code.ArgumentInjectionGenerator; -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; -import com.magento.idea.magento2plugin.magento.packages.Areas; -import com.magento.idea.magento2plugin.magento.packages.DiArgumentType; -import java.util.ArrayList; -import java.util.List; - -@SuppressWarnings("PMD.TooManyMethods") -public class ArgumentInjectionGeneratorTest extends BaseGeneratorTestCase { - - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc/frontend"; - private static final String EXPECTED_DIR_FOR_REPLACING = "src/app/code/Foo/Bar/etc/crontab"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String TARGET_CLASS = "Foo\\Bar\\Model\\Test"; - private static final String STRING_PARAMETER = "name"; - private static final String STRING_VALUE = "test"; - private static final String BOOL_PARAMETER = "isEmpty"; - private static final String BOOL_VALUE = "false"; - private static final String NUMBER_PARAMETER = "age"; - private static final String NUMBER_VALUE = "12"; - private static final String INIT_PARAM_PARAMETER = "defaultArea"; - private static final String INIT_PARAM_VALUE = "Foo\\Bar\\Model\\AreaTest::DEFAULT_AREA"; - private static final String CONST_PARAMETER = "defaultService"; - private static final String CONST_VALUE = "Foo\\Bar\\Model\\ServiceTest::DEFAULT_SERVICE"; - private static final String NULL_PARAMETER = "object"; - private static final String NULL_VALUE = ""; - private static final String OBJECT_PARAMETER = "object"; - private static final String OBJECT_VALUE = "Foo\\Bar\\Model\\Service"; - private static final String ARRAY_PARAMETER = "methods"; - private static final Areas TEST_AREA = Areas.frontend; - - /** - * Tested string value injection. - */ - public void testInjectStringValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIRECTORY, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - STRING_PARAMETER, - TEST_AREA, - DiArgumentType.STRING, - STRING_VALUE - ) - ) - ); - } - - /** - * Tested boolean value injection. - */ - public void testInjectBooleanValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIRECTORY, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - BOOL_PARAMETER, - TEST_AREA, - DiArgumentType.BOOLEAN, - BOOL_VALUE - ) - ) - ); - } - - /** - * Tested number value injection. - */ - public void testInjectNumberValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIRECTORY, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - NUMBER_PARAMETER, - TEST_AREA, - DiArgumentType.NUMBER, - NUMBER_VALUE - ) - ) - ); - } - - /** - * Tested init_parameter value injection. - */ - public void testInjectInitParameterValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIRECTORY, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - INIT_PARAM_PARAMETER, - TEST_AREA, - DiArgumentType.INIT_PARAMETER, - INIT_PARAM_VALUE - ) - ) - ); - } - - /** - * Tested constant value injection. - */ - public void testInjectConstValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIRECTORY, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - CONST_PARAMETER, - TEST_AREA, - DiArgumentType.CONST, - CONST_VALUE - ) - ) - ); - } - - /** - * Tested null value injection. - */ - public void testInjectNullValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIRECTORY, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - NULL_PARAMETER, - TEST_AREA, - DiArgumentType.NULL, - NULL_VALUE - ) - ) - ); - } - - /** - * Tested object value injection. - */ - public void testInjectObjectValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIRECTORY, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - OBJECT_PARAMETER, - TEST_AREA, - DiArgumentType.OBJECT, - OBJECT_VALUE - ) - ) - ); - } - - /** - * Tested array value injection. - */ - public void testInjectArrayValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIRECTORY, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - ARRAY_PARAMETER, - TEST_AREA, - DiArgumentType.ARRAY, - getArrayValue() - ) - ) - ); - } - - /** - * Tested nested array value injection. - */ - public void testInjectNestedArrayValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIRECTORY, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - ARRAY_PARAMETER, - TEST_AREA, - DiArgumentType.ARRAY, - getNestedArrayValue() - ) - ) - ); - } - - /** - * Tested object value replacing with the null value injection. - */ - public void testReplaceObjectValueWithNullValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIR_FOR_REPLACING, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - OBJECT_PARAMETER, - Areas.crontab, - DiArgumentType.NULL, - NULL_VALUE - ) - ) - ); - } - - /** - * Tested object value replacing with the object proxy value injection. - */ - public void testReplaceObjectValueWithProxyValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIR_FOR_REPLACING, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - OBJECT_PARAMETER, - Areas.crontab, - DiArgumentType.OBJECT, - OBJECT_VALUE + "\\Proxy" - ) - ) - ); - } - - /** - * Tested object value replacing with the object factory value injection. - */ - public void testReplaceObjectValueWithFactoryValue() { - assertGeneratedFileIsCorrect( - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), - EXPECTED_DIR_FOR_REPLACING, - injectConstructorArgument( - new DiArgumentData( - MODULE_NAME, - TARGET_CLASS, - OBJECT_PARAMETER, - Areas.crontab, - DiArgumentType.OBJECT, - OBJECT_VALUE + "Factory" - ) - ) - ); - } - - private PsiFile injectConstructorArgument( - final DiArgumentData data - ) { - final ArgumentInjectionGenerator generator = new ArgumentInjectionGenerator( - data, - myFixture.getProject() - ); - - return generator.generate("test"); - } - - private String getArrayValue() { - final List items = new ArrayList<>(); - items.add(new DiArrayValueData.DiArrayItemData("method1", DiArgumentType.STRING, "QW1")); - items.add(new DiArrayValueData.DiArrayItemData("method2", DiArgumentType.STRING, "QW2")); - items.add(new DiArrayValueData.DiArrayItemData("method3", DiArgumentType.STRING, "QW3")); - items.add(new DiArrayValueData.DiArrayItemData("method4", DiArgumentType.STRING, "QW4")); - items.add(new DiArrayValueData.DiArrayItemData("method5", DiArgumentType.STRING, "QW5")); - final DiArrayValueData arrayValueData = new DiArrayValueData(); - arrayValueData.setItems(items); - - return arrayValueData.convertToXml(arrayValueData); - } - - private String getNestedArrayValue() { - final List items = new ArrayList<>(); - items.add(new DiArrayValueData.DiArrayItemData("method1", DiArgumentType.STRING, "QW1")); - items.add(new DiArrayValueData.DiArrayItemData("method2", DiArgumentType.STRING, "QW2")); - items.add(new DiArrayValueData.DiArrayItemData("method3", DiArgumentType.STRING, "QW3")); - items.add(new DiArrayValueData.DiArrayItemData("method4", DiArgumentType.STRING, "QW4")); - final DiArrayValueData.DiArrayItemData nestedItem = new DiArrayValueData.DiArrayItemData( - "nested", - DiArgumentType.ARRAY, - "" - ); - - final DiArrayValueData nestedItemsHolder = new DiArrayValueData(); - final List nestedItems = new ArrayList<>(); - nestedItems.add( - new DiArrayValueData.DiArrayItemData("nested1", DiArgumentType.STRING, "NT1") - ); - nestedItems.add( - new DiArrayValueData.DiArrayItemData("nested2", DiArgumentType.BOOLEAN, "true") - ); - nestedItems.add( - new DiArrayValueData.DiArrayItemData("nested3", DiArgumentType.NULL, "") - ); - nestedItemsHolder.setItems(nestedItems); - nestedItem.setChildren(nestedItemsHolder); - items.add(nestedItem); - - final DiArrayValueData arrayValueData = new DiArrayValueData(); - arrayValueData.setItems(items); - - return arrayValueData.convertToXml(arrayValueData); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java deleted file mode 100644 index 4ed4691ae..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiFile; -import com.intellij.testFramework.LightPlatformTestCase; -import com.magento.idea.magento2plugin.BaseProjectTestCase; -import com.magento.idea.magento2plugin.actions.generation.generator.util.DefaultCodeStyleSettingsAdjustmentsUtil; -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.project.util.GetProjectBasePath; -import org.junit.After; -import org.junit.Before; - -public abstract class BaseGeneratorTestCase extends BaseProjectTestCase { - private static final String TEST_DATA_FOLDER_PATH = "testData" + File.separator - + "actions" + File.separator; - private static final String FIXTURES_FOLDER_PATH = "generation" + File.separator - + "generator" + File.separator; - - @Override - @Before - public void setUp() throws Exception { - super.setUp(); - myFixture.setTestDataPath(TEST_DATA_FOLDER_PATH); - // Reset changed default code style settings to the previous default settings. - DefaultCodeStyleSettingsAdjustmentsUtil.execute(myFixture.getProject()); - } - - @Override - @After - public void tearDown() throws Exception { - super.tearDown(); - LightPlatformTestCase.closeAndDeleteProject(); - } - - protected String getFixturePath(final String fileName) { - return prepareFixturePath(fileName, FIXTURES_FOLDER_PATH); - } - - @SuppressWarnings({"PMD.JUnitAssertionsShouldIncludeMessage"}) - protected void assertGeneratedFileIsCorrect( - final PsiFile expectedFile, - final String expectedDirectory, - final PsiFile resultFile - ) { - assertTrue(resultFile.getContainingDirectory().getVirtualFile().getPath() - .endsWith(expectedDirectory)); - assertEquals(expectedFile.getText(), resultFile.getText()); - assertEquals(expectedFile.getName(), resultFile.getName()); - } - - @SuppressWarnings({"PMD.JUnitAssertionsShouldIncludeMessage"}) - protected void assertGeneratedFileIsCorrect( - final PsiFile expectedFile, - final PsiFile resultFile - ) { - assertEquals(expectedFile.getText(), resultFile.getText()); - assertEquals(expectedFile.getName(), resultFile.getName()); - } - - protected PsiDirectory getProjectDirectory() { - return myFixture.getPsiManager().findDirectory( - GetProjectBasePath.execute(myFixture.getProject()) - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandClassGeneratorTest.java deleted file mode 100644 index a3e398791..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandClassGeneratorTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.CLICommandClassData; - -public class CLICommandClassGeneratorTest extends BaseGeneratorTestCase { - private static final String CLASS_NAME = "TestCLICommandPHPClass"; - private static final String PARENT_DIRECTORY = "Console/Command"; - private static final String COMMAND_NAME = "bar:test-command"; - private static final String DESCRIPTION = "This is the test command"; - private static final String NAMESPACE = "Foo\\Bar\\Console\\Command"; - private static final String MODULE_NAME = "Foo_Bar"; - - /** - * Test generation of the new CLI command class. - */ - public void testGenerateCLICommandClass() { - final Project project = myFixture.getProject(); - final CLICommandClassData classData = new CLICommandClassData( - CLASS_NAME, - PARENT_DIRECTORY, - COMMAND_NAME, - DESCRIPTION, - NAMESPACE, - MODULE_NAME - ); - final CLICommandClassGenerator generator = new CLICommandClassGenerator(project, classData); - final PsiFile cliCommandClass = generator.generate("test"); - - final String filePath = this.getFixturePath(CLASS_NAME.concat(".php")); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Console/Command", - cliCommandClass - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandDiXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandDiXmlGeneratorTest.java deleted file mode 100644 index 6c0c281e7..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandDiXmlGeneratorTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.CLICommandXmlData; -import com.magento.idea.magento2plugin.actions.generation.generator.util.NamespaceBuilder; -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; -import com.magento.idea.magento2plugin.magento.packages.Package; -import com.magento.idea.magento2plugin.util.CamelCaseToSnakeCase; - -@SuppressWarnings({ - "PMD.FieldNamingConventions", - "PMD.LongVariable", - "PMD.CommentSize" -}) -public class CLICommandDiXmlGeneratorTest extends BaseGeneratorTestCase { - private static final String CLASS_NAME = "TestCommand"; - private static final String SECOND_CLASS_NAME = "OneMoreCLICommand"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String PARENT_DIR = "Console\\Command"; - private static final String MODULE_DIR = "src/app/code/Foo/Bar/"; - - /** - * Test generation of the di.xml file with the CLI command initialization. - */ - public void testInitializeCLICommand() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiFile diXml = initializeCLICommandInDiXml(CLASS_NAME); - - final String expectedDir = MODULE_DIR + Package.moduleBaseAreaDir; - assertGeneratedFileIsCorrect( - expectedFile, - expectedDir, - diXml - ); - } - - /** - * Test adding one more CLI command to the di.xml with already initialized CLI command. - */ - public void testAddingTwoCLICommandToDiXml() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - initializeCLICommandInDiXml(CLASS_NAME); - final PsiFile diXml = initializeCLICommandInDiXml(SECOND_CLASS_NAME); - - final String expectedDir = MODULE_DIR + Package.moduleBaseAreaDir; - assertGeneratedFileIsCorrect( - expectedFile, - expectedDir, - diXml - ); - } - - private PsiFile initializeCLICommandInDiXml(final String className) { - final NamespaceBuilder classFqn = new NamespaceBuilder(MODULE_NAME, className, PARENT_DIR); - - final String diItemName = new CamelCaseToSnakeCase().convert(className); - final String itemName = MODULE_NAME.toLowerCase(new java.util.Locale("en","EN")) - + "_" - + diItemName; - - final CLICommandXmlData cliCommandDiXmlData = new CLICommandXmlData( - MODULE_NAME, - classFqn.getClassFqn(), - itemName - ); - - final Project project = myFixture.getProject(); - final CLICommandDiXmlGenerator diXmlGenerator = new CLICommandDiXmlGenerator( - project, - cliCommandDiXmlData - ); - - return diXmlGenerator.generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CategoryAttributePropertySetupPatchGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CategoryAttributePropertySetupPatchGeneratorTest.java deleted file mode 100644 index 9dcd4093b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CategoryAttributePropertySetupPatchGeneratorTest.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - * - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.CategoryEntityData; -import com.magento.idea.magento2plugin.actions.generation.data.CategoryFormXmlData; -import com.magento.idea.magento2plugin.magento.packages.eav.AttributeScope; - -public class CategoryAttributePropertySetupPatchGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - - /** - * Tests the generated patch file. - */ - public void testGenerateFile() { - final Project project = myFixture.getProject(); - - final CategoryEntityData categoryEntityData = new CategoryEntityData(); - categoryEntityData.setCode("test_attribute"); - categoryEntityData.setInput("text"); - categoryEntityData.setVisible(true); - categoryEntityData.setLabel("Test Attribute"); - categoryEntityData.setType("static"); - categoryEntityData.setRequired(false); - categoryEntityData.setGroup("Content"); - categoryEntityData.setSortOrder(10); - categoryEntityData.setScope(AttributeScope.GLOBAL.getScope()); - - categoryEntityData.setDataPatchName("AddTestAttributeCategoryAttribute"); - categoryEntityData.setModuleName(MODULE_NAME); - - - final EavAttributeSetupPatchGenerator setupPatchGenerator = - new EavAttributeSetupPatchGenerator(categoryEntityData, project); - final PsiFile dataPatchFile = setupPatchGenerator.generate("testGenerateFile"); - - final String filePatch = this.getFixturePath("AddTestAttributeCategoryAttribute.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePatch); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Setup/Patch/Data", - dataPatchFile - ); - } - - /** - * Tests the generated form file. - */ - public void testGenerateFormFile() { - final Project project = myFixture.getProject(); - - final CategoryEntityData categoryEntityData = new CategoryEntityData(); - categoryEntityData.setCode("test_attribute"); - categoryEntityData.setInput("text"); - categoryEntityData.setVisible(true); - categoryEntityData.setLabel("Test Attribute"); - categoryEntityData.setType("static"); - categoryEntityData.setRequired(false); - categoryEntityData.setGroup("Content"); - categoryEntityData.setSortOrder(10); - categoryEntityData.setScope(AttributeScope.GLOBAL.getScope()); - - categoryEntityData.setDataPatchName("AddTestAttributeCategoryAttribute"); - categoryEntityData.setModuleName(MODULE_NAME); - - final CategoryFormXmlData categoryFormXmlData = new CategoryFormXmlData( - categoryEntityData.getGroup(), - categoryEntityData.getCode(), - categoryEntityData.getInput(), - categoryEntityData.getSortOrder() - ); - - final CategoryFormXmlGenerator categoryFormXmlGenerator = - new CategoryFormXmlGenerator(categoryFormXmlData, project, MODULE_NAME); - final PsiFile categoryForm = categoryFormXmlGenerator.generate("category_form"); - - final String fileCategoryForm = this.getFixturePath("category_form.xml"); - final PsiFile expectedCategoryFile = myFixture.configureByFile(fileCategoryForm); - - assertGeneratedFileIsCorrect( - expectedCategoryFile, - "src/app/code/Foo/Bar/view/adminhtml/ui_component", - categoryForm - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CronjobClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CronjobClassGeneratorTest.java deleted file mode 100644 index ca9360caa..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CronjobClassGeneratorTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.CronjobClassData; - -public class CronjobClassGeneratorTest extends BaseGeneratorTestCase { - - public void testGenerateFile() { - String filePath = this.getFixturePath("CleanTableCronjob.php"); - PsiFile expectedFile = myFixture.configureByFile(filePath); - - Project project = myFixture.getProject(); - CronjobClassData cronjobClassData = new CronjobClassData( - "CleanTableCronjob", - "Cron/Test", - "Foo\\Bar\\Cron\\Test", - "Foo_Bar" - ); - CronjobClassGenerator cronjobClassGenerator = new CronjobClassGenerator(project, cronjobClassData); - PsiFile cronJobFile = cronjobClassGenerator.generate("test"); - - assertGeneratedFileIsCorrect(expectedFile, "src/app/code/Foo/Bar/Cron/Test", cronJobFile); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CrontabXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CrontabXmlGeneratorTest.java deleted file mode 100644 index a17976746..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CrontabXmlGeneratorTest.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.CrontabXmlData; -import com.magento.idea.magento2plugin.magento.files.CrontabXmlTemplate; - -public class CrontabXmlGeneratorTest extends BaseGeneratorTestCase { - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String DEFAULT_CRON_GROUP = "default"; - private static final String INDEX_CRON_GROUP = "index"; - private static final String CRONJOB_INSTANCE_ONE = "Foo\\Bar\\Cron\\TestOne"; - private static final String CRONJOB_NAME_ONE = "test_cron_job_one"; - private static final String CRONJOB_INSTANCE_TWO = "Foo\\Bar\\Cron\\TestTwo"; - private static final String CRONJOB_NAME_TWO = "test_cron_job_two"; - private static final String CRONJOB_SCHEDULE = "* * * * *"; - private static final String CRONJOB_SCHEDULE_CONFIG_PATH = "path/to/config"; - - /** - * Test generating crontab with schedule. - */ - public void testGenerateCronTabXmlFileWithSchedule() { - final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiFile cronJobFile = addCronJobToCronTabXml( - DEFAULT_CRON_GROUP, - CRONJOB_NAME_ONE, - CRONJOB_INSTANCE_ONE, - CRONJOB_SCHEDULE, - null - ); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronJobFile); - } - - /** - * Test generating crontab with schedule config path. - */ - public void testGenerateCronTabXmlFileWithScheduleConfig() { - final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiFile cronJobFile = addCronJobToCronTabXml( - DEFAULT_CRON_GROUP, - CRONJOB_NAME_TWO, - CRONJOB_INSTANCE_TWO, - null, - CRONJOB_SCHEDULE_CONFIG_PATH - ); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronJobFile); - } - - /** - * Test adding two cronjobs to the crontab.xml with one cron groups. - */ - public void testAddTwoCronJobsToOneCronTab() { - final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - addCronJobToCronTabXml( - DEFAULT_CRON_GROUP, - CRONJOB_NAME_ONE, - CRONJOB_INSTANCE_ONE, - CRONJOB_SCHEDULE, - null - ); - final PsiFile cronJobFile = addCronJobToCronTabXml( - DEFAULT_CRON_GROUP, - CRONJOB_NAME_TWO, - CRONJOB_INSTANCE_TWO, - null, - CRONJOB_SCHEDULE_CONFIG_PATH - ); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronJobFile); - } - - /** - * Test adding two cronjobs to the crontab.xml with different cron groups. - */ - public void testAddTwoCronJobsToDifferentCronTabs() { - final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - addCronJobToCronTabXml( - DEFAULT_CRON_GROUP, - CRONJOB_NAME_ONE, - CRONJOB_INSTANCE_ONE, - CRONJOB_SCHEDULE, - null - ); - final PsiFile cronJobFile = addCronJobToCronTabXml( - INDEX_CRON_GROUP, - CRONJOB_NAME_TWO, - CRONJOB_INSTANCE_TWO, - null, - CRONJOB_SCHEDULE_CONFIG_PATH - ); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronJobFile); - } - - /** - * Add cronjob to crontab.xml. - * - * @param cronGroup Cron group name - * @param cronjobName Cron job name - * @param cronjobInstance Cron job instance FQN - * @param cronjobSchedule Cron job schedule - * @param cronjobScheduleConfigPath Cron job schedule config path - * @return PsiFile - */ - private PsiFile addCronJobToCronTabXml( - final String cronGroup, - final String cronjobName, - final String cronjobInstance, - final String cronjobSchedule, - final String cronjobScheduleConfigPath - ) { - final Project project = myFixture.getProject(); - final CrontabXmlData crontabXmlData = new CrontabXmlData( - MODULE_NAME, - cronGroup, - cronjobName, - cronjobInstance, - cronjobSchedule, - cronjobScheduleConfigPath - ); - final CrontabXmlGenerator cronjobClassGenerator = new CrontabXmlGenerator( - project, - crontabXmlData - ); - - return cronjobClassGenerator.generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CustomerAttributeSetupPatchGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CustomerAttributeSetupPatchGeneratorTest.java deleted file mode 100644 index bcd76c58c..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CustomerAttributeSetupPatchGeneratorTest.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.CustomerEntityData; -import com.magento.idea.magento2plugin.magento.packages.eav.AttributeInput; -import com.magento.idea.magento2plugin.magento.packages.eav.AttributeSourceModel; -import com.magento.idea.magento2plugin.magento.packages.eav.AttributeType; -import java.util.HashMap; -import java.util.Map; - -public class CustomerAttributeSetupPatchGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - - /** - * Test generating the customer attribute data patch. - */ - public void testGenerateMultiselectAttributeDataPatch() { - final Project project = myFixture.getProject(); - - final CustomerEntityData customerEntityData = new CustomerEntityData(); - customerEntityData.setCode("multiselect_test"); - customerEntityData.setLabel("Multiselect Test"); - customerEntityData.setVisible(true); - customerEntityData.setSource(AttributeSourceModel.TABLE.getSource()); - customerEntityData.setType(AttributeType.VARCHAR.getType()); - customerEntityData.setInput(AttributeInput.MULTISELECT.getInput()); - customerEntityData.setUserDefined(true); - customerEntityData.setSortOrder(10); - customerEntityData.setUseInAdminhtmlCustomerForm(true); - - final Map options = new HashMap<>(); - options.put(0, "option1"); - options.put(1, "option2"); - options.put(2, "option3"); - customerEntityData.setOptions(options); - - customerEntityData.setDataPatchName("AddMultiselectTestCustomerAttribute"); - customerEntityData.setModuleName(MODULE_NAME); - - - final CustomerEavAttributePatchGenerator setupPatchGenerator = - new CustomerEavAttributePatchGenerator(customerEntityData, project); - final PsiFile dataPatchFile = setupPatchGenerator.generate( - "testGenerateMultiselectAttributeDataPatch" - ); - - final String filePatch = this.getFixturePath("AddMultiselectTestCustomerAttribute.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePatch); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Setup/Patch/Data", - dataPatchFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelGeneratorTest.java deleted file mode 100644 index 87f81c8a2..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelGeneratorTest.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.NewDataModelAction; -import com.magento.idea.magento2plugin.actions.generation.data.DataModelData; - -public class DataModelGeneratorTest extends BaseGeneratorTestCase { - - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Model/Data"; - - /** - * Tests for generation of a Magento 2 Data Model. - */ - public void testGenerateDataModel() { - final Project project = myFixture.getProject(); - final DataModelData modelData = new DataModelData( - "Sample", - "SampleInterface", - "Foo_Bar", - "ID_PROPERTY;id_property;int;IdProperty;idProperty," - + "SAMPLE_PROPERTY;sample_property;string;SampleProperty;sampleProperty", - true - ); - final DataModelGenerator generator = new DataModelGenerator( - project, modelData - ); - final PsiFile modelFile = generator.generate(NewDataModelAction.ACTION_NAME); - final PsiFile expectedFile - = myFixture.configureByFile(this.getFixturePath("Sample.php")); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIRECTORY, - modelFile - ); - } - - /** - * Tests for generation of a Magento 2 Data Model without interface. - */ - public void testGenerateDataModelWithoutInterface() { - final Project project = myFixture.getProject(); - final DataModelData modelData = new DataModelData( - "Sample", - "SampleInterface", - "Foo_Bar", - "ID_PROPERTY;id_property;int;IdProperty;idProperty," - + "SAMPLE_PROPERTY;sample_property;string;SampleProperty;sampleProperty", - false - ); - final DataModelGenerator generator = new DataModelGenerator( - project, modelData - ); - final PsiFile modelFile = generator.generate(NewDataModelAction.ACTION_NAME); - final PsiFile expectedFile - = myFixture.configureByFile(this.getFixturePath("Sample.php")); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIRECTORY, - modelFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelInterfaceGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelInterfaceGeneratorTest.java deleted file mode 100644 index 6ad8b4076..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelInterfaceGeneratorTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.NewDataModelAction; -import com.magento.idea.magento2plugin.actions.generation.data.DataModelInterfaceData; - -public class DataModelInterfaceGeneratorTest extends BaseGeneratorTestCase { - - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Api/Data"; - - /** - * Tests for generation of a Magento 2 Data Model Interface. - */ - public void testGenerateDataModelInterface() { - final DataModelInterfaceGenerator generator = new DataModelInterfaceGenerator( - new DataModelInterfaceData( - "SampleInterface", - "Foo_Bar", - "ID_PROPERTY;id_property;int;IdProperty;idProperty," - + "SAMPLE_PROPERTY;sample_property;string;" - + "SampleProperty;sampleProperty" - ), - myFixture.getProject() - ); - final PsiFile interfaceFile = generator.generate(NewDataModelAction.ACTION_NAME); - final PsiFile expectedFile - = myFixture.configureByFile(this.getFixturePath("SampleInterface.php")); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, interfaceFile); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataProviderDeclarationGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataProviderDeclarationGeneratorTest.java deleted file mode 100644 index 8169e066a..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataProviderDeclarationGeneratorTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.DataProviderDeclarationData; -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class DataProviderDeclarationGeneratorTest extends BaseGeneratorTestCase { - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String CLASS_NAME = "MyVirtualClass"; - private static final String COLLECTION = "My/Collection"; - private static final String DATA_SOURCE = "my_grid_data_source"; - private static final String TABLE = "my_table"; - private static final String ACTION_NAME = "test"; - - /** - * Test checks whether menu.xml file generated correctly. - */ - public void testGenerateDataProviderDeclarationFile() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - generateDiXmlFile() - ); - } - - /** - * Generate Menu XML file. - * - * @return PsiFile - */ - private PsiFile generateDiXmlFile() { - final DataProviderDeclarationGenerator dataProviderDeclaration = - new DataProviderDeclarationGenerator( - new DataProviderDeclarationData( - MODULE_NAME, - CLASS_NAME, - COLLECTION, - DATA_SOURCE, - TABLE - ), - myFixture.getProject() - ); - return dataProviderDeclaration.generate(ACTION_NAME); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaWhitelistGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaWhitelistGeneratorTest.java deleted file mode 100644 index a8d747fa5..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaWhitelistGeneratorTest.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.magento.idea.magento2plugin.actions.generation.data.DbSchemaXmlData; -import com.magento.idea.magento2plugin.actions.generation.generator.util.DbSchemaGeneratorDataProviderUtil; -import com.magento.idea.magento2plugin.actions.generation.generator.util.DbSchemaGeneratorUtil; -import com.magento.idea.magento2plugin.magento.files.ModuleDbSchemaWhitelistJson; -import com.magento.idea.magento2plugin.magento.packages.database.ColumnAttributes; -import com.magento.idea.magento2plugin.magento.packages.database.TableColumnTypes; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -public class DbSchemaWhitelistGeneratorTest extends BaseGeneratorTestCase { - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - private static final String TABLE_NAME = "test_table"; - - /** - * Test whether db_schema_whitelist.json file generated correctly. - */ - public void testGenerateDbSchemaWhitelistJsonFile() { - final DbSchemaXmlData dbSchemaXmlData = new DbSchemaXmlData( - TABLE_NAME, - "", - "", - "", - createColumnsForTest() - ); - final DbSchemaWhitelistJsonGenerator dbSchemaWhitelistJsonGenerator = - new DbSchemaWhitelistJsonGenerator( - myFixture.getProject(), - dbSchemaXmlData, - MODULE_NAME - ); - - final String filePath = this.getFixturePath(ModuleDbSchemaWhitelistJson.FILE_NAME); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - dbSchemaWhitelistJsonGenerator.generate("test") - ); - } - - /** - * Test whether db_schema_whitelist.json file generated correctly - * when columns provided as short entity properties. - */ - public void testGenerateDbSchemaWhitelistJsonFileForShortProperties() { - final List> properties = - DbSchemaGeneratorDataProviderUtil.generateEntityPropertiesForTest(); - - final List> columnsData = - DbSchemaGeneratorUtil.complementShortPropertiesByDefaults(properties); - columnsData.add(0, DbSchemaGeneratorUtil.getTableIdentityColumnData("entity_id")); - - final DbSchemaXmlData dbSchemaXmlData = new DbSchemaXmlData( - TABLE_NAME, - "", - "", - "", - columnsData - ); - final DbSchemaWhitelistJsonGenerator dbSchemaWhitelistJsonGenerator = - new DbSchemaWhitelistJsonGenerator( - myFixture.getProject(), - dbSchemaXmlData, - MODULE_NAME - ); - - final String filePath = this.getFixturePath(ModuleDbSchemaWhitelistJson.FILE_NAME); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - dbSchemaWhitelistJsonGenerator.generate("test") - ); - } - - /** - * Generate columns for testcase. - * - * @return List - */ - private List> createColumnsForTest() { - final List> columns = new LinkedList<>(); - final Map entityIdColumnData = new LinkedHashMap<>(); - entityIdColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.INT.getColumnType() - ); - entityIdColumnData.put(ColumnAttributes.NAME.getName(), "entity_id"); - entityIdColumnData.put(ColumnAttributes.IDENTITY.getName(), "true"); - columns.add(entityIdColumnData); - final Map nameColumnData = new LinkedHashMap<>(); - nameColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.VARCHAR.getColumnType() - ); - nameColumnData.put(ColumnAttributes.NAME.getName(), "name"); - columns.add(nameColumnData); - final Map ageColumnData = new LinkedHashMap<>(); - ageColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.INT.getColumnType() - ); - ageColumnData.put(ColumnAttributes.NAME.getName(), "age"); - columns.add(ageColumnData); - final Map salaryColumnData = new LinkedHashMap<>(); - salaryColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.DECIMAL.getColumnType() - ); - salaryColumnData.put(ColumnAttributes.NAME.getName(), "salary"); - columns.add(salaryColumnData); - final Map dobColumnData = new LinkedHashMap<>(); - dobColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.DATE.getColumnType() - ); - dobColumnData.put(ColumnAttributes.NAME.getName(), "dob"); - columns.add(dobColumnData); - final Map createdAtColumnData = new LinkedHashMap<>(); - createdAtColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.TIMESTAMP.getColumnType() - ); - createdAtColumnData.put(ColumnAttributes.NAME.getName(), "created_at"); - columns.add(createdAtColumnData); - final Map updatedAtColumnData = new LinkedHashMap<>(); - updatedAtColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.TIMESTAMP.getColumnType() - ); - updatedAtColumnData.put(ColumnAttributes.NAME.getName(), "updated_at"); - columns.add(updatedAtColumnData); - - return columns; - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaXmlGeneratorTest.java deleted file mode 100644 index 5e31071f1..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaXmlGeneratorTest.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.magento.idea.magento2plugin.actions.generation.data.DbSchemaXmlData; -import com.magento.idea.magento2plugin.actions.generation.generator.util.DbSchemaGeneratorDataProviderUtil; -import com.magento.idea.magento2plugin.actions.generation.generator.util.DbSchemaGeneratorUtil; -import com.magento.idea.magento2plugin.magento.files.ModuleDbSchemaXml; -import com.magento.idea.magento2plugin.magento.packages.database.ColumnAttributes; -import com.magento.idea.magento2plugin.magento.packages.database.TableColumnTypes; -import com.magento.idea.magento2plugin.magento.packages.database.TableEngines; -import com.magento.idea.magento2plugin.magento.packages.database.TableResources; -import java.util.LinkedHashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -public class DbSchemaXmlGeneratorTest extends BaseGeneratorTestCase { - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - private static final String TABLE_NAME = "test_table"; - private static final String TABLE_COMMENT = "Test Table"; - private static final String BOOLEAN_VALUE_TRUE = "true"; - private static final String BOOLEAN_VALUE_FALSE = "false"; - private static final String CURRENT_TIMESTAMP_DEFAULT_VALUE = "CURRENT_TIMESTAMP"; - private static final String TABLE_RESOURCE = TableResources.DEFAULT.getResource(); - private static final String TABLE_ENGINE = TableEngines.INNODB.getEngine(); - - /** - * Test whether db_schema.xml file generated correctly. - */ - public void testGenerateDbSchemaXmlFile() { - final DbSchemaXmlData dbSchemaXmlData = new DbSchemaXmlData( - TABLE_NAME, - TABLE_RESOURCE, - TABLE_ENGINE, - TABLE_COMMENT, - createColumnsForTest() - ); - final DbSchemaXmlGenerator dbSchemaXmlGenerator = new DbSchemaXmlGenerator( - dbSchemaXmlData, - myFixture.getProject(), - MODULE_NAME - ); - - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - dbSchemaXmlGenerator.generate("test") - ); - } - - /** - * Test db_schema.xml file generation when columns provided as short entity properties. - */ - public void testGenerateDbSchemaXmlFileForShortProperties() { - final List> properties = - DbSchemaGeneratorDataProviderUtil.generateEntityPropertiesForTest(); - - final List> columnsData = - DbSchemaGeneratorUtil.complementShortPropertiesByDefaults(properties); - columnsData.add(0, DbSchemaGeneratorUtil.getTableIdentityColumnData("entity_id")); - - final DbSchemaXmlData dbSchemaXmlData = new DbSchemaXmlData( - TABLE_NAME, - TABLE_RESOURCE, - TABLE_ENGINE, - TABLE_COMMENT, - columnsData - ); - final DbSchemaXmlGenerator dbSchemaXmlGenerator = new DbSchemaXmlGenerator( - dbSchemaXmlData, - myFixture.getProject(), - MODULE_NAME - ); - - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - dbSchemaXmlGenerator.generate("test") - ); - } - - /** - * Generate columns for testcase. - * - * @return List - */ - @SuppressWarnings("PMD") - private List> createColumnsForTest() { - final List> columns = new LinkedList<>(); - final Map entityIdColumnData = new LinkedHashMap<>(); - entityIdColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.INT.getColumnType() - ); - entityIdColumnData.put(ColumnAttributes.NAME.getName(), "entity_id"); - entityIdColumnData.put(ColumnAttributes.PADDING.getName(), "11"); - entityIdColumnData.put(ColumnAttributes.UNSIGNED.getName(), BOOLEAN_VALUE_TRUE); - entityIdColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_FALSE); - entityIdColumnData.put(ColumnAttributes.IDENTITY.getName(), BOOLEAN_VALUE_TRUE); - entityIdColumnData.put(ColumnAttributes.COMMENT.getName(), "Entity Id Column"); - columns.add(entityIdColumnData); - final Map nameColumnData = new LinkedHashMap<>(); - nameColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.VARCHAR.getColumnType() - ); - nameColumnData.put(ColumnAttributes.NAME.getName(), "name"); - nameColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_FALSE); - nameColumnData.put(ColumnAttributes.LENGTH.getName(), "255"); - nameColumnData.put(ColumnAttributes.DEFAULT.getName(), "John Smith"); - nameColumnData.put(ColumnAttributes.COMMENT.getName(), "Name Column"); - columns.add(nameColumnData); - final Map ageColumnData = new LinkedHashMap<>(); - ageColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.INT.getColumnType() - ); - ageColumnData.put(ColumnAttributes.NAME.getName(), "age"); - ageColumnData.put(ColumnAttributes.PADDING.getName(), "5"); - ageColumnData.put(ColumnAttributes.UNSIGNED.getName(), BOOLEAN_VALUE_TRUE); - ageColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_TRUE); - ageColumnData.put(ColumnAttributes.IDENTITY.getName(), BOOLEAN_VALUE_FALSE); - ageColumnData.put(ColumnAttributes.COMMENT.getName(), "Age Column"); - columns.add(ageColumnData); - final Map salaryColumnData = new LinkedHashMap<>(); - salaryColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.DECIMAL.getColumnType() - ); - salaryColumnData.put(ColumnAttributes.NAME.getName(), "salary"); - salaryColumnData.put(ColumnAttributes.PADDING.getName(), "5"); - salaryColumnData.put(ColumnAttributes.UNSIGNED.getName(), BOOLEAN_VALUE_TRUE); - salaryColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_FALSE); - salaryColumnData.put(ColumnAttributes.PRECISION.getName(), "10"); - salaryColumnData.put(ColumnAttributes.SCALE.getName(), "2"); - salaryColumnData.put(ColumnAttributes.DEFAULT.getName(), "0.0"); - salaryColumnData.put(ColumnAttributes.COMMENT.getName(), "Salary Column"); - columns.add(salaryColumnData); - final Map dobColumnData = new LinkedHashMap<>(); - dobColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.DATE.getColumnType() - ); - dobColumnData.put(ColumnAttributes.NAME.getName(), "dob"); - dobColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_TRUE); - dobColumnData.put(ColumnAttributes.COMMENT.getName(), "Date Of The Birth Column"); - columns.add(dobColumnData); - final Map createdAtColumnData = new LinkedHashMap<>(); - createdAtColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.TIMESTAMP.getColumnType() - ); - createdAtColumnData.put(ColumnAttributes.NAME.getName(), "created_at"); - createdAtColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_FALSE); - createdAtColumnData.put(ColumnAttributes.ON_UPDATE.getName(), BOOLEAN_VALUE_FALSE); - createdAtColumnData.put( - ColumnAttributes.DEFAULT.getName(), - CURRENT_TIMESTAMP_DEFAULT_VALUE - ); - createdAtColumnData.put(ColumnAttributes.COMMENT.getName(), "Created At Column"); - columns.add(createdAtColumnData); - final Map updatedAtColumnData = new LinkedHashMap<>(); - updatedAtColumnData.put( - ColumnAttributes.TYPE.getName(), - TableColumnTypes.TIMESTAMP.getColumnType() - ); - updatedAtColumnData.put(ColumnAttributes.NAME.getName(), "updated_at"); - updatedAtColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_FALSE); - updatedAtColumnData.put(ColumnAttributes.ON_UPDATE.getName(), BOOLEAN_VALUE_TRUE); - updatedAtColumnData.put( - ColumnAttributes.DEFAULT.getName(), - CURRENT_TIMESTAMP_DEFAULT_VALUE - ); - updatedAtColumnData.put(ColumnAttributes.COMMENT.getName(), "Updated At Column"); - columns.add(updatedAtColumnData); - - return columns; - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityCommandGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityCommandGeneratorTest.java deleted file mode 100644 index ee0a271fe..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityCommandGeneratorTest.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; -import com.magento.idea.magento2plugin.actions.generation.data.DeleteEntityByIdCommandData; -import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; -import com.magento.idea.magento2plugin.magento.files.commands.DeleteEntityByIdCommandFile; - -public class DeleteEntityCommandGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Book"; - private static final String MODEL_NAME = ENTITY_NAME + "Model"; - private static final String RESOURCE_MODEL_NAME = ENTITY_NAME + "Resource"; - private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Command/" + ENTITY_NAME; - private static final String ENTITY_ID = "book_id"; - private static final String ACL = "Foo_Bar::book_management"; - - @Override - public void setUp() throws Exception { - super.setUp(); - final EntityCreatorContext context = new EntityCreatorContext(); - context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); - context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID); - GenerationContextRegistry.getInstance().setContext(context); - } - - /** - * Test generation of DeleteByIdCommand model for entity. - */ - public void testGenerateDeleteEntityByIdCommandFile() { - final DeleteEntityByIdCommandData deleteEntityByIdCommandData = - new DeleteEntityByIdCommandData( - MODULE_NAME, - ENTITY_NAME, - ENTITY_ID, - MODEL_NAME, - RESOURCE_MODEL_NAME, - ACL - ); - final DeleteEntityByIdCommandGenerator deleteEntityByIdCommandGenerator = - new DeleteEntityByIdCommandGenerator( - deleteEntityByIdCommandData, - myFixture.getProject(), - false - ); - final String filePath = this.getFixturePath( - new DeleteEntityByIdCommandFile(MODULE_NAME, ENTITY_NAME).getFileName() - ); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiFile deleteEntityCommandFile = deleteEntityByIdCommandGenerator.generate("test"); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIRECTORY, - deleteEntityCommandFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityGeneratorTest.java deleted file mode 100644 index d11ead6ef..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityGeneratorTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; -import com.magento.idea.magento2plugin.actions.generation.data.DeleteEntityControllerFileData; -import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; -import com.magento.idea.magento2plugin.magento.files.actions.DeleteActionFile; - -public class DeleteEntityGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Company"; - private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\CompanyData"; - private static final String ACL = "Foo_Bar::company_id"; - private static final String ENTITY_ID = "company_id"; - private static final String EXPECTED_DIRECTORY = - "/src/app/code/Foo/Bar/Controller/Adminhtml/" + ENTITY_NAME; - - @Override - public void setUp() throws Exception { - super.setUp(); - final EntityCreatorContext context = new EntityCreatorContext(); - context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); - context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID); - GenerationContextRegistry.getInstance().setContext(context); - } - - /** - * Test generation of Delete controller. - */ - public void testGenerateDeleteEntityFile() { - final DeleteEntityControllerFileData deleteEntityControllerFileData = - new DeleteEntityControllerFileData( - ENTITY_NAME, - MODULE_NAME, - ACL, - ENTITY_ID, - false - ); - final DeleteEntityControllerFileGenerator deleteEntityControllerFileGenerator = - new DeleteEntityControllerFileGenerator( - deleteEntityControllerFileData, - myFixture.getProject() - ); - final PsiFile deleteEntityActionFile = - deleteEntityControllerFileGenerator.generate("test"); - final String filePath = - this.getFixturePath(new DeleteActionFile(MODULE_NAME, ENTITY_NAME).getFileName()); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIRECTORY, - deleteEntityActionFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EditEntityActionGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EditEntityActionGeneratorTest.java deleted file mode 100644 index 5d3040662..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EditEntityActionGeneratorTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.EditEntityActionData; -import com.magento.idea.magento2plugin.magento.files.actions.EditActionFile; - -public class EditEntityActionGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Book"; - private static final String EXPECTED_DIRECTORY = - "/src/app/code/Foo/Bar/Controller/Adminhtml/" + ENTITY_NAME; - private static final String ACL = "Foo_Bar::management"; - private static final String MENU = "Foo_Bar::management"; - - /** - * Test generation of edit entity controller file. - */ - public void testGenerateEditEntityActionFile() { - final EditActionFile file = new EditActionFile(MODULE_NAME, ENTITY_NAME); - final EditEntityActionGenerator generator = - new EditEntityActionGenerator( - new EditEntityActionData( - ENTITY_NAME, - MODULE_NAME, - ACL, - MENU - ), - myFixture.getProject(), - false - ); - - final PsiFile resultFile = generator.generate("test"); - final String filePath = this.getFixturePath(file.getFileName()); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIRECTORY, - resultFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EntityDataMapperClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EntityDataMapperClassGeneratorTest.java deleted file mode 100644 index 8654857c2..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EntityDataMapperClassGeneratorTest.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.magento.idea.magento2plugin.actions.generation.data.EntityDataMapperData; -import com.magento.idea.magento2plugin.magento.files.EntityDataMapperFile; - -public class EntityDataMapperClassGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Mapper"; - private static final String ENTITY_NAME = "Unicorn"; - private static final String MODEL_NAME = "UnicornModel"; - private static final String DTO_NAME = "UnicornData"; - private static final String DTO_INTERFACE_NAME = "UnicornDataInterface"; - private static final boolean DTO_HAS_INTERFACE = true; - - /** - * Test generation of entity data mapper class. - */ - public void testGenerateEntityDataMapperFile() { - final EntityDataMapperData entityDataMapperData = new EntityDataMapperData( - MODULE_NAME, - ENTITY_NAME, - MODEL_NAME, - DTO_NAME, - DTO_INTERFACE_NAME, - DTO_HAS_INTERFACE - ); - final EntityDataMapperGenerator entityDataMapperGenerator = - new EntityDataMapperGenerator( - entityDataMapperData, - myFixture.getProject(), - false - ); - final EntityDataMapperFile entityDataMapperFile = - new EntityDataMapperFile(MODULE_NAME, ENTITY_NAME); - final String filePath = this.getFixturePath(entityDataMapperFile.getFileName()); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - entityDataMapperGenerator.generate("test") - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormButtonBlockGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormButtonBlockGeneratorTest.java deleted file mode 100644 index c80afe551..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormButtonBlockGeneratorTest.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; -import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormButtonData; -import com.magento.idea.magento2plugin.actions.generation.generator.util.NamespaceBuilder; -import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; -import org.junit.Before; - -public class FormButtonBlockGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String FORM_NAME = "my_form"; - private static final String ENTITY_NAME = "Book"; - private static final String BLOCK_DIRECTORY = "Block/Form/" + ENTITY_NAME; - private static final String ACTION_NAME = "test"; - private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; - private static final String ENTITY_ID = "book_id"; - public static final String EXPECTED_DIRECTORY - = "src/app/code/Foo/Bar/Block/Form/" + ENTITY_NAME; - - @Override - @Before - public void setUp() throws Exception { - super.setUp(); - final EntityCreatorContext context = new EntityCreatorContext(); - context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); - context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID); - GenerationContextRegistry.getInstance().setContext(context); - } - - /** - * Test creation Block type Save. - */ - public void testGenerateSaveButtonBlock() { - final String filePath = this.getFixturePath("SaveBlock.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final String className = "SaveBlock"; - final NamespaceBuilder namespace = new NamespaceBuilder( - MODULE_NAME, - className, - BLOCK_DIRECTORY - ); - - final UiComponentFormButtonData uiComponentFormButtonData = new UiComponentFormButtonData( - BLOCK_DIRECTORY, - className, - MODULE_NAME, - "Save", - namespace.getNamespace(), - "Save Entity", - "10", - FORM_NAME, - namespace.getClassFqn() - ); - final UiComponentFormButtonBlockGenerator formButtonPhpClassGenerator = - new UiComponentFormButtonBlockGenerator( - uiComponentFormButtonData, - project, - ENTITY_NAME, - ENTITY_ID, - false - ); - - final PsiFile file = formButtonPhpClassGenerator.generate(ACTION_NAME); - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } - - /** - * Test creation Block type Back. - */ - public void testGenerateBackButtonBlock() { - final String filePath = this.getFixturePath("MyBackButton.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final String className = "MyBackButton"; - final NamespaceBuilder namespace = new NamespaceBuilder( - MODULE_NAME, - className, - BLOCK_DIRECTORY - ); - - final UiComponentFormButtonData uiComponentFormButtonData = new UiComponentFormButtonData( - BLOCK_DIRECTORY, - className, - MODULE_NAME, - "Back", - namespace.getNamespace(), - "Back Button", - "20", - FORM_NAME, - namespace.getClassFqn() - ); - final UiComponentFormButtonBlockGenerator formButtonPhpClassGenerator = - new UiComponentFormButtonBlockGenerator( - uiComponentFormButtonData, - project, - ENTITY_NAME, - ENTITY_ID, - false - ); - - final PsiFile file = formButtonPhpClassGenerator.generate(ACTION_NAME); - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } - - /** - * Test creation Block type Delete. - */ - public void testGenerateDeleteButtonBlock() { - final String filePath = this.getFixturePath("DeleteBlock.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final String className = "DeleteBlock"; - final NamespaceBuilder namespace = new NamespaceBuilder( - MODULE_NAME, - className, - BLOCK_DIRECTORY - ); - - final UiComponentFormButtonData uiComponentFormButtonData = new UiComponentFormButtonData( - BLOCK_DIRECTORY, - className, - MODULE_NAME, - "Delete", - namespace.getNamespace(), - "Delete Entity", - "30", - FORM_NAME, - namespace.getClassFqn() - ); - final UiComponentFormButtonBlockGenerator generator = - new UiComponentFormButtonBlockGenerator( - uiComponentFormButtonData, - project, - ENTITY_NAME, - ENTITY_ID, - false - ); - - final PsiFile file = generator.generate(ACTION_NAME); - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } - - /** - * Test creation Block custom type. - */ - public void testGenerateCustomButtonBlock() { - final String filePath = this.getFixturePath("MyCustom.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final String className = "MyCustom"; - final NamespaceBuilder namespace = new NamespaceBuilder( - MODULE_NAME, - className, - BLOCK_DIRECTORY - ); - - final UiComponentFormButtonData uiComponentFormButtonData = new UiComponentFormButtonData( - BLOCK_DIRECTORY, - className, - MODULE_NAME, - "Custom", - namespace.getNamespace(), - "My Custom Button", - "40", - FORM_NAME, - namespace.getClassFqn() - ); - final UiComponentFormButtonBlockGenerator formButtonPhpClassGenerator = - new UiComponentFormButtonBlockGenerator( - uiComponentFormButtonData, - project, - ENTITY_NAME, - ENTITY_ID, - false - ); - - final PsiFile file = formButtonPhpClassGenerator.generate(ACTION_NAME); - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormGenericButtonBlockGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormGenericButtonBlockGeneratorTest.java deleted file mode 100644 index 8f500851e..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormGenericButtonBlockGeneratorTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; -import com.magento.idea.magento2plugin.actions.generation.data.FormGenericButtonBlockData; -import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; -import com.magento.idea.magento2plugin.magento.files.FormGenericButtonBlockFile; - -public class FormGenericButtonBlockGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Book"; - private static final String ENTITY_ID = "book_id"; - private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; - private static final String EXPECTED_DIRECTORY - = "src/app/code/Foo/Bar/Block/Form/" + ENTITY_NAME; - - @Override - public void setUp() throws Exception { - super.setUp(); - final EntityCreatorContext context = new EntityCreatorContext(); - context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); - context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID); - GenerationContextRegistry.getInstance().setContext(context); - } - - /** - * Test generation of form ui component generic button block. - */ - public void testGenerateFormGenericButtonBlockFile() { - final FormGenericButtonBlockData data = new FormGenericButtonBlockData( - MODULE_NAME, - ENTITY_NAME, - ENTITY_ID - ); - final FormGenericButtonBlockGenerator generator = - new FormGenericButtonBlockGenerator( - data, - myFixture.getProject(), - false - ); - final String filePath = this.getFixturePath( - new FormGenericButtonBlockFile(MODULE_NAME, ENTITY_NAME).getFileName() - ); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - generator.generate("test") - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/GridActionColumnFileGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/GridActionColumnFileGeneratorTest.java deleted file mode 100644 index b21d31d1f..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/GridActionColumnFileGeneratorTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; -import com.magento.idea.magento2plugin.actions.generation.data.GridActionColumnData; -import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; -import com.magento.idea.magento2plugin.magento.files.GridActionColumnFile; - -public class GridActionColumnFileGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Book"; - private static final String ENTITY_ID_COLUMN = "book_id"; - private static final String EDIT_URL_PATH = "book_book_edit"; - private static final String DELETE_URL_PATH = "book_book_delete"; - private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; - - @Override - public void setUp() throws Exception { - super.setUp(); - final EntityCreatorContext context = new EntityCreatorContext(); - context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); - context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID_COLUMN); - GenerationContextRegistry.getInstance().setContext(context); - } - - /** - * Test generation of grid actions column file. - */ - public void testGenerateGridActionColumnFile() { - final GridActionColumnFile file = new GridActionColumnFile(MODULE_NAME, ENTITY_NAME); - final GridActionColumnData data = new GridActionColumnData( - MODULE_NAME, - ENTITY_NAME, - ENTITY_ID_COLUMN, - EDIT_URL_PATH, - DELETE_URL_PATH - ); - final String filePath = this.getFixturePath(file.getFileName()); - final GridActionColumnFileGenerator generator = - new GridActionColumnFileGenerator(data, myFixture.getProject(), false); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - "src/app/code/Foo/Bar/".concat(file.getDirectory()), - generator.generate("test") - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/IndexControllerGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/IndexControllerGeneratorTest.java deleted file mode 100644 index 68b821448..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/IndexControllerGeneratorTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.magento.idea.magento2plugin.actions.generation.data.IndexActionData; -import com.magento.idea.magento2plugin.magento.files.actions.IndexActionFile; - -public class IndexControllerGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Book"; - private static final String ACL = "Foo_Bar::book_management"; - private static final String MENU = "Foo_Bar::book_management_menu"; - - /** - * Test generation of list view entity controller (adminhtml). - */ - public void testGenerateIndexControllerFile() { - final IndexActionFile file = new IndexActionFile(MODULE_NAME, ENTITY_NAME); - final IndexActionData data = new IndexActionData( - MODULE_NAME, - ENTITY_NAME, - ACL, - MENU - ); - final String filePath = this.getFixturePath(file.getFileName()); - final IndexActionGenerator generator = - new IndexActionGenerator(data, myFixture.getProject(), false); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - "src/app/code/Foo/Bar/".concat(file.getDirectory()), - generator.generate("test") - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/LayoutXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/LayoutXmlGeneratorTest.java deleted file mode 100644 index 3dbf17100..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/LayoutXmlGeneratorTest.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.LayoutXmlData; -import com.magento.idea.magento2plugin.magento.packages.Areas; - -public class LayoutXmlGeneratorTest extends BaseGeneratorTestCase { - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/view/adminhtml/layout"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ROUTE = "customroute"; - private static final String CONTROLLER_NAME = "Entity"; - private static final String ACTION_NAME = "View"; - private static final String FORM_NAME = "my_form"; - private static final String FILE_NAME = "customroute_entity_view.xml"; - - /** - * Test generating layout XML file. - */ - public void testGenerateLayoutXmlFile() { - final String filePath = this.getFixturePath(FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final LayoutXmlData layoutXmlData = new LayoutXmlData( - Areas.adminhtml.toString(), - ROUTE, - MODULE_NAME, - CONTROLLER_NAME, - ACTION_NAME, - FORM_NAME - ); - final LayoutXmlGenerator cronjobClassGenerator = new LayoutXmlGenerator( - layoutXmlData, - project - ); - - final PsiFile file = cronjobClassGenerator.generate("test"); - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MenuXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MenuXmlGeneratorTest.java deleted file mode 100644 index b1d12ea6d..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MenuXmlGeneratorTest.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.MenuXmlData; -import com.magento.idea.magento2plugin.magento.files.ModuleMenuXml; - -public class MenuXmlGeneratorTest extends BaseGeneratorTestCase { - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc/adminhtml"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ACL_ID = "Foo_Bar::acl"; - private static final String MENU_IDENTIFIER = "Foo_Bar::menu"; - private static final String MENU_TITLE = "My Title"; - private static final String PARENT_MENU = "Magento_Customer::customer"; - private static final String ACTION_NAME = "test"; - - /** - * Test checks whether menu.xml file generated correctly. - */ - public void testGenerateMenuXmlFile() { - final String filePath = this.getFixturePath(ModuleMenuXml.fileName); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - generateMenuXmlFile() - ); - } - - /** - * Generate Menu XML file. - * - * @return PsiFile - */ - private PsiFile generateMenuXmlFile() { - final MenuXmlGenerator menuXmlGenerator = new MenuXmlGenerator( - new MenuXmlData( - PARENT_MENU, - "10", - MODULE_NAME, - MENU_IDENTIFIER, - MENU_TITLE, - ACL_ID, - ACTION_NAME - ), - myFixture.getProject() - ); - return menuXmlGenerator.generate(ACTION_NAME); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MessageQueueClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MessageQueueClassGeneratorTest.java deleted file mode 100644 index 84cfc1d77..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MessageQueueClassGeneratorTest.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.MessageQueueClassData; -import com.magento.idea.magento2plugin.magento.files.MessageQueueClassPhp; - -public class MessageQueueClassGeneratorTest extends BaseGeneratorTestCase { - private static final String MODULE_NAME = "Foo_Bar"; - - private static final String HANDLER_EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Queue/Handler"; - private static final String HANDLER_CLASS_NAME = "MyHandler"; - private static final String HANDLER_NAMESPACE = "Foo\\Bar\\Queue\\Handler"; - private static final String HANDLER_PATH = "Queue/Handler"; - private static final String HANDLER_FQN = "\\Foo\\Bar\\Queue\\Handler\\MyHandler"; - - private static final String CONSUMER_EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Queue/Consumer"; - private static final String CONSUMER_CLASS_NAME = "MyConsumer"; - private static final String CONSUMER_NAMESPACE = "Foo\\Bar\\Queue\\Consumer"; - private static final String CONSUMER_PATH = "Queue/Consumer"; - private static final String CONSUMER_FQN = "\\Foo\\Bar\\Queue\\Handler\\MyConsumer"; - - /** - * Test handler class file generation. - */ - public void testGenerateHandler() { - final Project project = myFixture.getProject(); - final MessageQueueClassData messageQueueClassData = new MessageQueueClassData( - HANDLER_CLASS_NAME, - HANDLER_NAMESPACE, - HANDLER_PATH, - HANDLER_FQN, - MessageQueueClassPhp.Type.HANDLER - ); - final MessageQueueClassGenerator generator; - generator = new MessageQueueClassGenerator( - messageQueueClassData, - MODULE_NAME, - project - ); - - final PsiFile messageQueue = generator.generate("test"); - final String filePath = this.getFixturePath("MyHandler.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - HANDLER_EXPECTED_DIRECTORY, - messageQueue - ); - } - - /** - * Test consumer class file generation. - */ - public void testGenerateConsumer() { - final Project project = myFixture.getProject(); - final MessageQueueClassData messageQueueClassData = new MessageQueueClassData( - CONSUMER_CLASS_NAME, - CONSUMER_NAMESPACE, - CONSUMER_PATH, - CONSUMER_FQN, - MessageQueueClassPhp.Type.CONSUMER - ); - final MessageQueueClassGenerator generator; - generator = new MessageQueueClassGenerator( - messageQueueClassData, - MODULE_NAME, - project - ); - - final PsiFile messageQueue = generator.generate("test"); - final String filePath = this.getFixturePath("MyConsumer.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - CONSUMER_EXPECTED_DIRECTORY, - messageQueue - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleBlockClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleBlockClassGeneratorTest.java deleted file mode 100644 index 285e4491a..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleBlockClassGeneratorTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.BlockFileData; - -public class ModuleBlockClassGeneratorTest extends BaseGeneratorTestCase { - - /** - * Test Block generator - */ - public void testGenerateFile() { - Project project = myFixture.getProject(); - - BlockFileData blockData = new BlockFileData( - "Block/Test", - "ViewBlock", - "Foo_Bar", - "Foo\\Bar\\Block\\Test" - ); - ModuleBlockClassGenerator moduleBlockClassGenerator = new ModuleBlockClassGenerator(blockData, project); - PsiFile blockFile = moduleBlockClassGenerator.generate("test"); - - String filePath = this.getFixturePath("ViewBlock.php"); - PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect(expectedFile, "src/app/code/Foo/Bar/Block/Test", blockFile); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java deleted file mode 100644 index d3aac20ce..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.CollectionData; - -public class ModuleCollectionGeneratorTest extends BaseGeneratorTestCase { - - /** - * Test generation of collection file. - */ - public void testGenerateFile() { - final Project project = myFixture.getProject(); - final CollectionData collectionFileData = new CollectionData( - "Foo_Bar", - "my_table", - "TestModel", - "TestResource", - "TestCollection", - "TestModel" - ); - final ModuleCollectionGenerator generator = new ModuleCollectionGenerator( - collectionFileData, - project - ); - final PsiFile collectionFile = generator.generate("test"); - final String filePath = this.getFixturePath("TestCollection.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Model/ResourceModel/TestModel", - collectionFile - ); - } - - /** - * Test generation of collection file where resource model name equal to the model name. - */ - public void testGenerateWithTheSameNamesForResourceModelAndModel() { - final PsiFile collectionFile = new ModuleCollectionGenerator( - new CollectionData( - "Foo_Bar", - "my_table", - "Test", - "Test", - "Collection", - "Test" - ), - myFixture.getProject() - ).generate("test"); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(this.getFixturePath("Collection.php")), - "src/app/code/Foo/Bar/Model/ResourceModel/Test", - collectionFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGeneratorTest.java deleted file mode 100644 index f02c36460..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGeneratorTest.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ModuleComposerJsonData; -import com.magento.idea.magento2plugin.magento.files.ComposerJson; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -public class ModuleComposerJsonGeneratorTest extends BaseGeneratorTestCase { - - /** - * Test for the module composer.json generation with dependencies. - */ - public void testGenerateModuleFile() { - final String filePath = this.getFixturePath(ComposerJson.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiDirectory projectDir = getProjectDirectory(); - - final String expectedDirectory = - projectDir.getVirtualFile().getPath() + "/TestWithDependencies/Test"; - final PsiFile composerJson = generateComposerJson( - true, - projectDir, - true, - "TestWithDependencies"); - - assertGeneratedFileIsCorrect( - expectedFile, - expectedDirectory, - composerJson - ); - } - - /** - * Test for generation the composer.json with dependencies in the root directory. - */ - public void testGenerateFileInRoot() { - final String filePath = this.getFixturePath(ComposerJson.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiDirectory projectDir = getProjectDirectory(); - - final String composerJsonDirPath = projectDir.getVirtualFile().getPath(); - final PsiFile composerJson = generateComposerJson( - false, - projectDir, - true, - "TestWithDependencies"); - - assertGeneratedFileIsCorrect(expectedFile, composerJsonDirPath, composerJson); - } - - /** - * Test case for the composer.json generation without dependencies. - */ - public void testGenerateModuleFileWithoutDependencies() { - final String filePath = this.getFixturePath(ComposerJson.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiDirectory projectDir = getProjectDirectory(); - final String expectedDirectory = projectDir.getVirtualFile().getPath() - + "/TestWithoutDependencies/Test"; - final PsiFile composerJson = generateComposerJson( - true, - projectDir, - false, - "TestWithoutDependencies"); - - assertGeneratedFileIsCorrect( - expectedFile, - expectedDirectory, - composerJson - ); - } - - /** - * Generate composer.json file for tests. - * - * @param createModuleDirectories create module directory flag - * @param projectDir project directory - * @param withDependencies generate composer.json with dependencies or not - * @param packageName the package name of the test module - * @return PsiFile - */ - private PsiFile generateComposerJson( - final boolean createModuleDirectories, - final PsiDirectory projectDir, - final boolean withDependencies, - final String packageName) { - final Project project = myFixture.getProject(); - final List dependencies = withDependencies - ? new ArrayList<>(Arrays.asList("Foo_Bar", "Magento_Backend")) - : new ArrayList<>(Arrays.asList("Foo_BarWithOutComposer")); - final List licenses = new ArrayList<>( - Arrays.asList("Test License 1", "Test License 2") - ); - final ModuleComposerJsonData composerJsonData = new ModuleComposerJsonData( - packageName, - "Test", - projectDir, - "test-description", - "test/module-test", - "1.0.0-dev", - licenses, - dependencies, - createModuleDirectories - ); - final ModuleComposerJsonGenerator composerJsonGenerator = - new ModuleComposerJsonGenerator(composerJsonData, project); - return composerJsonGenerator.generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGeneratorTest.java deleted file mode 100644 index d828cc9fe..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGeneratorTest.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ControllerFileData; - -public class ModuleControllerClassGeneratorTest extends BaseGeneratorTestCase { - /** - * Test generation of frontend controller file. - */ - public void testGenerateFrontendControllerFile() { - final Project project = myFixture.getProject(); - final ControllerFileData controllerFileData = new ControllerFileData( - "Controller/Entity", - "GetAction", - "Foo_Bar", - "frontend", - "GET", - "", - false, - "Foo\\Bar\\Controller\\Entity" - ); - final ModuleControllerClassGenerator generator = new ModuleControllerClassGenerator( - controllerFileData, - project - ); - final PsiFile controllerFile = generator.generate("test"); - final String filePath = this.getFixturePath("GetAction.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Controller/Entity", - controllerFile - ); - } - - /** - * Test generation of frontend controller file with action class inheritance. - */ - public void testGenerateFrontendInheritActionControllerFile() { - final Project project = myFixture.getProject(); - final ControllerFileData controllerFileData = new ControllerFileData( - "Controller/Entity", - "DeleteAction", - "Foo_Bar", - "frontend", - "DELETE", - "", - true, - "Foo\\Bar\\Controller\\Entity" - ); - final ModuleControllerClassGenerator generator = new ModuleControllerClassGenerator( - controllerFileData, - project - ); - final PsiFile controllerFile = generator.generate("test"); - final String filePath = this.getFixturePath("DeleteAction.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Controller/Entity", - controllerFile - ); - } - - /** - * Test generation of backend controller file. - */ - public void testGenerateBackendControllerFile() { - final Project project = myFixture.getProject(); - final ControllerFileData controllerFileData = new ControllerFileData( - "Controller/Adminhtml/Entity", - "BackendSaveAction", - "Foo_Bar", - "adminhtml", - "POST", - "Foo_Bar::entity", - true, - "Foo\\Bar\\Controller\\Adminhtml\\Entity" - ); - final ModuleControllerClassGenerator generator = new ModuleControllerClassGenerator( - controllerFileData, - project - ); - final PsiFile controllerFile = generator.generate("test"); - final String filePath = this.getFixturePath("BackendSaveAction.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Controller/Adminhtml/Entity", - controllerFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCronGroupXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCronGroupXmlGeneratorTest.java deleted file mode 100644 index 166d5e147..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCronGroupXmlGeneratorTest.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.CronGroupXmlData; -import com.magento.idea.magento2plugin.magento.files.CronGroupXmlTemplate; - -public class ModuleCronGroupXmlGeneratorTest extends BaseGeneratorTestCase { - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String CRON_GROUP_NAME_ONE = "custom_cron_group_one"; - private static final String CRON_GROUP_NAME_TWO = "custom_cron_group_two"; - private static final int SCHEDULE_GENERATE_EVERY = 1; - private static final int SCHEDULE_AHEAD_FOR = 4; - private static final int SCHEDULE_LIFETIME = 2; - private static final int HISTORY_CLEANUP_EVERY = 10; - private static final int HISTORY_SUCCESS_LIFETIME = 60; - private static final int HISTORY_FAILURE_LIFETIME = 600; - private static final int USE_SEPARATE_PROCESS = 1; - - /** - * Test generating CRON group with no options. - */ - public void testGenerateEmptyCronGroup() { - final String filePath = this.getFixturePath(CronGroupXmlTemplate.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiFile cronGroupsXmlFile = addCronGroupToCronGroupsXml( - CRON_GROUP_NAME_ONE, - null, - null, - null, - null, - null, - null, - null - ); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronGroupsXmlFile); - } - - /** - * Test generating CRON group with all options. - */ - public void testGenerateCronGroupWithAllOptions() { - final String filePath = this.getFixturePath(CronGroupXmlTemplate.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiFile cronGroupsXmlFile = addCronGroupToCronGroupsXml( - CRON_GROUP_NAME_TWO, - SCHEDULE_GENERATE_EVERY, - SCHEDULE_AHEAD_FOR, - SCHEDULE_LIFETIME, - HISTORY_CLEANUP_EVERY, - HISTORY_SUCCESS_LIFETIME, - HISTORY_FAILURE_LIFETIME, - USE_SEPARATE_PROCESS - ); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronGroupsXmlFile); - } - - /** - * Test adding two CRON groups to the cron_groups.xml. - */ - public void testAddTwoCronGroupsToCronGroupsXmlFile() { - final String filePath = this.getFixturePath(CronGroupXmlTemplate.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - addCronGroupToCronGroupsXml( - CRON_GROUP_NAME_ONE, - null, - null, - null, - null, - null, - null, - null - ); - final PsiFile cronGroupsXmlFile = addCronGroupToCronGroupsXml( - CRON_GROUP_NAME_TWO, - SCHEDULE_GENERATE_EVERY, - SCHEDULE_AHEAD_FOR, - SCHEDULE_LIFETIME, - HISTORY_CLEANUP_EVERY, - HISTORY_SUCCESS_LIFETIME, - HISTORY_FAILURE_LIFETIME, - USE_SEPARATE_PROCESS - ); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronGroupsXmlFile); - } - - /** - * Add CRON group to cron_groups.xml. - * - * @param cronGroupName CRON group name - * @param scheduleGenerateEvery Schedule generate every - * @param scheduleAheadFor Schedule ahead for - * @param scheduleLifetime Schedule lifetime - * @param historyCleanupEvery History cleanup every - * @param historySuccessLifetime History success lifetime - * @param historyFailureLifetime History failure lifetime - * @param useSeparateProcess Use separate process - * @return PsiFile - */ - private PsiFile addCronGroupToCronGroupsXml( - final String cronGroupName, - final Integer scheduleGenerateEvery, - final Integer scheduleAheadFor, - final Integer scheduleLifetime, - final Integer historyCleanupEvery, - final Integer historySuccessLifetime, - final Integer historyFailureLifetime, - final Integer useSeparateProcess - ) { - final Project project = myFixture.getProject(); - final CronGroupXmlData cronGroupXmlData = new CronGroupXmlData( - MODULE_NAME, - cronGroupName, - scheduleGenerateEvery, - scheduleAheadFor, - scheduleLifetime, - historyCleanupEvery, - historySuccessLifetime, - historyFailureLifetime, - useSeparateProcess - ); - final ModuleCronGroupXmlGenerator cronGroupXmlGenerator = new ModuleCronGroupXmlGenerator( - cronGroupXmlData, - project - ); - - return cronGroupXmlGenerator.generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplateHtmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplateHtmlGeneratorTest.java deleted file mode 100644 index 5e5bfa193..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplateHtmlGeneratorTest.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.EmailTemplateHtmlData; -import com.magento.idea.magento2plugin.magento.files.EmailTemplateHtml; -import com.magento.idea.magento2plugin.magento.packages.Areas; - -public class ModuleEmailTemplateHtmlGeneratorTest extends BaseGeneratorTestCase { - private static final String EMAIL_TEMPLATE_DIR = "src/app/code/Foo/Bar/view/%s/email"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EMAIL_TEMPLATE_FILE_NAME_HTML = "custom_email_template_html"; - private static final String EMAIL_TEMPLATE_FILE_NAME_TEXT = "custom_email_template_text"; - private static final String EMAIL_TEMPLATE_SUBJECT_HTML = "HTML Email Template Subject"; - private static final String EMAIL_TEMPLATE_SUBJECT_TEXT = "TEXT Email Template Subject"; - - /** - * Test generating email template with HTML type. - */ - public void testGenerateEmailTemplateHtml() { - final String filePath = this.getFixturePath( - String.format( - "%s.%s", - EMAIL_TEMPLATE_FILE_NAME_HTML, - EmailTemplateHtml.HTML_FILE_EXTENSION - ) - ); - final String area = Areas.adminhtml.toString(); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiFile emailTemplateXmlFile = generateEmailTemplateHtml( - EMAIL_TEMPLATE_FILE_NAME_HTML, - EMAIL_TEMPLATE_SUBJECT_HTML, - EmailTemplateHtml.HTML_TYPE, - area - ); - - assertGeneratedFileIsCorrect( - expectedFile, - getExpectedDirectory(area), - emailTemplateXmlFile - ); - } - - /** - * Test generating email template with TEXT type. - */ - public void testGenerateEmailTemplateText() { - final String filePath = this.getFixturePath( - String.format( - "%s.%s", - EMAIL_TEMPLATE_FILE_NAME_TEXT, - EmailTemplateHtml.HTML_FILE_EXTENSION - ) - ); - final String area = Areas.frontend.toString(); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiFile emailTemplateXmlFile = generateEmailTemplateHtml( - EMAIL_TEMPLATE_FILE_NAME_TEXT, - EMAIL_TEMPLATE_SUBJECT_TEXT, - EmailTemplateHtml.TEXT_TYPE, - area - ); - - assertGeneratedFileIsCorrect( - expectedFile, - getExpectedDirectory(area), - emailTemplateXmlFile - ); - } - - /** - * Generate email template Html file. - * - * @param filename Email Template Filename - * @param subject Email Template Filename - * @param type Email Type - * @param area Area - * @return PsiFile - */ - private PsiFile generateEmailTemplateHtml( - final String filename, - final String subject, - final String type, - final String area - ) { - final Project project = myFixture.getProject(); - final EmailTemplateHtmlData emailTemplatesData = new EmailTemplateHtmlData( - MODULE_NAME, - filename, - area, - subject, - type - ); - final ModuleEmailTemplateHtmlGenerator generator = new ModuleEmailTemplateHtmlGenerator( - emailTemplatesData, - project - ); - - return generator.generate("test"); - } - - private String getExpectedDirectory(final String area) { - return String.format(EMAIL_TEMPLATE_DIR, area); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplatesXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplatesXmlGeneratorTest.java deleted file mode 100644 index 17d82a941..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplatesXmlGeneratorTest.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.EmailTemplatesXmlData; -import com.magento.idea.magento2plugin.magento.files.EmailTemplateHtml; -import com.magento.idea.magento2plugin.magento.files.EmailTemplatesXml; -import com.magento.idea.magento2plugin.magento.packages.Areas; - -public class ModuleEmailTemplatesXmlGeneratorTest extends BaseGeneratorTestCase { - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EMAIL_TEMPLATE_ID_HTML = "custom_email_template_html"; - private static final String EMAIL_TEMPLATE_LABEL_HTML = "Custom Email Template HTML"; - private static final String EMAIL_TEMPLATE_FILE_NAME_HTML = "custom_email_template_html"; - private static final String EMAIL_TEMPLATE_ID_TEXT = "custom_email_template_text"; - private static final String EMAIL_TEMPLATE_LABEL_TEXT = "Custom Email Template TEXT"; - private static final String EMAIL_TEMPLATE_FILE_NAME_TEXT = "custom_email_template_text"; - - /** - * Test generating email template configuration with HTML type. - */ - public void testGenerateEmailTemplateHtmlXml() { - final String filePath = this.getFixturePath(EmailTemplatesXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiFile emailTemplateXmlFile = addEmailTemplateXml( - EMAIL_TEMPLATE_ID_HTML, - EMAIL_TEMPLATE_LABEL_HTML, - EMAIL_TEMPLATE_FILE_NAME_HTML, - EmailTemplateHtml.HTML_TYPE, - Areas.adminhtml.toString() - ); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, emailTemplateXmlFile); - } - - /** - * Test generating email template configuration with TEXT type. - */ - public void testGenerateEmailTemplateTextXml() { - final String filePath = this.getFixturePath(EmailTemplatesXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiFile emailTemplateXmlFile = addEmailTemplateXml( - EMAIL_TEMPLATE_ID_TEXT, - EMAIL_TEMPLATE_LABEL_TEXT, - EMAIL_TEMPLATE_FILE_NAME_TEXT, - EmailTemplateHtml.TEXT_TYPE, - Areas.frontend.toString() - ); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, emailTemplateXmlFile); - } - - /** - * Test adding two email templates to email_templates.xml. - */ - public void testAddTwoEmailTemplatesToEmailTemplatesXmlFile() { - final String filePath = this.getFixturePath(EmailTemplatesXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - addEmailTemplateXml( - EMAIL_TEMPLATE_ID_HTML, - EMAIL_TEMPLATE_LABEL_HTML, - EMAIL_TEMPLATE_FILE_NAME_HTML, - EmailTemplateHtml.HTML_TYPE, - Areas.adminhtml.toString() - ); - final PsiFile emailTemplateXmlFile = addEmailTemplateXml( - EMAIL_TEMPLATE_ID_TEXT, - EMAIL_TEMPLATE_LABEL_TEXT, - EMAIL_TEMPLATE_FILE_NAME_TEXT, - EmailTemplateHtml.TEXT_TYPE, - Areas.frontend.toString() - ); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, emailTemplateXmlFile); - } - - /** - * Add email template XML. - * - * @param emailTemplateId Email Template ID - * @param label Email Template Label - * @param filename Email Template Filename - * @param type Email Type - * @param area Area - * @return PsiFile - */ - private PsiFile addEmailTemplateXml( - final String emailTemplateId, - final String label, - final String filename, - final String type, - final String area - ) { - final Project project = myFixture.getProject(); - final EmailTemplatesXmlData emailTemplatesData = new EmailTemplatesXmlData( - MODULE_NAME, - emailTemplateId, - label, - filename, - type, - area - ); - final ModuleEmailTemplatesXmlGenerator generator = new ModuleEmailTemplatesXmlGenerator( - emailTemplatesData, - project - ); - - return generator.generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleGraphQlResolverClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleGraphQlResolverClassGeneratorTest.java deleted file mode 100644 index a8b955820..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleGraphQlResolverClassGeneratorTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.GraphQlResolverFileData; - -public class ModuleGraphQlResolverClassGeneratorTest extends BaseGeneratorTestCase { - - public void testGenerateModuleGraphQlResolverClassFile() - { - Project project = myFixture.getProject(); - GraphQlResolverFileData graphQlResolverFileData = new GraphQlResolverFileData( - "Model", - "TestResolver", - "Foo_Bar", - "Foo\\Bar\\Model\\TestResolver", - "Foo\\Bar\\Model" - ); - ModuleGraphQlResolverClassGenerator graphQlResolverClassGenerator = new ModuleGraphQlResolverClassGenerator( - graphQlResolverFileData, - project - ); - PsiFile graphQlResolverFile = graphQlResolverClassGenerator.generate("test"); - - String filePath = this.getFixturePath("TestResolver.php"); - PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Model", - graphQlResolverFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java deleted file mode 100644 index b673ced26..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ModelData; - -public class ModuleModelGeneratorTest extends BaseGeneratorTestCase { - - private static final String EXPECTED_DIR = "src/app/code/Foo/Bar/Model"; - - /** - * Test generation of model file. - */ - public void testGenerateFile() { - final Project project = myFixture.getProject(); - final ModelData modelData = new ModelData( - "Foo_Bar", - "my_table", - "TestModel", - "TestResource" - ); - final ModuleModelGenerator generator = new ModuleModelGenerator( - modelData, - project - ); - final PsiFile modelFile = generator.generate("test"); - final String filePath = this.getFixturePath("TestModel.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIR, - modelFile - ); - } - - /** - * Test generation of model file where resource model name equal to the model name. - */ - public void testGenerateWithTheSameNameForResourceModel() { - final PsiFile modelFile = new ModuleModelGenerator( - new ModelData( - "Foo_Bar", - "my_table", - "Test", - "Test" - ), - myFixture.getProject() - ).generate("test"); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(this.getFixturePath("Test.php")), - EXPECTED_DIR, - modelFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleObserverGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleObserverGeneratorTest.java deleted file mode 100644 index e7d3d70e4..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleObserverGeneratorTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.ModuleObserverData; -import com.magento.idea.magento2plugin.magento.files.ModuleObserverFile; - -public final class ModuleObserverGeneratorTest extends BaseGeneratorTestCase { - - private static final String CLASS_NAME = "TestClassObserver"; - - /** - * Test module README.md file generation. - */ - public void testGenerateModuleObserverFile() { - final PsiFile expectedFile = myFixture.configureByFile( - getFixturePath(CLASS_NAME + ModuleObserverFile.EXTENSION) - ); - final ModuleObserverGenerator generator = new ModuleObserverGenerator( - new ModuleObserverData( - "Foo", - "Bar", - "Foo\\Bar\\Observer", - "test_event_name", - getProjectDirectory(), - CLASS_NAME - ), - myFixture.getProject() - ); - final PsiFile generatedFile = generator.generate("test"); - - assertGeneratedFileIsCorrect( - expectedFile, - generatedFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java deleted file mode 100644 index d4c130cf8..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ModuleReadmeMdData; -import com.magento.idea.magento2plugin.magento.files.ModuleReadmeMdFile; - -public final class ModuleReadmeMdGeneratorTest extends BaseGeneratorTestCase { - - /** - * Test module README.md file generation. - */ - public void testGenerateModuleReadmeMdFile() { - final PsiFile expectedFile = myFixture.configureByFile( - getFixturePath(ModuleReadmeMdFile.FILE_NAME) - ); - final ModuleReadmeMdGenerator generator = new ModuleReadmeMdGenerator( - new ModuleReadmeMdData( - "Foo", - "Bar", - getProjectDirectory() - ), - myFixture.getProject() - ); - final PsiFile generatedFile = generator.generate("test"); - - assertGeneratedFileIsCorrect( - expectedFile, - generatedFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleRegistrationPhpGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleRegistrationPhpGeneratorTest.java deleted file mode 100644 index 9ab1decfd..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleRegistrationPhpGeneratorTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ModuleRegistrationPhpData; -import com.magento.idea.magento2plugin.magento.files.RegistrationPhp; - -public class ModuleRegistrationPhpGeneratorTest extends BaseGeneratorTestCase { - - /** - * Test for generation of registration.php file. - */ - public void testGenerateRegistrationPhpFile() { - final String filePath = this.getFixturePath(RegistrationPhp.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final PsiDirectory projectDir = getProjectDirectory(); - final ModuleRegistrationPhpData moduleRegistrationPhpData = new ModuleRegistrationPhpData( - "Foo", - "Bar", - projectDir, - true - ); - final ModuleRegistrationPhpGenerator moduleRegistrationPhpGenerator - = new ModuleRegistrationPhpGenerator( - moduleRegistrationPhpData, - project - ); - final PsiFile registrationPhp = moduleRegistrationPhpGenerator.generate("test"); - assertGeneratedFileIsCorrect( - expectedFile, - projectDir.getVirtualFile().getPath() + "/Foo/Bar", - registrationPhp - ); - } - - /** - * Test for generation of registration.php file for a module project. - */ - public void testGenerateRegistrationPhpFileInRoot() { - final String filePath = this.getFixturePath(RegistrationPhp.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final PsiDirectory projectDir = getProjectDirectory(); - final ModuleRegistrationPhpData moduleRegistrationPhpData = new ModuleRegistrationPhpData( - "Foo", - "Bar", - projectDir, - false - ); - final ModuleRegistrationPhpGenerator moduleRegistrationPhpGenerator - = new ModuleRegistrationPhpGenerator( - moduleRegistrationPhpData, - project - ); - final PsiFile registrationPhp = moduleRegistrationPhpGenerator.generate("test"); - assertGeneratedFileIsCorrect( - expectedFile, - projectDir.getVirtualFile().getPath(), - registrationPhp - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java deleted file mode 100644 index d73fce143..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; -import com.magento.idea.magento2plugin.actions.generation.data.ResourceModelData; -import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; - -public class ModuleResourceModelGeneratorTest extends BaseGeneratorTestCase { - - private static final String EXPECTED_DIR = "src/app/code/Foo/Bar/Model/ResourceModel"; - private static final String ENTITY_ID_COLUMN = "entity_id"; - private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\EntityData"; - - @Override - public void setUp() throws Exception { - super.setUp(); - final EntityCreatorContext context = new EntityCreatorContext(); - context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); - context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID_COLUMN); - GenerationContextRegistry.getInstance().setContext(context); - } - - /** - * Test generation of resource model file. - */ - public void testGenerateFile() { - GenerationContextRegistry.getInstance().setContext(null); - final Project project = myFixture.getProject(); - final ResourceModelData resourceModelData = new ResourceModelData( - "Foo_Bar", - "my_table", - "TestResourceModel", - ENTITY_ID_COLUMN - ); - final ModuleResourceModelGenerator generator = new ModuleResourceModelGenerator( - resourceModelData, - project - ); - final PsiFile resourceModelFile = generator.generate("test"); - final String filePath = this.getFixturePath("TestResourceModel.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIR, - resourceModelFile - ); - } - - /** - * Test generation of resource model file with reference to entity id column. - */ - public void testGenerateFileWithDtoReference() { - final Project project = myFixture.getProject(); - final ResourceModelData resourceModelData = new ResourceModelData( - "Foo_Bar", - "my_table", - "TestResourceModel", - ENTITY_ID_COLUMN - ); - final ModuleResourceModelGenerator generator = new ModuleResourceModelGenerator( - resourceModelData, - project - ); - final PsiFile resourceModelFile = generator.generate("test"); - final String filePath = this.getFixturePath("TestResourceModel.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIR, - resourceModelFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleSetupDataPatchGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleSetupDataPatchGeneratorTest.java deleted file mode 100644 index 956f1ebf2..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleSetupDataPatchGeneratorTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.ModuleSetupDataPatchData; -import com.magento.idea.magento2plugin.magento.files.ModuleSetupDataPatchFile; - -public final class ModuleSetupDataPatchGeneratorTest extends BaseGeneratorTestCase { - - private static final String CLASS_NAME = "TestClassPatch"; - - /** - * Test module README.md file generation. - */ - public void testGenerateModuleSetupDataPatchFile() { - final PsiFile expectedFile = myFixture.configureByFile( - getFixturePath(CLASS_NAME + ModuleSetupDataPatchFile.EXTENSION) - ); - final ModuleSetupDataPatchGenerator generator = new ModuleSetupDataPatchGenerator( - new ModuleSetupDataPatchData( - "Foo", - "Bar", - getProjectDirectory(), - CLASS_NAME - - ), - myFixture.getProject() - ); - final PsiFile generatedFile = generator.generate("test"); - - assertGeneratedFileIsCorrect( - expectedFile, - generatedFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleViewModelClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleViewModelClassGeneratorTest.java deleted file mode 100644 index ab8b38b0f..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleViewModelClassGeneratorTest.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ViewModelFileData; - -public class ModuleViewModelClassGeneratorTest extends BaseGeneratorTestCase { - - public void testGenerateViewModelFile() { - Project project = myFixture.getProject(); - - ViewModelFileData viewModelData = new ViewModelFileData( - "ViewModel", - "TestViewModel", - "Foo_Bar", - "Foo\\Bar\\ViewModel" - ); - ModuleViewModelClassGenerator moduleViewModelClassGenerator = new ModuleViewModelClassGenerator( - viewModelData, - project - ); - PsiFile viewModelFile = moduleViewModelClassGenerator.generate("test"); - - String filePath = this.getFixturePath("TestViewModel.php"); - PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/ViewModel", - viewModelFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorHaveSetupVersionTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorHaveSetupVersionTest.java deleted file mode 100644 index 4a0fc2498..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorHaveSetupVersionTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ModuleXmlData; -import com.magento.idea.magento2plugin.magento.files.ModuleXml; -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.magento.packages.Package; -import java.util.Arrays; - -public class ModuleXmlGeneratorHaveSetupVersionTest extends BaseGeneratorTestCase { - - /** - * Test checks whether module.xml is generated correctly. - */ - public void testGenerateModuleFile() { - final String filePath = this.getFixturePath(ModuleXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiDirectory projectDir = getProjectDirectory(); - - final Project project = myFixture.getProject(); - final ModuleXmlData moduleXmlData = new ModuleXmlData( - "Test", - "Module1", - "1.0.0", - projectDir, - Arrays.asList("Magento_Catalog", "Magento_InventoryApi"), - true - ); - final ModuleXmlGenerator moduleXmlGenerator = new ModuleXmlGenerator( - moduleXmlData, - project - ); - final PsiFile moduleXml = moduleXmlGenerator.generate("test"); - - assertGeneratedFileIsCorrect( - expectedFile, - projectDir.getVirtualFile().getPath() - + "/Test/Module1" + File.separator + Package.moduleBaseAreaDir, - moduleXml - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorTest.java deleted file mode 100644 index bd81f169a..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ModuleXmlData; -import com.magento.idea.magento2plugin.magento.files.ModuleXml; -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.magento.packages.Package; -import java.util.Arrays; - -public class ModuleXmlGeneratorTest extends BaseGeneratorTestCase { - - /** - * Test checks whether module.xml is generated correctly. - */ - public void testGenerateModuleFile() { - final String filePath = this.getFixturePath(ModuleXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiDirectory projectDir = getProjectDirectory(); - - final Project project = myFixture.getProject(); - final ModuleXmlData moduleXmlData = new ModuleXmlData( - "Test", - "Module", - null, - projectDir, - Arrays.asList("Magento_Catalog", "Magento_InventoryApi"), - true - ); - final ModuleXmlGenerator moduleXmlGenerator = new ModuleXmlGenerator( - moduleXmlData, - project - ); - final PsiFile moduleXml = moduleXmlGenerator.generate("test"); - - assertGeneratedFileIsCorrect( - expectedFile, - projectDir.getVirtualFile().getPath() - + "/Test/Module" + File.separator + Package.moduleBaseAreaDir, - moduleXml - ); - } - - /** - * Test checks whether module.xml is generated - * correctly for module as a separate project. - */ - public void testGenerateFileInRoot() { - final String filePath = this.getFixturePath(ModuleXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final PsiDirectory projectDir = getProjectDirectory(); - - final Project project = myFixture.getProject(); - final ModuleXmlData moduleXmlData = new ModuleXmlData( - "Test", - "Module", - null, - projectDir, - Arrays.asList("Magento_Catalog", "Magento_InventoryApi"), - false - ); - final ModuleXmlGenerator moduleXmlGenerator = new ModuleXmlGenerator( - moduleXmlData, - project - ); - final PsiFile moduleXml = moduleXmlGenerator.generate("test"); - - assertGeneratedFileIsCorrect( - expectedFile, - projectDir.getVirtualFile().getPath() + File.separator + Package.moduleBaseAreaDir, - moduleXml - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewActionEntityGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewActionEntityGeneratorTest.java deleted file mode 100644 index ee518d05a..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewActionEntityGeneratorTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.NewActionEntityControllerFileData; -import com.magento.idea.magento2plugin.magento.files.actions.NewActionFile; - -public class NewActionEntityGeneratorTest extends BaseGeneratorTestCase { - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Company"; - private static final String EXPECTED_DIRECTORY = - "/src/app/code/Foo/Bar/Controller/Adminhtml/" + ENTITY_NAME; - private static final String NAMESPACE = - "Foo\\Bar\\Controller\\Adminhtml\\" + ENTITY_NAME; - private static final String ACL = "Foo_Bar::company_id"; - private static final String MENU = "Foo_Bar::menu_id"; - - - /** - * Test generation of NewAction controller. - */ - public void testGenerateNewActionEntityFile() { - final NewActionEntityControllerFileData newActionEntityControllerFileData = - new NewActionEntityControllerFileData( - ENTITY_NAME, - MODULE_NAME, - NAMESPACE, - ACL, - MENU - ); - final NewActionEntityControllerFileGenerator newActionEntityControllerFileGenerator = - new NewActionEntityControllerFileGenerator( - newActionEntityControllerFileData, - myFixture.getProject() - ); - final PsiFile newActionEntityActionFile = - newActionEntityControllerFileGenerator.generate("test"); - final String filePath = this.getFixturePath( - new NewActionFile(MODULE_NAME, ENTITY_NAME).getFileName() - ); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIRECTORY, - newActionEntityActionFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewEntityLayoutGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewEntityLayoutGeneratorTest.java deleted file mode 100644 index a7f637c95..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewEntityLayoutGeneratorTest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.NewEntityLayoutData; -import com.magento.idea.magento2plugin.magento.files.NewEntityLayoutFile; -import com.magento.idea.magento2plugin.magento.packages.File; - -public class NewEntityLayoutGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EDIT_ACTION = "book/book/edit"; - private static final String NEW_ACTION = "book/book/new"; - - /** - * Test new entity layout file generation. - */ - public void testGenerateNewEntityLayoutFile() { - final NewEntityLayoutData data = new NewEntityLayoutData( - MODULE_NAME, - NEW_ACTION, - EDIT_ACTION - ); - final NewEntityLayoutFile file = - new NewEntityLayoutFile(data.getNewActionPath().replace(File.separator, "_")); - - final NewEntityLayoutGenerator generator = new NewEntityLayoutGenerator( - data, - myFixture.getProject(), - false - ); - final PsiFile newActionLayoutFile = generator.generate("test"); - final String filePath = this.getFixturePath(file.getFileName()); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - file.getDirectory(), - newActionLayoutFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverClassGeneratorTest.java deleted file mode 100644 index 6e5f87dc5..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverClassGeneratorTest.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ObserverFileData; - -public class ObserverClassGeneratorTest extends BaseGeneratorTestCase { - - public void testGenerateObserverClass() - { - Project project = myFixture.getProject(); - ObserverFileData observerData = new ObserverFileData( - "Observer", - "TestObserver", - "Foo_Bar", - "test_event", - "Foo\\Bar\\Observer\\TestObserver", - "Foo\\Bar\\Observer" - ); - ObserverClassGenerator observerClassGenerator = new ObserverClassGenerator( - observerData, - project - ); - PsiFile observerClassFile = observerClassGenerator.generate("test"); - - String filePath = this.getFixturePath("TestObserver.php"); - PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Observer", - observerClassFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverEventsXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverEventsXmlGeneratorTest.java deleted file mode 100644 index b330d8d97..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverEventsXmlGeneratorTest.java +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ObserverEventsXmlData; -import com.magento.idea.magento2plugin.magento.files.ModuleEventsXml; -import com.magento.idea.magento2plugin.magento.packages.Areas; -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.magento.packages.Package; - -public class ObserverEventsXmlGeneratorTest extends BaseGeneratorTestCase { - private static final String MODULE_NAME = "Foo_Bar"; - private static final String MODULE_DIR = "src/app/code/Foo/Bar/"; - - /** - * Test checks whether 2 events.xml is generated correctly for the base area. - */ - public void testGenerateEventsXmlInBaseAreaFile() { - final String filePath = this.getFixturePath(ModuleEventsXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final String area = Areas.base.toString(); - final PsiFile eventsXml = addEventToEventsXml( - project, - area, - "test_event", - "test_observer", - "Foo\\Bar\\Observer\\Test\\TestEventObserver" - ); - - assertGeneratedFileIsCorrect( - expectedFile, - MODULE_DIR + Package.moduleBaseAreaDir, - eventsXml - ); - } - - /** - * Test checks whether 2 events.xml is generated correctly for the adminhtml area. - */ - public void testGenerateEventsXmlInAdminhtmlAreaFile() { - final String filePath = this.getFixturePath(ModuleEventsXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final String area = Areas.adminhtml.toString(); - final PsiFile eventsXml = addEventToEventsXml( - project, - area, - "test_event", - "test_observer", - "Foo\\Bar\\Observer\\Test\\TestEventObserver" - ); - - assertGeneratedFileIsCorrect( - expectedFile, - MODULE_DIR + Package.moduleBaseAreaDir + File.separator + area, - eventsXml - ); - } - - /** - * Test checks whether 2 events.xml is generated correctly with 2 observers. - */ - public void testAddTwoObserversToOneEventsXml() { - final String filePath = this.getFixturePath(ModuleEventsXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - addEventToEventsXml( - project, - Areas.frontend.toString(), - "test_event", - "test_observer", - "Foo\\Bar\\Observer\\Test\\TestEventObserver" - ); - final PsiFile eventsXml = addEventToEventsXml( - project, - Areas.frontend.toString(), - "test_event_2", - "test_observer_2", - "Foo\\Bar\\Observer\\Test\\TestEventObserverTwo" - ); - - assertGeneratedFileIsCorrect( - expectedFile, - MODULE_DIR + Package.moduleBaseAreaDir + File.separator + Areas.frontend.toString(), - eventsXml - ); - } - - private PsiFile addEventToEventsXml( - final Project project, - final String area, - final String eventName, - final String observerName, - final String observerClassFqn - ) { - final ObserverEventsXmlData observerEventsXmlData = new ObserverEventsXmlData( - area, - MODULE_NAME, - eventName, - observerName, - observerClassFqn - ); - final ObserverEventsXmlGenerator observerEventsXmlGenerator = - new ObserverEventsXmlGenerator( - observerEventsXmlData, - project - ); - - return observerEventsXmlGenerator.generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginClassGeneratorTest.java deleted file mode 100644 index f3e0e98b8..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginClassGeneratorTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.jetbrains.php.lang.psi.elements.Method; -import com.jetbrains.php.lang.psi.elements.PhpClass; -import com.magento.idea.magento2plugin.actions.generation.data.PluginFileData; -import com.magento.idea.magento2plugin.magento.files.Plugin; -import com.magento.idea.magento2plugin.util.GetPhpClassByFQN; -import org.jetbrains.annotations.NotNull; - -public class PluginClassGeneratorTest extends BaseGeneratorTestCase { - - private static final String TARGET_CLASS_FQN = "Foo\\Bar\\Service\\SimpleService"; - private static final String TARGET_METHOD_NAME = "execute"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String PLUGIN_NAMESPACE = "Foo\\Bar\\Plugin"; - private static final String PLUGIN_FQN = "Foo\\Bar\\Plugin\\TestPlugin"; - private static final String PLUGIN_CLASS_NAME = "TestPlugin"; - private static final String PLUGIN_DIR = "Plugin"; - - /** - * Test of plugin generation. - */ - public void testGeneratePluginClassFile() { - PsiFile pluginClassFile; - addPluginToTargetClass(Plugin.PluginType.before.toString()); - addPluginToTargetClass(Plugin.PluginType.around.toString()); - pluginClassFile = addPluginToTargetClass(Plugin.PluginType.after.toString()); - - final String filePath = this.getFixturePath(PLUGIN_CLASS_NAME.concat(".php")); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Plugin", - pluginClassFile - ); - } - - /** - * Add plugins for the target class. - * - * @param pluginType String - * - * @return PsiFile - */ - private PsiFile addPluginToTargetClass(final @NotNull String pluginType) { - final Project project = myFixture.getProject(); - final PhpClass targetClass = - GetPhpClassByFQN.getInstance(project).execute(TARGET_CLASS_FQN); - final Method targetMethod = targetClass.findMethodByName(TARGET_METHOD_NAME); - - final PluginFileData pluginClass = new PluginFileData( - PLUGIN_DIR, - PLUGIN_CLASS_NAME, - pluginType, - MODULE_NAME, - targetClass, - targetMethod, - PLUGIN_FQN, - PLUGIN_NAMESPACE - ); - final PluginClassGenerator pluginClassGenerator = new PluginClassGenerator( - pluginClass, - project - ); - - return pluginClassGenerator.generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginDiXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginDiXmlGeneratorTest.java deleted file mode 100644 index 9358295c6..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginDiXmlGeneratorTest.java +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.jetbrains.php.lang.psi.elements.PhpClass; -import com.magento.idea.magento2plugin.actions.generation.data.PluginDiXmlData; -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; -import com.magento.idea.magento2plugin.magento.packages.Areas; -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.magento.packages.Package; -import com.magento.idea.magento2plugin.util.GetPhpClassByFQN; - -public class PluginDiXmlGeneratorTest extends BaseGeneratorTestCase { - private static final String PLUGIN_TARGET_CLASS_ONE_FNQ - = "Foo\\Bar\\Model\\PluginTargetClassOne"; - private static final String PLUGIN_TARGET_CLASS_TWO_FNQ - = "Foo\\Bar\\Model\\PluginTargetClassTwo"; - private static final String PLUGIN_CLASS_ONE_FNQ = "Foo\\Bar\\Plugin\\TestOnePlugin"; - private static final String PLUGIN_CLASS_TWO_FNQ = "Foo\\Bar\\Plugin\\TestTwoPlugin"; - private static final String MODULE = "Foo_Bar"; - private static final String MODULE_DIR = "src/app/code/Foo/Bar/"; - private static final String TEST_PLUGIN_NAME = "test_plugin_name_1"; - - /** - * Test checks whether di.xml is generated correctly for the base area - */ - public void testGeneratePluginDiXmlFileWithoutSortOrder() { - final PsiFile expectedFile = myFixture.configureByFile( - this.getFixturePath(ModuleDiXml.FILE_NAME) - ); - final String area = Areas.base.toString(); - - final PsiFile diXml = addPluginDiXml( - PLUGIN_TARGET_CLASS_ONE_FNQ, - area, - "", - TEST_PLUGIN_NAME, - PLUGIN_CLASS_ONE_FNQ - ); - - assertGeneratedFileIsCorrect( - expectedFile, - getExpectedDirectory(area), - diXml - ); - } - - /** - * Test checks whether di.xml is generated correctly for the base area - */ - public void testGeneratePluginDiXmlFileForBaseArea() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final String area = Areas.base.toString(); - - final PsiFile diXml = addPluginDiXml( - PLUGIN_TARGET_CLASS_ONE_FNQ, - area, - "10", - TEST_PLUGIN_NAME, - PLUGIN_CLASS_ONE_FNQ - ); - - assertGeneratedFileIsCorrect( - expectedFile, - getExpectedDirectory(area), - diXml - ); - } - - /** - * Test checks whether di.xml is generated correctly for the adminhtml area - */ - public void testGeneratePluginDiXmlFileForAdminhtmlArea() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final String area = Areas.adminhtml.toString(); - - final PsiFile diXml = addPluginDiXml( - PLUGIN_TARGET_CLASS_TWO_FNQ, - area, - "20", - "test_plugin_name_2", - PLUGIN_CLASS_TWO_FNQ - ); - - assertGeneratedFileIsCorrect( - expectedFile, - getExpectedDirectory(area), - diXml - ); - } - - /** - * Test checks whether 2 di.xml is generated correctly - */ - public void testAddTwoPluginsToOneDiXml() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final String area = Areas.frontend.toString(); - addPluginDiXml( - PLUGIN_TARGET_CLASS_ONE_FNQ, - area, - "10", - TEST_PLUGIN_NAME, - PLUGIN_CLASS_ONE_FNQ - ); - final PsiFile diXml = addPluginDiXml( - PLUGIN_TARGET_CLASS_TWO_FNQ, - area, - "20", - "test_plugin_name_2", - PLUGIN_CLASS_TWO_FNQ - ); - - assertGeneratedFileIsCorrect( - expectedFile, - getExpectedDirectory(area), - diXml - ); - } - - /** - * Test checks whether 2 di.xml is generated correctly for one target clas - */ - public void testAddTwoPluginsToOneTargetClass() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final String area = Areas.frontend.toString(); - addPluginDiXml( - PLUGIN_TARGET_CLASS_ONE_FNQ, - area, - "10", - TEST_PLUGIN_NAME, - PLUGIN_CLASS_ONE_FNQ - ); - final PsiFile diXml = addPluginDiXml( - PLUGIN_TARGET_CLASS_ONE_FNQ, - area, - "20", - "test_plugin_name_2", - PLUGIN_CLASS_TWO_FNQ - ); - - assertGeneratedFileIsCorrect( - expectedFile, - getExpectedDirectory(area), - diXml - ); - } - - private PsiFile addPluginDiXml( - final String targetClassFnq, - final String area, - final String sortOrder, - final String pluginName, - final String pluginClassFnq - ) { - final Project project = myFixture.getProject(); - final PhpClass targetClass = GetPhpClassByFQN.getInstance(project).execute(targetClassFnq); - final PluginDiXmlData pluginDiXmlData = new PluginDiXmlData( - area, - MODULE, - targetClass, - sortOrder, - pluginName, - pluginClassFnq - ); - final PluginDiXmlGenerator moduleXmlGenerator = new PluginDiXmlGenerator( - pluginDiXmlData, - project - ); - - return moduleXmlGenerator.generate("test"); - } - - private String getExpectedDirectory(final String area) { - if (area.equals(Areas.base.toString())) { - return MODULE_DIR + Package.moduleBaseAreaDir; - } - - return MODULE_DIR + Package.moduleBaseAreaDir + File.separator + area; - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceClassGeneratorTest.java deleted file mode 100644 index a960d2549..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceClassGeneratorTest.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.jetbrains.php.lang.psi.elements.PhpClass; -import com.magento.idea.magento2plugin.actions.generation.data.PreferenceFileData; -import com.magento.idea.magento2plugin.util.GetPhpClassByFQN; - -public class PreferenceClassGeneratorTest extends BaseGeneratorTestCase { - private static final String MODULE = "Foo_Bar"; - private static final String TARGET_MODEL_ONE_CLASS_FQN = "Foo\\Bar\\Model\\SimpleModelOne"; - private static final String TARGET_MODEL_TWO_CLASS_FQN = "Foo\\Bar\\Model\\SimpleModelTwo"; - - /** - * Test preference class file generation. - */ - public void testGeneratePreferenceClassFile() { - final PsiFile preferenceClassFile = createPreferenceClassFile( - TARGET_MODEL_ONE_CLASS_FQN, - "Model/Override", - "SimpleModelOneOverride", - "Foo\\Bar\\Model\\Override\\SimpleModelOneOverride", - "Foo\\Bar\\Model\\Override", - false, - false - ); - final String filePath = this.getFixturePath("SimpleModelOneOverride.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Model/Override", - preferenceClassFile - ); - } - - /** - * Test preference class file generation. - */ - public void testGeneratePreferenceInterfaceFile() { - final PsiFile preferenceClassFile = createPreferenceClassFile( - TARGET_MODEL_ONE_CLASS_FQN, - "Model", - "InterfaceOverride", - "Foo\\Bar\\Model\\InterfaceOverride", - "Foo\\Bar\\Model", - false, - true - ); - final String filePath = this.getFixturePath("InterfaceOverride.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Model", - preferenceClassFile - ); - } - - /** - * Test preference class file generation with inheritance. - */ - public void testGeneratePreferenceClassFileWithInheritance() { - final PsiFile preferenceClassFile = createPreferenceClassFile( - TARGET_MODEL_TWO_CLASS_FQN, - "Model/Override", - "SimpleModelTwoOverride", - "Foo\\Bar\\Model\\Override\\SimpleModelTwoOverride", - "Foo\\Bar\\Model\\Override", - true, - false - ); - final String filePath = this.getFixturePath("SimpleModelTwoOverride.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Model/Override", - preferenceClassFile - ); - } - - /** - * Create preference class file. - * - * @param targetClassFnq Target Class FQN - * @param preferenceDirectory Preference Directory - * @param preferenceClassName Preference Class Name - * @param preferenceFqn Preference FQN - * @param namespace Namespace - * @param inheritClass Inherit target class - * @return PsiFile - */ - private PsiFile createPreferenceClassFile( - final String targetClassFnq, - final String preferenceDirectory, - final String preferenceClassName, - final String preferenceFqn, - final String namespace, - final Boolean inheritClass, - final Boolean isInterface - ) { - final Project project = myFixture.getProject(); - final PhpClass targetClass = GetPhpClassByFQN.getInstance(project).execute(targetClassFnq); - final PreferenceFileData preferenceFileData = new PreferenceFileData( - preferenceDirectory, - preferenceClassName, - MODULE, - targetClass, - preferenceFqn, - namespace, - inheritClass, - isInterface - ); - final PreferenceClassGenerator preferenceClassGenerator = new PreferenceClassGenerator( - preferenceFileData, - project - ); - - return preferenceClassGenerator.generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceDiXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceDiXmlGeneratorTest.java deleted file mode 100644 index ef04e5ec9..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceDiXmlGeneratorTest.java +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.PreferenceDiXmFileData; -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; -import com.magento.idea.magento2plugin.magento.packages.Areas; -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.magento.packages.Package; - -public class PreferenceDiXmlGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE = "Foo_Bar"; - private static final String MODULE_DIR = "src/app/code/Foo/Bar/"; - private static final String TARGET_MODEL_ONE_CLASS_FQN = "Foo\\Bar\\Model\\SimpleModelOne"; - private static final String TARGET_MODEL_TWO_CLASS_FQN = "Foo\\Bar\\Model\\SimpleModelTwo"; - - /** - * Test preference DI XML file generation. - */ - public void testGeneratePreferenceDiXml() { - final String area = Areas.base.toString(); - final PsiFile preferenceDiXmlFile = addPreferenceDiXml( - TARGET_MODEL_ONE_CLASS_FQN, - "Foo\\Bar\\Model\\Override\\SimpleModelOne", - area - ); - - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - getExpectedDirectory(area), - preferenceDiXmlFile - ); - } - - /** - * Test preference DI XML file generation for adminhtml area. - */ - public void testGeneratePreferenceDiXmlForAdminhtmlArea() { - final String area = Areas.adminhtml.toString(); - final PsiFile preferenceDiXmlFile = addPreferenceDiXml( - TARGET_MODEL_TWO_CLASS_FQN, - "Foo\\Bar\\Model\\Override\\SimpleModelTwo", - area - ); - - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - getExpectedDirectory(area), - preferenceDiXmlFile - ); - } - - /** - * Test the adding of two preferences to one DI XML file. - */ - public void testAddTwoPreferencesToOneDiXmlFile() { - final String area = Areas.frontend.toString(); - addPreferenceDiXml( - TARGET_MODEL_ONE_CLASS_FQN, - "Foo\\Bar\\Model\\Override\\SimpleModelOne", - area - ); - final PsiFile preferenceDiXmlFile = addPreferenceDiXml( - TARGET_MODEL_TWO_CLASS_FQN, - "Foo\\Bar\\Model\\Override\\SimpleModelTwo", - area - ); - - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - getExpectedDirectory(area), - preferenceDiXmlFile - ); - } - - /** - * Add preference to XML file. - * - * @param targetClassFnq Target class FQN - * @param preferenceFqn Preference FQN - * @param area Area - * - * @return PsiFile - */ - private PsiFile addPreferenceDiXml( - final String targetClassFnq, - final String preferenceFqn, - final String area - ) { - final Project project = myFixture.getProject(); - final PreferenceDiXmFileData preferenceDiXmlFileData = new PreferenceDiXmFileData( - MODULE, - targetClassFnq, - preferenceFqn, - area - ); - final PreferenceDiXmlGenerator moduleXmlGenerator = new PreferenceDiXmlGenerator( - preferenceDiXmlFileData, - project - ); - - return moduleXmlGenerator.generate("test"); - } - - /** - * Get expected directory based on provided area. - * - * @param area Area name - * - * @return String - */ - private String getExpectedDirectory(final String area) { - String expectedDirectory; - - if (area.equals(Areas.base.toString())) { - expectedDirectory = MODULE_DIR + Package.moduleBaseAreaDir; - } else { - expectedDirectory = MODULE_DIR + Package.moduleBaseAreaDir + File.separator + area; - } - - return expectedDirectory; - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ProductAttributePropertySetupPatchGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ProductAttributePropertySetupPatchGeneratorTest.java deleted file mode 100644 index 8e05991c2..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ProductAttributePropertySetupPatchGeneratorTest.java +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.ProductEntityData; -import com.magento.idea.magento2plugin.magento.packages.eav.AttributeScope; -import com.magento.idea.magento2plugin.magento.packages.eav.AttributeSourceModel; -import java.util.HashMap; -import java.util.Map; - -public class ProductAttributePropertySetupPatchGeneratorTest extends BaseGeneratorTestCase { - private static final String MODULE_NAME = "Foo_Bar"; - private static final String LABEL = "Test Label"; - private static final String TYPE = "static"; - private static final int SORT_ORDER = 10; - private static final String GROUP = "General"; - private static final String FILE_PATH = "src/app/code/Foo/Bar/Setup/Patch/Data"; - - /** - * Test Data patch for product's eav attribute generator. - */ - public void testGenerateFile() { - final Project project = myFixture.getProject(); - - final ProductEntityData productEntityData = new ProductEntityData(); - productEntityData.setCode("test"); - productEntityData.setVisibleInGrid(false); - productEntityData.setHtmlAllowedOnFront(false); - productEntityData.setVisibleOnFront(false); - productEntityData.setVisible(true); - productEntityData.setScope(AttributeScope.GLOBAL.getScope()); - productEntityData.setLabel(LABEL); - productEntityData.setType(TYPE); - productEntityData.setUsedInGrid(false); - productEntityData.setRequired(false); - productEntityData.setInput("text"); - productEntityData.setFilterableInGrid(false); - productEntityData.setSortOrder(SORT_ORDER); - productEntityData.setGroup(GROUP); - - productEntityData.setDataPatchName("AddTestAttribute"); - productEntityData.setModuleName(MODULE_NAME); - - final EavAttributeSetupPatchGenerator setupPatchGenerator = - new EavAttributeSetupPatchGenerator(productEntityData, project); - final PsiFile dataPatchFile = setupPatchGenerator.generate("testGenerateFile"); - - final String filePatch = this.getFixturePath("AddTestAttribute.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePatch); - - assertGeneratedFileIsCorrect(expectedFile, FILE_PATH, dataPatchFile); - } - - /** - * Tests the generated file with the boolean source model. - */ - public void testGenerateFileWithBooleanSourceModel() { - final Project project = myFixture.getProject(); - - final ProductEntityData productEntityData = new ProductEntityData(); - productEntityData.setCode("boolean_input_attribute"); - productEntityData.setVisibleInGrid(false); - productEntityData.setHtmlAllowedOnFront(false); - productEntityData.setVisibleOnFront(false); - productEntityData.setVisible(true); - productEntityData.setScope(AttributeScope.GLOBAL.getScope()); - productEntityData.setLabel(LABEL); - productEntityData.setType(TYPE); - productEntityData.setUsedInGrid(false); - productEntityData.setRequired(false); - productEntityData.setInput("boolean"); - productEntityData.setSource(AttributeSourceModel.BOOLEAN.getSource()); - productEntityData.setFilterableInGrid(false); - productEntityData.setSortOrder(SORT_ORDER); - productEntityData.setGroup(GROUP); - - productEntityData.setDataPatchName("AddBooleanInputAttributeAttribute"); - productEntityData.setModuleName(MODULE_NAME); - - final EavAttributeSetupPatchGenerator setupPatchGenerator = - new EavAttributeSetupPatchGenerator(productEntityData, project); - final PsiFile dataPatchFile = setupPatchGenerator.generate( - "testGenerateFileWithBooleanSourceModel" - ); - - final String filePatch = this.getFixturePath("AddBooleanInputAttributeAttribute.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePatch); - - assertGeneratedFileIsCorrect(expectedFile, FILE_PATH, dataPatchFile); - } - - /** - * Tests the generated file with the source model. - */ - public void testGenerateFileWithGeneratedSourceModel() { - final Project project = myFixture.getProject(); - - final ProductEntityData productEntityData = new ProductEntityData(); - productEntityData.setCode("attribute_with_custom_source"); - productEntityData.setVisibleInGrid(false); - productEntityData.setHtmlAllowedOnFront(false); - productEntityData.setVisibleOnFront(false); - productEntityData.setVisible(true); - productEntityData.setScope(AttributeScope.GLOBAL.getScope()); - productEntityData.setLabel("Test Label"); - productEntityData.setType("static"); - productEntityData.setUsedInGrid(false); - productEntityData.setRequired(false); - productEntityData.setInput("text"); - productEntityData.setSource("\\Foo\\Bar\\Model\\Source\\AttributeWithCustomSource"); - productEntityData.setFilterableInGrid(false); - productEntityData.setSortOrder(10); - productEntityData.setGroup(GROUP); - - productEntityData.setDataPatchName("AddAttributeWithCustomSourceAttribute"); - productEntityData.setModuleName(MODULE_NAME); - - final EavAttributeSetupPatchGenerator setupPatchGenerator = - new EavAttributeSetupPatchGenerator(productEntityData, project); - final PsiFile dataPatchFile = setupPatchGenerator.generate( - "testGenerateFileWithBooleanSourceModel" - ); - - final String filePatch = this.getFixturePath("AddAttributeWithCustomSourceAttribute.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePatch); - - assertGeneratedFileIsCorrect(expectedFile, FILE_PATH, dataPatchFile); - } - - /** - * Tests file with the `apply to` attribute. - */ - public void testGenerateFileWithApplyToAttribute() { - final Project project = myFixture.getProject(); - - final ProductEntityData productEntityData = new ProductEntityData(); - productEntityData.setCode("applied_to_attribute"); - productEntityData.setVisibleInGrid(false); - productEntityData.setHtmlAllowedOnFront(false); - productEntityData.setVisibleOnFront(false); - productEntityData.setVisible(true); - productEntityData.setScope(AttributeScope.GLOBAL.getScope()); - productEntityData.setLabel("Test Label"); - productEntityData.setType("static"); - productEntityData.setUsedInGrid(false); - productEntityData.setRequired(false); - productEntityData.setInput("text"); - productEntityData.setFilterableInGrid(false); - productEntityData.setSortOrder(10); - productEntityData.setGroup(GROUP); - productEntityData.setApplyTo("configurable,simple"); - - productEntityData.setDataPatchName("AddAppliedToAttribute"); - productEntityData.setModuleName(MODULE_NAME); - - final EavAttributeSetupPatchGenerator setupPatchGenerator = - new EavAttributeSetupPatchGenerator(productEntityData, project); - final PsiFile dataPatchFile = setupPatchGenerator.generate( - "testGenerateFileWithApplyToAttribute" - ); - - final String filePatch = this.getFixturePath("AddAppliedToAttribute.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePatch); - - assertGeneratedFileIsCorrect(expectedFile, FILE_PATH, dataPatchFile); - } - - /** - * Tests file with options. - */ - public void testGenerateFileWithOptions() { - final Project project = myFixture.getProject(); - - final ProductEntityData productEntityData = new ProductEntityData(); - productEntityData.setVisibleInGrid(false); - productEntityData.setHtmlAllowedOnFront(false); - productEntityData.setVisibleOnFront(false); - productEntityData.setVisible(true); - productEntityData.setScope(AttributeScope.GLOBAL.getScope()); - productEntityData.setCode("attribute_with_options"); - productEntityData.setLabel("Attribute With Options"); - productEntityData.setType("varchar"); - productEntityData.setUsedInGrid(false); - productEntityData.setRequired(false); - productEntityData.setInput("multiselect"); - productEntityData.setSource(AttributeSourceModel.NULLABLE_SOURCE.getSource()); - productEntityData.setFilterableInGrid(false); - productEntityData.setSortOrder(10); - productEntityData.setGroup(GROUP); - - final Map options = new HashMap<>(); - options.put(0, "option1"); - options.put(1, "option2"); - options.put(2, "option3"); - - productEntityData.setOptions(options); - - productEntityData.setDataPatchName("AddAttributeWithOptionsAttribute"); - productEntityData.setModuleName(MODULE_NAME); - - final EavAttributeSetupPatchGenerator setupPatchGenerator = - new EavAttributeSetupPatchGenerator(productEntityData, project); - final PsiFile dataPatchFile = setupPatchGenerator.generate("testGenerateFileWithOptions"); - - final String filePatch = this.getFixturePath("AddAttributeWithOptionsAttribute.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePatch); - - assertGeneratedFileIsCorrect(expectedFile, FILE_PATH, dataPatchFile); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueryModelGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueryModelGeneratorTest.java deleted file mode 100644 index c13c49efc..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueryModelGeneratorTest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.magento.idea.magento2plugin.actions.generation.data.GetListQueryModelData; -import com.magento.idea.magento2plugin.magento.files.queries.GetListQueryFile; - -public class QueryModelGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Book"; - private static final String MODEL_NAME = "Book"; - private static final String COLLECTION_NAME = "Collection"; - private static final String ACL = "Foo_Bar::book_management"; - - /** - * Test generation of GetListQuery model for entity. - */ - public void testGenerateGetListQueryModelFile() { - final GetListQueryFile file = new GetListQueryFile(MODULE_NAME, ENTITY_NAME); - final GetListQueryModelData getListQueryModelData = new GetListQueryModelData( - MODULE_NAME, - ENTITY_NAME, - MODEL_NAME, - COLLECTION_NAME, - ACL, - false - ); - final GetListQueryModelGenerator getListQueryModelGenerator = - new GetListQueryModelGenerator( - getListQueryModelData, - myFixture.getProject(), - false - ); - final String filePath = this.getFixturePath(file.getFileName()); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - file.getDirectory(), - getListQueryModelGenerator.generate("test") - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueCommunicationGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueCommunicationGeneratorTest.java deleted file mode 100644 index 72b53a621..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueCommunicationGeneratorTest.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.NewMessageQueueAction; -import com.magento.idea.magento2plugin.actions.generation.data.QueueCommunicationData; -import com.magento.idea.magento2plugin.magento.files.QueueCommunicationXml; - -public class QueueCommunicationGeneratorTest extends BaseGeneratorTestCase { - private static final String TOPIC_NAME = "topic.name"; - private static final String HANDLER_NAME = "handlerName"; - private static final String HANDLER_TYPE = "Foo\\Bar\\Model\\Handler"; - private static final String HANDLER_METHOD = "execute"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - - /** - * Tests for generation of communication.xml file. - */ - public void testGenerateCommunicationXmlFile() { - final String filePath = this.getFixturePath(QueueCommunicationXml.fileName); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final QueueCommunicationGenerator communicationGenerator = new QueueCommunicationGenerator( - project, - new QueueCommunicationData( - TOPIC_NAME, - HANDLER_NAME, - HANDLER_TYPE, - HANDLER_METHOD, - MODULE_NAME - ) - ); - - final PsiFile file = communicationGenerator.generate(NewMessageQueueAction.ACTION_NAME); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueConsumerGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueConsumerGeneratorTest.java deleted file mode 100644 index 7b2813ed2..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueConsumerGeneratorTest.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.NewMessageQueueAction; -import com.magento.idea.magento2plugin.actions.generation.data.QueueConsumerData; -import com.magento.idea.magento2plugin.magento.files.QueueConsumerXml; - -public class QueueConsumerGeneratorTest extends BaseGeneratorTestCase { - private static final String CONSUMER_NAME = "consumer.name"; - private static final String QUEUE_NAME = "queue.name"; - private static final String CONSUMER_TYPE = "Foo\\Bar\\Model\\Consumer"; - private static final String MAX_MESSAGES = "100"; - private static final String CONNECTION_AMPQ = "amqp"; - private static final String CONNECTION_DB = "db"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - private static final String HANDLER = "Foo/Bar/Handler.php::execute"; - - /** - * Tests for generation of queue_consumer.xml file for the DB connection type. - */ - public void testGenerateConsumerDbXmlFile() { - final String filePath = this.getFixturePath(QueueConsumerXml.fileName); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final QueueConsumerGenerator consumerGenerator = new QueueConsumerGenerator( - project, - new QueueConsumerData( - CONSUMER_NAME, - QUEUE_NAME, - CONSUMER_TYPE, - MAX_MESSAGES, - CONNECTION_DB, - MODULE_NAME, - HANDLER - ) - ); - - final PsiFile file = consumerGenerator.generate(NewMessageQueueAction.ACTION_NAME); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } - - /** - * Tests for generation of queue_consumer.xml file for the AMPQ connection type. - */ - public void testGenerateConsumerAmpqXmlFile() { - final String filePath = this.getFixturePath(QueueConsumerXml.fileName); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final QueueConsumerGenerator consumerGenerator = new QueueConsumerGenerator( - project, - new QueueConsumerData( - CONSUMER_NAME, - QUEUE_NAME, - CONSUMER_TYPE, - MAX_MESSAGES, - CONNECTION_AMPQ, - MODULE_NAME, - HANDLER - ) - ); - - final PsiFile file = consumerGenerator.generate(NewMessageQueueAction.ACTION_NAME); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueuePublisherGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueuePublisherGeneratorTest.java deleted file mode 100644 index f761c65e2..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueuePublisherGeneratorTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.NewMessageQueueAction; -import com.magento.idea.magento2plugin.actions.generation.data.QueuePublisherData; -import com.magento.idea.magento2plugin.magento.files.QueuePublisherXml; - -public class QueuePublisherGeneratorTest extends BaseGeneratorTestCase { - private static final String EXCHANGE_NAME = "exchange-name"; - private static final String TOPIC_NAME = "topic.name"; - private static final String CONNECTION_NAME = "amqp"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - - /** - * Tests for generation of queue_publisher.xml file. - */ - public void testGeneratePublisherXmlFile() { - final String filePath = this.getFixturePath(QueuePublisherXml.fileName); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final QueuePublisherGenerator publisherGenerator = new QueuePublisherGenerator( - project, - new QueuePublisherData( - TOPIC_NAME, - CONNECTION_NAME, - EXCHANGE_NAME, - MODULE_NAME - ) - ); - - final PsiFile file = publisherGenerator.generate(NewMessageQueueAction.ACTION_NAME); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueTopologyGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueTopologyGeneratorTest.java deleted file mode 100644 index df01ec4f4..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueTopologyGeneratorTest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.NewMessageQueueAction; -import com.magento.idea.magento2plugin.actions.generation.data.QueueTopologyData; -import com.magento.idea.magento2plugin.magento.files.QueueTopologyXml; - -public class QueueTopologyGeneratorTest extends BaseGeneratorTestCase { - private static final String EXCHANGE_NAME = "exchange-name"; - private static final String BINDING_ID = "bindingId"; - private static final String BINDING_TOPIC = "topic.name"; - private static final String BINDING_QUEUE = "queue.name"; - private static final String CONNECTION_NAME = "amqp"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - - /** - * Tests for generation of queue_topology.xml file. - */ - public void testGenerateTopologyXmlFile() { - final String filePath = this.getFixturePath(QueueTopologyXml.fileName); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final QueueTopologyGenerator topologyGenerator = new QueueTopologyGenerator( - project, - new QueueTopologyData( - EXCHANGE_NAME, - CONNECTION_NAME, - BINDING_ID, - BINDING_TOPIC, - BINDING_QUEUE, - MODULE_NAME - ) - ); - - final PsiFile file = topologyGenerator.generate(NewMessageQueueAction.ACTION_NAME); - - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/RoutesXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/RoutesXmlGeneratorTest.java deleted file mode 100644 index 4cae3306d..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/RoutesXmlGeneratorTest.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.RoutesXmlData; -import com.magento.idea.magento2plugin.magento.files.RoutesXml; -import com.magento.idea.magento2plugin.magento.packages.Areas; - -public class RoutesXmlGeneratorTest extends BaseGeneratorTestCase { - - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc/adminhtml"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ROUTE = "customroute"; - - /** - * Test generating routes XML file. - */ - public void testGenerateRoutesXmlFile() { - final String filePath = this.getFixturePath(RoutesXml.FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - final RoutesXmlData routesXmlData = new RoutesXmlData( - Areas.adminhtml.toString(), - ROUTE, - MODULE_NAME - ); - final RoutesXmlGenerator routesXmlGenerator = new RoutesXmlGenerator( - routesXmlData, - project - ); - - final PsiFile file = routesXmlGenerator.generate("test"); - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityActionGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityActionGeneratorTest.java deleted file mode 100644 index 9df4db4b0..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityActionGeneratorTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.SaveEntityControllerFileData; -import com.magento.idea.magento2plugin.magento.files.actions.SaveActionFile; - -public class SaveEntityActionGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Company"; - private static final String DTO_NAME = "CompanyData"; - private static final String DTO_TYPE_INTERFACE = "CompanyInterface"; - private static final String EXPECTED_DIRECTORY = - "/src/app/code/Foo/Bar/Controller/Adminhtml/" + ENTITY_NAME; - private static final String ACL = "Foo_Bar::company_id"; - private static final String ENTITY_ID = "company_id"; - - /** - * Test generation of Save controller for entity without interface. - */ - public void testGenerateSaveEntityActionWithoutInterfaceFile() { - final SaveEntityControllerFileData saveEntityControllerFileData = - new SaveEntityControllerFileData( - ENTITY_NAME, - MODULE_NAME, - ACL, - ENTITY_ID, - DTO_NAME, - "", - false, - false - ); - final SaveEntityControllerFileGenerator saveEntityControllerFileGenerator = - new SaveEntityControllerFileGenerator( - saveEntityControllerFileData, - myFixture.getProject(), - false - ); - final PsiFile saveEntityActionFile = saveEntityControllerFileGenerator.generate("test"); - final String filePath = this.getFixturePath( - new SaveActionFile(MODULE_NAME, ENTITY_NAME).getFileName() - ); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIRECTORY, - saveEntityActionFile - ); - } - - /** - * Test generation of Save controller for entity with interface. - */ - public void testGenerateSaveEntityActionWithInterfaceFile() { - final SaveEntityControllerFileData saveEntityControllerFileData = - new SaveEntityControllerFileData( - ENTITY_NAME, - MODULE_NAME, - ACL, - ENTITY_ID, - DTO_NAME, - DTO_TYPE_INTERFACE, - true, - false - ); - final SaveEntityControllerFileGenerator saveEntityControllerFileGenerator = - new SaveEntityControllerFileGenerator( - saveEntityControllerFileData, - myFixture.getProject(), - false - ); - final PsiFile saveEntityActionFile = saveEntityControllerFileGenerator.generate("test"); - final String filePath = this.getFixturePath( - new SaveActionFile(MODULE_NAME, ENTITY_NAME).getFileName() - ); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIRECTORY, - saveEntityActionFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityCommandGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityCommandGeneratorTest.java deleted file mode 100644 index abc1c1eb2..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityCommandGeneratorTest.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.magento.idea.magento2plugin.actions.generation.data.SaveEntityCommandData; -import com.magento.idea.magento2plugin.magento.files.commands.SaveEntityCommandFile; - -public class SaveEntityCommandGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Book"; - private static final String ENTITY_ID = "book_id"; - private static final String MODEL_NAME = ENTITY_NAME + "Model"; - private static final String RESOURCE_MODEL_NAME = ENTITY_NAME + "Resource"; - private static final String DTO_NAME = ENTITY_NAME + "Data"; - private static final boolean IS_DTO_HAS_INTERFACE = false; - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Command/" + ENTITY_NAME; - private static final String ACL = "Foo_Bar::book_management"; - - /** - * Test generation of SaveCommand model for entity. - */ - public void testGenerateSaveEntityCommandFile() { - final SaveEntityCommandData saveEntityCommandData = new SaveEntityCommandData( - MODULE_NAME, - ENTITY_NAME, - ENTITY_ID, - MODEL_NAME, - RESOURCE_MODEL_NAME, - DTO_NAME, - "", - IS_DTO_HAS_INTERFACE, - ACL - ); - final SaveEntityCommandGenerator saveEntityCommandGenerator = - new SaveEntityCommandGenerator( - saveEntityCommandData, - myFixture.getProject(), - false - ); - final String filePath = this.getFixturePath( - new SaveEntityCommandFile(MODULE_NAME, ENTITY_NAME).getFileName() - ); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - EXPECTED_DIRECTORY, - saveEntityCommandGenerator.generate("test") - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SearchResultsFilesGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SearchResultsFilesGeneratorTest.java deleted file mode 100644 index 6dbd48525..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SearchResultsFilesGeneratorTest.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.php.SearchResultsData; -import com.magento.idea.magento2plugin.actions.generation.generator.php.SearchResultsGenerator; -import com.magento.idea.magento2plugin.actions.generation.generator.php.SearchResultsInterfaceGenerator; -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; -import com.magento.idea.magento2plugin.magento.files.SearchResultsFile; -import com.magento.idea.magento2plugin.magento.files.SearchResultsInterfaceFile; -import com.magento.idea.magento2plugin.magento.packages.Package; -import java.util.Objects; - -public class SearchResultsFilesGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String MODULE_ROOT_DIR = "src/app/code/Foo/Bar/"; - private static final String ENTITY_NAME = "Book"; - private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; - private static final String INTERFACE_EXPECTED_DIRECTORY = MODULE_ROOT_DIR + "Api/Data"; - private static final String IMPL_EXPECTED_DIRECTORY = MODULE_ROOT_DIR + "Model"; - private PsiFile interfaceFile; - private PsiFile classFile; - private PsiFile preferenceFile; - - @Override - public void setUp() throws Exception { - super.setUp(); - - final SearchResultsData searchResultsData = new SearchResultsData( - MODULE_NAME, - ENTITY_NAME, - ENTITY_DTO_TYPE - ); - classFile = new SearchResultsGenerator( - searchResultsData, - myFixture.getProject(), - false - ).generate("test"); - - final SearchResultsInterfaceGenerator interfaceGenerator = - new SearchResultsInterfaceGenerator( - searchResultsData, - myFixture.getProject(), - false - ); - interfaceFile = interfaceGenerator.generate("test"); - preferenceFile = interfaceGenerator.getPreferenceFile(); - } - - /** - * Test generation of search results interface for entity. - */ - public void testGenerateSearchResultsInterfaceFile() { - Objects.requireNonNull(interfaceFile); - - final String filePath = this.getFixturePath( - new SearchResultsInterfaceFile(MODULE_NAME, ENTITY_NAME).getFileName() - ); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - INTERFACE_EXPECTED_DIRECTORY, - interfaceFile - ); - } - - /** - * Test generation of search results class for entity. - */ - public void testGenerateSearchResultsFile() { - Objects.requireNonNull(classFile); - - final String filePath = this.getFixturePath( - new SearchResultsFile(MODULE_NAME, ENTITY_NAME).getFileName() - ); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(filePath), - IMPL_EXPECTED_DIRECTORY, - classFile - ); - } - - /** - * Test generation of search results preference for entity. - */ - public void testGenerateSearchResultsDiPreference() { - Objects.requireNonNull(interfaceFile); - Objects.requireNonNull(preferenceFile); - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(this.getFixturePath(ModuleDiXml.FILE_NAME)), - Package.moduleBaseAreaDir, - preferenceFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SourceModelGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SourceModelGeneratorTest.java deleted file mode 100644 index 76c059190..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SourceModelGeneratorTest.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.SourceModelData; - -public class SourceModelGeneratorTest extends BaseGeneratorTestCase { - private static final String MODULE_NAME = "Foo_Bar"; - - /** - * Test source model generation. - */ - public void testGenerateFile() { - final Project project = myFixture.getProject(); - - final SourceModelData sourceModelData = new SourceModelData(); - sourceModelData.setClassName("CustomSourceModel"); - sourceModelData.setModuleName(MODULE_NAME); - - final SourceModelGenerator sourceModelGeneratorGenerator = - new SourceModelGenerator(sourceModelData, project); - final PsiFile dataPatchFile = sourceModelGeneratorGenerator.generate("test"); - final String filePatch = this.getFixturePath("CustomSourceModel.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePatch); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Model/Source", - dataPatchFile - ); - } - - /** - * Test source model in custom directory generation. - */ - public void testGenerateFileInCustomDirectory() { - final Project project = myFixture.getProject(); - - final SourceModelData sourceModelData = new SourceModelData(); - sourceModelData.setClassName("CustomSourceModel"); - sourceModelData.setModuleName(MODULE_NAME); - sourceModelData.setDirectory("Custom/Source/Directory"); - - final SourceModelGenerator sourceModelGeneratorGenerator = - new SourceModelGenerator(sourceModelData, project); - final PsiFile dataPatchFile = sourceModelGeneratorGenerator.generate("test custom dir"); - final String filePatch = this.getFixturePath("CustomSourceModel.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePatch); - - assertGeneratedFileIsCorrect( - expectedFile, - "src/app/code/Foo/Bar/Custom/Source/Directory", - dataPatchFile - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentFormGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentFormGeneratorTest.java deleted file mode 100644 index 5aaf11a31..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentFormGeneratorTest.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormButtonData; -import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormFieldData; -import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormFieldsetData; -import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormFileData; -import com.magento.idea.magento2plugin.magento.packages.Areas; -import java.util.ArrayList; -import java.util.List; -import org.jetbrains.annotations.NotNull; - -public class UiComponentFormGeneratorTest extends BaseGeneratorTestCase { - - private static final String EXPECTED_DIRECTORY = - "src/app/code/Foo/Bar/view/adminhtml/ui_component"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ROUTE = "customroute"; - private static final String FORM_NAME = "my_form"; - private static final String FILE_NAME = "my_form.xml"; - private static final String LABEL = "My Form"; - - /** - * Test generating layout XML file. - */ - public void testGenerateFormXmlFile() { - final String filePath = this.getFixturePath(FILE_NAME); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - final Project project = myFixture.getProject(); - - final List buttons = getButtons(); - final List fieldsets = getFieldsets(); - final List fields = getFields(); - - final UiComponentFormFileData uiComponentFormData = new UiComponentFormFileData( - FORM_NAME, - Areas.adminhtml.toString(), - MODULE_NAME, - LABEL, - buttons, - fieldsets, - fields, - ROUTE, - "MyEntity", - "Save", - "DataProvider", - "Ui/MyEntity" - ); - final UiComponentFormGenerator uiComponentFormGenerator = new UiComponentFormGenerator( - uiComponentFormData, - project - ); - - final PsiFile file = uiComponentFormGenerator.generate("test"); - assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); - } - - /** - * Get fields data. - * - * @return List - */ - protected @NotNull List getFields() { - final List fields = new ArrayList<>(); - - fields.add(new UiComponentFormFieldData( - "my_field", - "My Field", - "10", - "General", - "input", - "text", - "entity" - )); - fields.add(new UiComponentFormFieldData( - "my_field_2", - "My Field 2", - "10", - "Test Fieldset", - "input", - "text", - "entity" - )); - - return fields; - } - - /** - * Get fieldSets data. - * - * @return List - */ - protected @NotNull List getFieldsets() { - final List fieldsets = new ArrayList<>(); - - fieldsets.add(new UiComponentFormFieldsetData( - "general", - "General", - "10" - )); - fieldsets.add(new UiComponentFormFieldsetData( - "test_fieldset", - "Test Fieldset", - "20" - )); - - return fieldsets; - } - - /** - * Get buttons data. - * - * @return List - */ - protected @NotNull List getButtons() { - final List buttons = new ArrayList<>(); - final String namespace = "Foo/Bar/Block/Form"; - final String directory = "Block/Form"; - - buttons.add(new UiComponentFormButtonData( - directory, - "SaveEntity", - MODULE_NAME, - "Save", - namespace, - "Save Entity", - "10", - FORM_NAME, - "Foo\\Bar\\Block\\Form\\Save" - )); - buttons.add(new UiComponentFormButtonData( - directory, - "BackToEntity", - MODULE_NAME, - "Back", - namespace, - "Back To Grid", - "20", - FORM_NAME, - "Foo\\Bar\\Block\\Form\\Back" - )); - buttons.add(new UiComponentFormButtonData( - directory, - "DeleteEntity", - MODULE_NAME, - "Save", - namespace, - "Delete Entity", - "30", - FORM_NAME, - "Foo\\Bar\\Block\\Form\\Delete" - )); - buttons.add(new UiComponentFormButtonData( - directory, - "CustomController", - MODULE_NAME, - "Custom", - namespace, - "Custom Button", - "40", - FORM_NAME, - "Foo\\Bar\\Block\\Form\\Custom" - )); - - return buttons; - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridDataProviderGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridDataProviderGeneratorTest.java deleted file mode 100644 index 0d240599b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridDataProviderGeneratorTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; -import com.magento.idea.magento2plugin.actions.generation.data.GetListQueryModelData; -import com.magento.idea.magento2plugin.actions.generation.data.UiComponentDataProviderData; -import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; - -public class UiComponentGridDataProviderGeneratorTest extends BaseGeneratorTestCase { - - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Ui/Component/Listing"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ENTITY_NAME = "Book"; - private static final String ENTITY_ID_FIELD_NAME = "book_id"; - private static final String MODEL_NAME = "Book"; - private static final String PROVIDER_CLASS_NAME = "GridDataProvider"; - private static final String PROVIDER_PATH = "Ui/Component/Listing"; - private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; - private static final String COLLECTION_NAME = "Collection"; - private static final String ACL = "Foo_Bar::book_management"; - - @Override - public void setUp() throws Exception { - super.setUp(); - final EntityCreatorContext context = new EntityCreatorContext(); - context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); - context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID_FIELD_NAME); - GenerationContextRegistry.getInstance().setContext(context); - } - - /** - * Test data provider class file generation with custom type. - */ - public void testGenerateCustomDataProvider() { - final PsiFile dataProviderFile = generateDataProvider(new UiComponentDataProviderData( - PROVIDER_CLASS_NAME, - PROVIDER_PATH - )); - final String filePath = this.getFixturePath("GridDataProvider.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIRECTORY, - dataProviderFile - ); - } - - /** - * Test data provider class file generation when get list query model exists. - */ - public void testGenerateDataProviderWithInjectedGetListQuery() { - generateGetListQuery(); - final PsiFile dataProviderFile = generateDataProvider(new UiComponentDataProviderData( - PROVIDER_CLASS_NAME, - PROVIDER_PATH, - ENTITY_NAME, - ENTITY_ID_FIELD_NAME, - false - )); - final String filePath = this.getFixturePath("GridDataProvider.php"); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect( - expectedFile, - EXPECTED_DIRECTORY, - dataProviderFile - ); - } - - /** - * Generate data provider file. - * - * @return PsiFile - */ - private PsiFile generateDataProvider(final UiComponentDataProviderData data) { - final Project project = myFixture.getProject(); - - return new UiComponentDataProviderGenerator( - data, - MODULE_NAME, - project - ).generate("test"); - } - - /** - * Generate get list query model file. - */ - private void generateGetListQuery() { - final Project project = myFixture.getProject(); - final GetListQueryModelData getListData = new GetListQueryModelData( - MODULE_NAME, - ENTITY_NAME, - MODEL_NAME, - COLLECTION_NAME, - ACL, - false - ); - new GetListQueryModelGenerator(getListData, project, false).generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridXmlGeneratorTest.java deleted file mode 100644 index 99403088f..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridXmlGeneratorTest.java +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.UiComponentGridData; -import com.magento.idea.magento2plugin.actions.generation.data.UiComponentGridToolbarData; -import com.magento.idea.magento2plugin.magento.packages.Areas; -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.magento.packages.Package; -import java.util.ArrayList; - -public class UiComponentGridXmlGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_DIRECTORY = "src/app/code/Foo/Bar/"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String COMPONENT_NAME = "custom_entity_grid"; - private static final String ENTITY_NAME = "Book"; - private static final String ID_FIELD_NAME = "entity_id"; - private static final String ACL = "Foo_Bar::custom_entity"; - private static final String DATA_PROVIDER_NAME = "DataProvider"; - private static final String DATA_PROVIDER_PATH = "Ui/Listing"; - - /** - * Test UI component listing file generation for specific area. - */ - public void testGenerateUiGridForBaseArea() { - final String area = Areas.base.toString(); - final PsiFile cronGroupsXmlFile = generateComponentGridXml( - area, - false - ); - final String filePath = this.getFixturePath(String.format("%s.%s", COMPONENT_NAME, "xml")); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect(expectedFile, getExpectedDirectory(area), cronGroupsXmlFile); - } - - /** - * Test UI component listing file generation without toolbar. - */ - public void testGenerateUiGridWithoutToolbar() { - final String area = Areas.adminhtml.toString(); - final PsiFile cronGroupsXmlFile = generateComponentGridXml( - area, - true - ); - final String filePath = this.getFixturePath(String.format("%s.%s", COMPONENT_NAME, "xml")); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect(expectedFile, getExpectedDirectory(area), cronGroupsXmlFile); - } - - /** - * Test UI component listing file generation with actions column. - */ - public void testGenerateUiGridForBaseAreaWithActionsColumnColumn() { - final String area = Areas.base.toString(); - final PsiFile cronGroupsXmlFile = generateComponentGridXmlWithActionsColumn(area); - final String filePath = this.getFixturePath(String.format("%s.%s", COMPONENT_NAME, "xml")); - final PsiFile expectedFile = myFixture.configureByFile(filePath); - - assertGeneratedFileIsCorrect(expectedFile, getExpectedDirectory(area), cronGroupsXmlFile); - } - - /** - * Generate UI Component Grid Xml file. - * - * @param area String - * @param addToolbar boolean - * - * @return PsiFile - */ - private PsiFile generateComponentGridXml( - final String area, - final boolean addToolbar - ) { - final Project project = myFixture.getProject(); - final UiComponentGridToolbarData uiGridToolbarData = new UiComponentGridToolbarData( - addToolbar, - true, - true, - true, - true - ); - final UiComponentGridData uiGridData = new UiComponentGridData( - MODULE_NAME, - area, - COMPONENT_NAME, - ID_FIELD_NAME, - ACL, - DATA_PROVIDER_NAME, - DATA_PROVIDER_PATH, - uiGridToolbarData - ); - final UiComponentGridXmlGenerator uiGridXmlGenerator = new UiComponentGridXmlGenerator( - uiGridData, - project - ); - - return uiGridXmlGenerator.generate("test"); - } - - /** - * Generate UI Component Grid Xml file with actions column. - * - * @param area String - * - * @return PsiFile - */ - private PsiFile generateComponentGridXmlWithActionsColumn( - final String area - ) { - final Project project = myFixture.getProject(); - final UiComponentGridToolbarData uiGridToolbarData = new UiComponentGridToolbarData( - false, - true, - true, - true, - true - ); - final UiComponentGridData uiGridData = new UiComponentGridData( - MODULE_NAME, - area, - COMPONENT_NAME, - ID_FIELD_NAME, - ACL, - DATA_PROVIDER_NAME, - DATA_PROVIDER_PATH, - ENTITY_NAME, - uiGridToolbarData, - new ArrayList<>() - ); - final UiComponentGridXmlGenerator uiGridXmlGenerator = new UiComponentGridXmlGenerator( - uiGridData, - project - ); - - return uiGridXmlGenerator.generate("test"); - } - - /** - * Get expected directory. - * - * @param area Area code - * @return String - */ - private String getExpectedDirectory(final String area) { - return String.format( - "%s%s%s%s%s%s", - MODULE_DIRECTORY, - Package.moduleViewDir, - File.separator, - area, - File.separator, - Package.moduleViewUiComponentDir - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiInterfaceGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiInterfaceGeneratorTest.java deleted file mode 100644 index 67373c302..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiInterfaceGeneratorTest.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.jetbrains.php.codeInsight.PhpCodeInsightUtil; -import com.jetbrains.php.config.PhpLanguageLevel; -import com.jetbrains.php.config.PhpProjectConfigurationFacade; -import com.jetbrains.php.lang.documentation.phpdoc.PhpDocUtil; -import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment; -import com.jetbrains.php.lang.psi.elements.ClassReference; -import com.jetbrains.php.lang.psi.elements.Method; -import com.jetbrains.php.lang.psi.elements.PhpClass; -import com.jetbrains.php.lang.psi.elements.PhpPsiElement; -import com.jetbrains.php.lang.psi.elements.PhpUse; -import com.jetbrains.php.lang.psi.elements.PhpUseList; -import com.magento.idea.magento2plugin.actions.generation.data.php.WebApiInterfaceData; -import com.magento.idea.magento2plugin.actions.generation.generator.php.WebApiInterfaceGenerator; -import com.magento.idea.magento2plugin.magento.files.WebApiInterfaceFile; -import com.magento.idea.magento2plugin.util.GetPhpClassByFQN; -import com.magento.idea.magento2plugin.util.php.PhpTypeMetadataParserUtil; -import java.util.Arrays; -import java.util.List; -import java.util.stream.Collectors; -import org.jetbrains.annotations.NotNull; - -public class WebApiInterfaceGeneratorTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Api"; - - private static final String COULD_NOT_GENERATE_MESSAGE = - WebApiInterfaceFile.TEMPLATE + " could not be generated!"; - private static final String COULD_NOT_FIND_SERVICE_MESSAGE = - "A service for the test could not be found!"; - private static final String METHOD_DOES_NOT_HAVE_INHERIT_DOC = - "Service method does not have @inheritDoc block"; - private static final String SERVICE_SHOULD_HAVE_INTERFACE_IMPORTED = - "Service should have generated interface in the use block"; - private static final String SERVICE_SHOULD_IMPLEMENT_INTERFACE = - "Service should implement generated interface"; - - private static final String FIRST_SERVICE_FQN = "Foo\\Bar\\Service\\SimpleService"; - private static final String FIRST_SERVICE_METHODS = "execute"; - private static final String FIRST_INTERFACE_NAME = "SimpleServiceInterface"; - private static final String FIRST_INTERFACE_DESCRIPTION = "Simple service description."; - - private static final String SECOND_SERVICE_FQN = "Foo\\Bar\\Service\\SimpleServiceTwo"; - private static final String SECOND_SERVICE_METHODS = "execute,fetch"; - private static final String SECOND_INTERFACE_NAME = "SimpleServiceTwoInterface"; - private static final String SECOND_INTERFACE_DESCRIPTION = "Simple service two description."; - - @Override - public void setUp() throws Exception { - super.setUp(); - PhpProjectConfigurationFacade.getInstance(myFixture.getProject()) - .setLanguageLevel(PhpLanguageLevel.PHP720); - } - - /** - * Test generation of Web API interface for a service with primitive types. - */ - @SuppressWarnings({"PMD.JUnitTestContainsTooManyAsserts"}) - public void testWithPrimitiveTypes() { - final PhpClass service = extractServiceByFqn(FIRST_SERVICE_FQN); - final List publicMethods = PhpTypeMetadataParserUtil.getPublicMethods(service); - - final PsiFile result = generateInterfaceForService( - FIRST_SERVICE_FQN, - FIRST_INTERFACE_NAME, - FIRST_INTERFACE_DESCRIPTION, - publicMethods.stream() - .filter( - method -> Arrays.asList(FIRST_SERVICE_METHODS.split(",")) - .contains(method.getName()) - ) - .collect(Collectors.toList()) - ); - - if (result == null) { - fail(COULD_NOT_GENERATE_MESSAGE); - } - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(this.getFixturePath(FIRST_INTERFACE_NAME.concat(".php"))), - EXPECTED_DIRECTORY, - result - ); - - assertServiceMethodsHaveInheritDoc( - service, - Arrays.asList(FIRST_SERVICE_METHODS.split(",")) - ); - - assertServiceHasInterfaceReference( - service, - FIRST_INTERFACE_NAME - ); - } - - /** - * Test generation of Web API interface for a service with Object types. - */ - @SuppressWarnings({"PMD.JUnitTestContainsTooManyAsserts"}) - public void testWithObjectTypesAndPhpDocComments() { - final PhpClass service = extractServiceByFqn(SECOND_SERVICE_FQN); - final List publicMethods = PhpTypeMetadataParserUtil.getPublicMethods(service); - - final PsiFile result = generateInterfaceForService( - SECOND_SERVICE_FQN, - SECOND_INTERFACE_NAME, - SECOND_INTERFACE_DESCRIPTION, - publicMethods.stream() - .filter( - method -> Arrays.asList(SECOND_SERVICE_METHODS.split(",")) - .contains(method.getName()) - ) - .collect(Collectors.toList()) - ); - - if (result == null) { - fail(COULD_NOT_GENERATE_MESSAGE); - } - - assertGeneratedFileIsCorrect( - myFixture.configureByFile( - this.getFixturePath(SECOND_INTERFACE_NAME.concat(".php")) - ), - EXPECTED_DIRECTORY, - result - ); - - assertServiceMethodsHaveInheritDoc( - service, - Arrays.asList(SECOND_SERVICE_METHODS.split(",")) - ); - - assertServiceHasInterfaceReference( - service, - SECOND_INTERFACE_NAME - ); - } - - /** - * Asset that service methods have inherit doc after Web API interface generation. - * - * @param service PhpClass - * @param checkingMethods List[String] - */ - private void assertServiceMethodsHaveInheritDoc( - final @NotNull PhpClass service, - final @NotNull List checkingMethods - ) { - for (final Method method : service.getMethods()) { - if (checkingMethods.contains(method.getName())) { - final PhpDocComment methodDoc = method.getDocComment(); - - if (methodDoc == null || !methodDoc.getText().contains(PhpDocUtil.INHERITDOC_TAG)) { - fail(METHOD_DOES_NOT_HAVE_INHERIT_DOC); - } - } - } - } - - /** - * Assert that service has interface imported in use block and in implements part. - * - * @param service PhpClass - * @param generatedInterfaceName String - */ - @SuppressWarnings({"PMD.CyclomaticComplexity"}) - private void assertServiceHasInterfaceReference( - final @NotNull PhpClass service, - final @NotNull String generatedInterfaceName - ) { - boolean implementFound = false; - - for (final ClassReference reference : service.getImplementsList().getReferenceElements()) { - if (reference.getName() != null && reference.getName().equals(generatedInterfaceName)) { - implementFound = true; - break; - } - } - - if (!implementFound) { - fail(SERVICE_SHOULD_IMPLEMENT_INTERFACE); - } - - final PhpPsiElement scopeForUseOperator = - PhpCodeInsightUtil.findScopeForUseOperator(service); - - if (scopeForUseOperator == null) { - fail(SERVICE_SHOULD_IMPLEMENT_INTERFACE); - } - final List imports = PhpCodeInsightUtil.collectImports(scopeForUseOperator); - boolean importFound = false; - - for (final PhpUseList useList : imports) { - final PhpUse[] uses = useList.getDeclarations(); - - for (final PhpUse use : uses) { - if (use.getName().equals(generatedInterfaceName)) { - importFound = true; - break; - } - } - } - - if (!importFound) { - fail(SERVICE_SHOULD_HAVE_INTERFACE_IMPORTED); - } - } - - /** - * Extract service by FQN. - * - * @param classFqn String - * - * @return PhpClass - */ - private PhpClass extractServiceByFqn(final @NotNull String classFqn) { - final PhpClass service = GetPhpClassByFQN - .getInstance(myFixture.getProject()).execute(classFqn); - - if (service == null) { - fail(COULD_NOT_FIND_SERVICE_MESSAGE); - } - - return service; - } - - /** - * Generate interface for specified service. - * - * @param serviceFqn String - * @param interfaceName String - * @param interfaceDescription String - * @param methodList List[Method] - * - * @return PsiFile - */ - private PsiFile generateInterfaceForService( - final @NotNull String serviceFqn, - final @NotNull String interfaceName, - final @NotNull String interfaceDescription, - final @NotNull List methodList - ) { - final WebApiInterfaceData data = new WebApiInterfaceData( - MODULE_NAME, - serviceFqn, - interfaceName, - interfaceDescription, - methodList - ); - final WebApiInterfaceGenerator generator = new WebApiInterfaceGenerator( - data, - myFixture.getProject() - ); - - return generator.generate("test"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiXmlDeclarationGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiXmlDeclarationGeneratorTest.java deleted file mode 100644 index f6702a32f..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiXmlDeclarationGeneratorTest.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator; - -import com.intellij.psi.PsiFile; -import com.magento.idea.magento2plugin.actions.generation.data.xml.WebApiXmlRouteData; -import com.magento.idea.magento2plugin.actions.generation.generator.xml.WebApiDeclarationGenerator; -import com.magento.idea.magento2plugin.magento.files.ModuleWebApiXmlFile; - -public class WebApiXmlDeclarationGeneratorTest extends BaseGeneratorTestCase { - - private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; - private static final String COULD_NOT_GENERATE_MESSAGE = - ModuleWebApiXmlFile.DECLARATION_TEMPLATE + " could not be generated!"; - private static final String MODULE_NAME = "Foo_Bar"; - private static final String URL = "test/foo/save"; - private static final String HTTP_METHOD = "POST"; - private static final String SERVICE_CLASS = "Foo\\Bar\\Api\\SaveFoo"; - private static final String SERVICE_METHOD = "execute"; - private static final String RESOURCE = "self"; - - /** - * Test generation of Web API xml declaration for a service. - */ - public void testGenerateWebApiXmlDeclarationForService() { - final WebApiXmlRouteData data = new WebApiXmlRouteData( - MODULE_NAME, - URL, - HTTP_METHOD, - SERVICE_CLASS, - SERVICE_METHOD, - RESOURCE - ); - final WebApiDeclarationGenerator generator = new WebApiDeclarationGenerator( - data, - myFixture.getProject() - ); - final PsiFile result = generator.generate("test"); - - if (result == null) { - fail(COULD_NOT_GENERATE_MESSAGE); - } - - assertGeneratedFileIsCorrect( - myFixture.configureByFile(this.getFixturePath(ModuleWebApiXmlFile.FILE_NAME)), - EXPECTED_DIRECTORY, - result - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/pool/NewEntityGeneratorPoolTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/pool/NewEntityGeneratorPoolTest.java deleted file mode 100644 index f6a7c2773..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/pool/NewEntityGeneratorPoolTest.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator.pool; - -import com.magento.idea.magento2plugin.actions.generation.data.dialog.EntityCreatorContextData; -import com.magento.idea.magento2plugin.actions.generation.data.dialog.NewEntityDialogData; -import com.magento.idea.magento2plugin.actions.generation.generator.BaseGeneratorTestCase; -import com.magento.idea.magento2plugin.actions.generation.generator.pool.provider.NewEntityGeneratorsProviderUtil; -import com.magento.idea.magento2plugin.actions.generation.generator.util.NamespaceBuilder; -import java.util.ArrayList; - -public class NewEntityGeneratorPoolTest extends BaseGeneratorTestCase { - - private static final String MODULE_NAME = "Foo_Bar"; - private static final String ACTION_NAME = "Test"; - private static final String INDEX_PATH = "index"; - private static final String EDIT_PATH = "edit"; - private static final String NEW_PATH = "new"; - private static final String DELETE_PATH = "delete"; - - /** - * Test if generator pool handler instantiated without any error. - */ - public void testGeneratorsInPoolInstantiating() { - final NewEntityDialogData dialogData = getMockNewEntityDialogData(); - final EntityCreatorContextData contextData = getMockContext(); - final GeneratorPoolHandler generatorPoolHandler = new GeneratorPoolHandler(contextData); - - NewEntityGeneratorsProviderUtil.initializeGenerators( - generatorPoolHandler, - contextData, - dialogData - ); - - assertFalse( - "There are errors during generators instantiating.", - generatorPoolHandler.hasErrorMessages() - ); - } - - /** - * Test if generators handlers doesn't have any DTO converter type errors. - */ - public void testGeneratorsInPoolOnCorrectDtoConverterTypes() { - final NewEntityDialogData dialogData = getMockNewEntityDialogData(); - final EntityCreatorContextData contextData = getMockContext(); - final GeneratorPoolHandler generatorPoolHandler = new GeneratorPoolHandler(contextData); - - NewEntityGeneratorsProviderUtil.initializeGenerators( - generatorPoolHandler, - contextData, - dialogData - ); - - try { - generatorPoolHandler.instantiateAllGenerators(); - } catch (ClassCastException exception) { - fail("Wrong type provided for generator: " + exception.getMessage()); - } - } - - /** - * Get mocked new entity dialog data. - * - * @return NewEntityDialogData - */ - @SuppressWarnings("PMD.AvoidDuplicateLiterals") - private NewEntityDialogData getMockNewEntityDialogData() { - return new NewEntityDialogData( - "test", - "test", - "test", - "test", - "test", - true, - true, - false, - "test", - "test", - "test", - "test", - true, - true, - true, - true, - true, - "test", - "test", - "test", - "test", - 10, - "test", - "test", - "test" - ); - } - - /** - * Get mocked entity creator context data. - * - * @return EntityCreatorContextData - */ - private EntityCreatorContextData getMockContext() { - final NamespaceBuilder mockNamespace = new NamespaceBuilder( - MODULE_NAME, - "MockClass", - "Mock/Directory" - ); - - return new EntityCreatorContextData( - this.myFixture.getProject(), - MODULE_NAME, - ACTION_NAME, - false, - false, - INDEX_PATH, - EDIT_PATH, - NEW_PATH, - DELETE_PATH, - mockNamespace, - mockNamespace, - mockNamespace, - mockNamespace, - new ArrayList<>(), - new ArrayList<>(), - new ArrayList<>(), - new ArrayList<>() - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DbSchemaGeneratorDataProviderUtil.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DbSchemaGeneratorDataProviderUtil.java deleted file mode 100644 index 99a058ea2..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DbSchemaGeneratorDataProviderUtil.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.actions.generation.generator.util; - -import com.magento.idea.magento2plugin.magento.packages.PropertiesTypes; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -public final class DbSchemaGeneratorDataProviderUtil { - - private static final String PROPERTY_NAME = "Name"; - private static final String PROPERTY_TYPE = "Type"; - - private DbSchemaGeneratorDataProviderUtil() {} - - /** - * Generate properties for testcases. - * - * @return List of prepared properties. - */ - public static List> generateEntityPropertiesForTest() { - final List> propertyList = new LinkedList<>(); - - final Map nameProperty = new HashMap<>(); - nameProperty.put(PROPERTY_NAME, "name"); - nameProperty.put(PROPERTY_TYPE, PropertiesTypes.STRING.getPropertyType()); - propertyList.add(nameProperty); - - final Map ageProperty = new HashMap<>(); - ageProperty.put(PROPERTY_NAME, "age"); - ageProperty.put(PROPERTY_TYPE, PropertiesTypes.INT.getPropertyType()); - propertyList.add(ageProperty); - - final Map salaryProperty = new HashMap<>(); - salaryProperty.put(PROPERTY_NAME, "salary"); - salaryProperty.put(PROPERTY_TYPE, PropertiesTypes.FLOAT.getPropertyType()); - propertyList.add(salaryProperty); - - final Map singleProperty = new HashMap<>(); - singleProperty.put(PROPERTY_NAME, "is_single"); - singleProperty.put(PROPERTY_TYPE, PropertiesTypes.BOOL.getPropertyType()); - propertyList.add(singleProperty); - - return propertyList; - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/BaseCompletionTestCase.java b/src/test/java/com/magento/idea/magento2plugin/completion/BaseCompletionTestCase.java deleted file mode 100644 index ca7dccdf5..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/BaseCompletionTestCase.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion; - -import com.magento.idea.magento2plugin.BaseProjectTestCase; -import com.magento.idea.magento2plugin.magento.packages.File; -import java.util.Arrays; -import java.util.List; - -public abstract class BaseCompletionTestCase extends BaseProjectTestCase { - private static final String MESSAGE_NO_LOOKUP = "No lookup element was provided"; - private final String testDataFolderPath - = "testData" + File.separator + "completion" + File.separator; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.setTestDataPath(testDataFolderPath); - } - - private void configureFixture(final String filePath) { - myFixture.configureByFile(filePath); - myFixture.completeBasic(); - } - - /** - * Assert that completion suggestions contains the given lookup strings. - */ - public void assertCompletionContains(final String filePath, final String... lookupStrings) { - configureFixture(filePath); - - final String messageEmptyLookup = "Failed that completion contains `%s`"; - final String messageComplationContains = "Failed that completion contains `%s` in `%s`"; - - checkContainsCompletion(lookupStrings, messageEmptyLookup, messageComplationContains); - } - - protected void assertFileContainsCompletions( - final String filePath, - final String... lookupStrings - ) { - configureFixture(filePath); - - final String messageEmptyLookup - = "Failed that completion contains `%s` for file " + filePath; - final String messageCompletionContains - = "Failed that completion contains `%s` in `%s` for file " + filePath; - - checkContainsCompletion(lookupStrings, messageEmptyLookup, messageCompletionContains); - } - - protected void assertFileNotContainsCompletions( - final String filePath, - final String... lookupStrings - ) { - configureFixture(filePath); - - final String messageCompletionNotContains - = "Failed that completion does not contain `%s` in `%s` for file " + filePath; - - checkDoesNotContainCompletion( - lookupStrings, messageCompletionNotContains - ); - } - - protected void assertCompletionNotShowing(final String filePath) { - configureFixture(filePath); - - final List lookupElements = myFixture.getLookupElementStrings(); - - if (lookupElements != null && !lookupElements.isEmpty()) { - final String messageCompletionDoesNotShow - = "Failed asserting that completion does not show up"; - - fail(messageCompletionDoesNotShow); - } - } - - protected void checkContainsCompletion( - final String[] lookupStrings, - final String emptyLookupError, - final String completionContainsError - ) { - if (lookupStrings.length == 0) { - fail(MESSAGE_NO_LOOKUP); - } - - final List lookupElements = myFixture.getLookupElementStrings(); - - if (lookupElements == null || lookupElements.isEmpty()) { - fail(String.format(emptyLookupError, Arrays.toString(lookupStrings))); - } - - for (final String lookupString : lookupStrings) { - if (!lookupElements.contains(lookupString)) { - fail(String.format( - completionContainsError, lookupString, lookupElements.toString()) - ); - } - } - } - - protected void checkDoesNotContainCompletion( - final String[] lookupStrings, - final String completionDoesNotContainError - ) { - if (lookupStrings.length == 0) { - fail(MESSAGE_NO_LOOKUP); - } - - final List lookupElements = myFixture.getLookupElementStrings(); - - if (lookupElements != null) { - for (final String lookupString : lookupStrings) { - if (lookupElements.contains(lookupString)) { - fail(String.format( - completionDoesNotContainError, lookupString, lookupElements.toString()) - ); - } - } - } - } - - protected abstract String getFixturePath(String fileName); -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/php/CompletionPhpFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/completion/php/CompletionPhpFixtureTestCase.java deleted file mode 100644 index 1198f39f0..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/php/CompletionPhpFixtureTestCase.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.php; - -import com.magento.idea.magento2plugin.completion.BaseCompletionTestCase; -import com.magento.idea.magento2plugin.magento.packages.File; - -public abstract class CompletionPhpFixtureTestCase extends BaseCompletionTestCase { - private static final String FIXTURES_FOLDER_PATH = "php" + File.separator; - - @Override - protected String getFixturePath(final String fileName) { - return prepareFixturePath(fileName, FIXTURES_FOLDER_PATH); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/php/ConfigPhpModuleCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/php/ConfigPhpModuleCompletionRegistrarTest.java deleted file mode 100644 index d6650cabb..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/php/ConfigPhpModuleCompletionRegistrarTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.php; - -public class ConfigPhpModuleCompletionRegistrarTest extends CompletionPhpFixtureTestCase { - private static final String[] LOOKUP_MODULE_NAMES = { - "Magento_Catalog", - "Magento_Config" - }; - - /** - * Tests for module name completion under array key 'modules' in config.php - */ - public void testModuleNameMustHaveCompletion() { - final String filePath = this.getFixturePath("config.php"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, LOOKUP_MODULE_NAMES); - } - - /** - * Tests for no module name completion under a different array key in config.php - */ - public void testModuleNameMustNotHaveCompletion() { - final String filePath = this.getFixturePath("config.php"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/BackendModelXmlCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/BackendModelXmlCompletionRegistrarTest.java deleted file mode 100644 index 0a5a14b63..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/BackendModelXmlCompletionRegistrarTest.java +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleConfigXml; -import com.magento.idea.magento2plugin.magento.files.ModuleSystemXmlFile; - -public class BackendModelXmlCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - private static final String[] SYSTEM_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK = { - "Magento\\Backend\\Model\\Source\\Roles" - }; - private static final String[] CONFIG_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK = { - "Magento\\Backend\\Model\\Source\\YesNo" - }; - - /** - * Test system.xml file element completion. - */ - public void testSystemXmlElementProvideCompletion() { - final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); - myFixture.configureByFile(filePath); - - assertCompletionContains(filePath, SYSTEM_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK); - } - - /** - * Test system.xml file element completion won't show. - */ - public void testSystemXmlElementCompletionWontShow() { - final String filePath = this.getFixturePath( - ModuleSystemXmlFile.FILE_NAME - ); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - /** - * Test system.xml backend model attribute match with the file. - */ - public void testSystemXmlBackendModelAttributeMatchWithFile() { - final String filePath = this.getFixturePath( - ModuleSystemXmlFile.FILE_NAME - ); - - assertFileContainsCompletions(filePath, SYSTEM_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK); - } - - /** - * Test system.xml backend model attribute doesn't match with the file. - */ - public void testSystemXmlBackendModelAttributeDontMatchWithFile() { - final String filePath = this.getFixturePath( - "other-file-than-system.xml" - ); - - assertFileNotContainsCompletions( - filePath, - SYSTEM_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK - ); - } - - /** - * Test config.xml file element completion. - */ - public void testConfigXmlElementProvideCompletion() { - final String filePath = this.getFixturePath( - ModuleConfigXml.FILE_NAME - ); - myFixture.copyFileToProject(filePath); - - assertCompletionContains(filePath, CONFIG_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK); - } - - /** - * Test config.xml file element completion won't show. - */ - public void testConfigXmlElementCompletionWontShow() { - final String filePath = this.getFixturePath( - ModuleConfigXml.FILE_NAME - ); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - /** - * Test config.xml backend model attribute match with the file. - */ - public void testConfigXmlBackendModelAttributeMatchWithFile() { - final String filePath = this.getFixturePath( - ModuleConfigXml.FILE_NAME - ); - - assertFileContainsCompletions(filePath, CONFIG_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK); - } - - /** - * Test config.xml backend model attribute doesn't match with the file. - */ - public void testConfigXmlBackendModelAttributeDontMatchWithFile() { - final String filePath = this.getFixturePath( - "other-file-than-config.xml" - ); - - assertFileNotContainsCompletions( - filePath, - CONFIG_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/CompletionXmlFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/CompletionXmlFixtureTestCase.java deleted file mode 100644 index 6506be818..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/CompletionXmlFixtureTestCase.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.completion.BaseCompletionTestCase; -import com.magento.idea.magento2plugin.magento.packages.File; - -public abstract class CompletionXmlFixtureTestCase extends BaseCompletionTestCase { - private static final String FIXTURES_FOLDER_PATH = "xml" + File.separator; - - @Override - protected String getFixturePath(final String fileName) { - return prepareFixturePath(fileName, FIXTURES_FOLDER_PATH); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConfigurationTypeCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConfigurationTypeCompletionRegistrarTest.java deleted file mode 100644 index 912819e0b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConfigurationTypeCompletionRegistrarTest.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class ConfigurationTypeCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - private static final String[] lookupStringsTypeName = new String[] { - "Magento\\Backend\\Model\\Source\\YesNo" - }; - - public void testDiXmlTypeNameMustHaveCompletion() { - String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsTypeName); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConstructorArgumentCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConstructorArgumentCompletionRegistrarTest.java deleted file mode 100644 index 10dded7f7..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConstructorArgumentCompletionRegistrarTest.java +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class ConstructorArgumentCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - /** - * Tests for completion of constructor argument in di.xml. - */ - public void testDiXmlMustHaveCompletion() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, "logger"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/CrontabCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/CrontabCompletionRegistrarTest.java deleted file mode 100644 index 39f340493..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/CrontabCompletionRegistrarTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.CrontabXmlTemplate; - -public class CrontabCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - private static final String EXPECTED_INSTANCE = "Magento\\Catalog\\Cron\\RefreshSpecialPrices"; - private static final String EXPECTED_METHOD = "execute"; - private static final String WRONG_FILE_NAME = "wrong_named_crontab.xml"; - - /** - * The `instance` attribute of the `job` tag in crontab.xml must - * have completion based on PHP classes index. - */ - public void testCronJobInstanceMustHaveCompletion() { - final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); - assertCompletionContains(filePath, EXPECTED_INSTANCE); - } - - /** - * The `instance` attribute of the `job` tag in the - * non crontab.xml file must not have completion. - */ - public void testNotCrontabXmlMustHaveNotCompletion() { - final String filePath = this.getFixturePath(WRONG_FILE_NAME); - assertFileNotContainsCompletions(filePath, EXPECTED_INSTANCE); - } - - /** - * The non `instance` attribute of the `job` tag in crontab.xml must - * not have completion. - */ - public void testNotInstanceAttrMustHaveNotCompletion() { - final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); - assertFileNotContainsCompletions(filePath, EXPECTED_INSTANCE); - } - - /** - * The `instance` attribute that isn't in the `job` tag in crontab.xml must - * not have completion. - */ - public void testNotJobTagMustHaveNotCompletion() { - final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); - assertFileNotContainsCompletions(filePath, EXPECTED_INSTANCE); - } - - /** - * The `method` attribute of the `job` tag in crontab.xml must - * have completion based on PHP Job method completion provider. - */ - public void testCronJobMethodMustHaveCompletion() { - final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); - assertCompletionContains(filePath, EXPECTED_METHOD); - } - - /** - * The `method` attribute must not have completion - * if it isn`t in the crontab.xml file. - */ - public void testNotCrontabXmlMethodMustHaveNotCompletion() { - final String filePath = this.getFixturePath(WRONG_FILE_NAME); - assertFileNotContainsCompletions(filePath, EXPECTED_METHOD); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutBlockCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutBlockCompletionRegistrarTest.java deleted file mode 100644 index e1f2ff7cf..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutBlockCompletionRegistrarTest.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.LayoutXml; - -public class LayoutBlockCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - public void testReferenceBlockMustHaveCompletion() { - String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); - myFixture.configureByFile(filePath); - - assertCompletionContains(filePath, new String[] { - "test_index_index_block", - "test_index_index_block2" - }); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutContainerCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutContainerCompletionRegistrarTest.java deleted file mode 100644 index aa35e1cac..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutContainerCompletionRegistrarTest.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.LayoutXml; - -public class LayoutContainerCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - /** - * The `name` attribute of the `referenceContainer` tag in layout XML must - * have completion based on `name` attribute of `container` tags. - */ - public void testReferenceContainerMustHaveCompletion() { - final String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); - myFixture.configureByFile(filePath); - - assertCompletionContains( - filePath, - "test_index_index_container", - "test_index_index_container2" - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUIComponentCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUIComponentCompletionRegistrarTest.java deleted file mode 100644 index 30f037419..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUIComponentCompletionRegistrarTest.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.LayoutXml; - -public class LayoutUIComponentCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - /** - * Test ui component must have completion. - */ - public void testUIComponentMustHaveCompletion() { - final String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); - myFixture.configureByFile(filePath); - - assertCompletionContains(filePath, - "recently_viewed", - "recently_viewed_2" - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUpdateHandleCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUpdateHandleCompletionRegistrarTest.java deleted file mode 100644 index dd8fa44f4..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUpdateHandleCompletionRegistrarTest.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -public class LayoutUpdateHandleCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - /** - * The `handle` attribute of the `update` tag in the layout XML must - * have completion based on layout index. - */ - public void testUpdateHandleMustHaveCompletion() { - final String filePath = this.getFixturePath("test_test_test.xml"); - myFixture.configureByFile(filePath); - - assertCompletionContains( - filePath, - "test_index_index", - "test_index_index2" - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MenuCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MenuCompletionRegistrarTest.java deleted file mode 100644 index 7f4cd302e..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MenuCompletionRegistrarTest.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleMenuXml; - -public class MenuCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - /** - * The `parent` attribute of the `add` tag in the men XML must - * have completion based on the index. - */ - public void testAddTagMustHaveCompletion() { - final String filePath = this.getFixturePath(ModuleMenuXml.fileName); - myFixture.configureByFile(filePath); - - assertCompletionContains( - filePath, - "Magento_Catalog::catalog", - "Magento_Catalog::inventory" - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfEntityNameCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfEntityNameCompletionRegistrarTest.java deleted file mode 100644 index f6ce4c58a..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfEntityNameCompletionRegistrarTest.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.completion.xml; - -public class MftfEntityNameCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - private static final String[] lookupStringsEntities = new String[] { - "TestAdminMenuCatalog", - "TestAdminMenuCatalog.pageTitle", - "TestDefaultAttributeSet", - "TestDefaultAttributeSet.attribute_set_id" - }; - - public void testCreateDataActionGroupMustProvideCompletion() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testCreateDataInTestMustProvideCompletion () { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testCreateDataInTestWithSectionMustBeEmpty () { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testUpdateDataActionGroupMustProvideCompletion () { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testUpdateDataActionGroupMustBeEmpty () { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testUpdateDataInTestMustProvideCompletion () { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testUpdateDataInTestMustBeEmpty () { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testUserInputInActionGroupMustProvideCompletion () { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testUserInputInActionGroupMustBeEmpty () { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testUserInputInTestMustProvideCompletion () { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testUserInputInTestMustBeEmpty () { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testEntityExtendsInDataMustProvideCompletion () { - String filePath = this.getFixturePath("TestData.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testEntityExtendsInDataMustBeEmpty () { - String filePath = this.getFixturePath("TestData.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfNameCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfNameCompletionRegistrarTest.java deleted file mode 100644 index 97cec91cc..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfNameCompletionRegistrarTest.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.completion.xml; - -public class MftfNameCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - private static final String[] lookupStringsEntities = new String[] { - "TestAddOutOfStockProductToCompareListTest", - "TestVerifyTinyMCEv4IsNativeWYSIWYGOnProductTest" - }; - - public void testExtendsMustProvideCompletion() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testExtendsInActionGroupMustBeEmpty() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testExtendsSameNameMustBeEmpty() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testExtendsSameNameMustBeEmptyForActionGroup() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfPageUrlCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfPageUrlCompletionRegistrarTest.java deleted file mode 100644 index 4df71b769..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfPageUrlCompletionRegistrarTest.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.completion.xml; - -public class MftfPageUrlCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - private static final String[] lookupStrings = new String[] { - "TestPage.url", - "TestPage2.url" - }; - - public void testPageUrlInActionGroupMustProvideCompletion() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStrings); - } - public void testPageUrlInActionGroupMustBeEmptyForSection() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testPageUrlInActionGroupMustBeEmptyForTestDocument() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testPageUrlInActionGroupMustBeEmptyForEntity() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testPageUrlInTestMustProvideCompletion() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStrings); - } - - public void testPageUrlBeforeInTestMustProvideCompletion() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStrings); - } - - public void testPageUrlInTestMustBeEmptyForSection() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testPageUrlInTestMustBeEmptyForActionGroup() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfSelectorCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfSelectorCompletionRegistrarTest.java deleted file mode 100644 index 99aa6f722..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfSelectorCompletionRegistrarTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.completion.xml; - -public class MftfSelectorCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - private static final String[] lookupStringsEntities = new String[] { - "TestAdminAddProductsToOptionPanelSection", - "TestAdminProductsPanelSection", - "TestAdminProductsSection", - "TestAdminAddProductsToOptionPanelSection.testaddSelectedProducts", - "TestAdminAddProductsToOptionPanelSection.testapplyFilters", - "TestAdminAddProductsToOptionPanelSection.testfilters", - "TestAdminAddProductsToOptionPanelSection.testfirstCheckbox", - "TestAdminAddProductsToOptionPanelSection.testnameFilter", - "TestAdminAddProductsToOptionPanelSection.testnthCheckbox", - "TestAdminProductsPanelSection.testaddSelectedProducts", - "TestAdminProductsSection.testaddSelectedProducts", - "TestAdminProductsSection.testapplyFilters", - "TestAdminProductsSection.testfilters" - }; - - public void testSelectorInActionGroupMustProvideCompletion() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testSelectorInTestMustProvideCompletion() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testSelectorInActionGroupMustBeEmpty() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testSelectorInTestMustBeEmpty() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ModuleNameCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ModuleNameCompletionRegistrarTest.java deleted file mode 100644 index f9cc87dcc..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ModuleNameCompletionRegistrarTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -public class ModuleNameCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - private static final String[] LOOKUP_MODULE_NAMES = { - "Magento_Catalog", - "Magento_Config" - }; - - /** - * Tests for module name completion in module.xml - */ - public void testModuleNameMustHaveCompletion() { - final String filePath = this.getFixturePath("module.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, LOOKUP_MODULE_NAMES); - } - - /** - * Tests for module name completion under the sequence node in module.xml - */ - public void testSequenceModuleNameMustHaveCompletion() { - final String filePath = this.getFixturePath("module.xml"); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, LOOKUP_MODULE_NAMES); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ObserverCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ObserverCompletionRegistrarTest.java deleted file mode 100644 index 3e45a006b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ObserverCompletionRegistrarTest.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleEventsXml; - -public class ObserverCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - private static final String[] lookupStringsEntities = new String[] { - "Magento\\Catalog\\Observer\\TestObserver" - }; - private static final String[] lookupStringsEvents = new String[] { - "test_event_in_block" - }; - - public void testEventsXmlMustHaveCompletion() { - String filePath = this.getFixturePath(ModuleEventsXml.FILE_NAME); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEntities); - } - - public void testNotEventsXmlMustBeEmpty() { - String filePath = this.getFixturePath("notevents.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionNotShowing(filePath); - } - - public void testEventsXmlEventNameMustHaveCompletion() { - String filePath = this.getFixturePath(ModuleEventsXml.FILE_NAME); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, lookupStringsEvents); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpClassMemberCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpClassMemberCompletionRegistrarTest.java deleted file mode 100644 index ede692a5b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpClassMemberCompletionRegistrarTest.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class PhpClassMemberCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - /** - * Tests for completion of init_parameter argument value in di.xml. - */ - public void testDiXmlMustHaveCompletion() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - myFixture.configureByFile(filePath); - - assertCompletionContains(filePath, "Magento\\Backend\\Model\\Source\\YesNo::TEST_STRING"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpServiceMethodCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpServiceMethodCompletionRegistrarTest.java deleted file mode 100644 index 7cbab9509..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpServiceMethodCompletionRegistrarTest.java +++ /dev/null @@ -1,19 +0,0 @@ -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -public class PhpServiceMethodCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - /** - * Tests for the completion in `method` attribute of the `service` tag in webapi.xml. - */ - public void testWebApiXmlMustHaveCompletion() { - final String filePath = this.getFixturePath("webapi.xml"); - myFixture.configureByFile(filePath); - - assertCompletionContains(filePath, "save"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/PluginTypeCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/PluginTypeCompletionRegistrarTest.java deleted file mode 100644 index 2932d0e68..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/PluginTypeCompletionRegistrarTest.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class PluginTypeCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - /** - * The `type` attribute of the `plugin` tag in di.xml must - * have completion based on PHP classes index - */ - public void testPluginTypeMustHaveCompletion() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - myFixture.configureByFile(filePath); - - assertCompletionContains(filePath, "Magento\\Backend\\Model\\Source\\YesNo"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/RequireJsCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/RequireJsCompletionRegistrarTest.java deleted file mode 100644 index 91bfc89fd..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/RequireJsCompletionRegistrarTest.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.completion.xml; - -public class RequireJsCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - public void testMappedComponentAttributeMustHaveCompletion() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionContains(filePath, new String[] { - "testFile", - "testFile2" - }); - } - - public void testMappedComponentItemAttributeMustHaveCompletion() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionContains(filePath, new String[] { - "testFile", - "testFile2" - }); - } - - public void testFileComponentAttributeMustHaveCompletion() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionContains(filePath, new String[] { - "Foo_Bar/js/file" - }); - } - - public void testFileComponentItemAttributeMustHaveCompletion() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.copyFileToProject(filePath); - - assertCompletionContains(filePath, new String[] { - "Foo_Bar/js/file" - }); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/SourceModelXmlCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/SourceModelXmlCompletionRegistrarTest.java deleted file mode 100644 index 939380523..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/SourceModelXmlCompletionRegistrarTest.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleSystemXmlFile; -import com.magento.idea.magento2plugin.magento.files.ModuleWidgetXml; - -public class SourceModelXmlCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - private static final String[] LOOKUP_STRINGS_CHECK = { - "Magento\\Backend\\Model\\Source\\YesNo" - }; - - /** - * Test source model xml element completion. - */ - public void testSourceModelXmlElementMustProvideCompletion() { - final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); - myFixture.copyFileToProject(filePath); - - assertCompletionContains(filePath, LOOKUP_STRINGS_CHECK); - } - - /** - * Test source model xml element completion match with the file false positive. - */ - public void testSourceModelXmlElementMatchWithFilePositiveCase() { - final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, LOOKUP_STRINGS_CHECK); - } - - /** - * Test source model xml element completion match with the file negative case. - */ - public void testSourceModelXmlElementMatchWithFileNegativeCase() { - final String filePath = this.getFixturePath("not-system.xml"); - myFixture.copyFileToProject(filePath); - - assertFileNotContainsCompletions( - filePath, - LOOKUP_STRINGS_CHECK - ); - } - - /** - * Test source model attribute must provide completion. - */ - public void testSourceModelXmlAttributeMustProvideCompletion() { - final String filePath = this.getFixturePath(ModuleWidgetXml.FILE_NAME); - myFixture.copyFileToProject(filePath); - - assertCompletionContains(filePath, LOOKUP_STRINGS_CHECK); - } - - /** - * Test source model attribute match with the file positive case. - */ - public void testSourceModelXmlAttributeMatchWithFilePositiveCase() { - final String filePath = this.getFixturePath(ModuleWidgetXml.FILE_NAME); - myFixture.copyFileToProject(filePath); - - assertFileContainsCompletions(filePath, LOOKUP_STRINGS_CHECK); - } - - /** - * Test source model attribute match with the file negative case. - */ - public void testSourceModelXmlAttributeMatchWithFileNegativeCase() { - final String filePath = this.getFixturePath("not-widget.xml"); - myFixture.copyFileToProject(filePath); - - assertFileNotContainsCompletions( - filePath, - LOOKUP_STRINGS_CHECK - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/SystemConfigurationPathsCompletionTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/SystemConfigurationPathsCompletionTest.java deleted file mode 100644 index 935a4179b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/SystemConfigurationPathsCompletionTest.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleConfigXmlFile; -import com.magento.idea.magento2plugin.magento.files.ModuleSystemXmlFile; - -public class SystemConfigurationPathsCompletionTest extends CompletionXmlFixtureTestCase { - - /** - * Test system xml section element completion. - */ - public void testSystemXmlSectionMustProvideCompletion() { - final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); - myFixture.copyFileToProject(filePath); - assertCompletionContains(filePath, "catalog"); - } - - /** - * Test system xml group element completion. - */ - public void testSystemXmlGroupMustProvideCompletion() { - final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); - myFixture.copyFileToProject(filePath); - assertCompletionContains(filePath, "frontend"); - } - - /** - * Test system xml field element completion. - */ - public void testSystemXmlFieldMustProvideCompletion() { - final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); - myFixture.copyFileToProject(filePath); - assertCompletionContains(filePath, "list_allow_all"); - } - - /** - * Test config xml section element completion. - */ - public void testConfigXmlSectionMustProvideCompletion() { - final String filePath = this.getFixturePath(ModuleConfigXmlFile.FILE_NAME); - myFixture.copyFileToProject(filePath); - assertCompletionContains(filePath, "catalog"); - } - - /** - * Test config xml group element completion. - */ - public void testConfigXmlGroupMustProvideCompletion() { - final String filePath = this.getFixturePath(ModuleConfigXmlFile.FILE_NAME); - myFixture.copyFileToProject(filePath); - assertCompletionContains(filePath, "frontend"); - } - - /** - * Test config xml field element completion. - */ - public void testConfigXmlFieldMustProvideCompletion() { - final String filePath = this.getFixturePath(ModuleConfigXmlFile.FILE_NAME); - myFixture.copyFileToProject(filePath); - assertCompletionContains(filePath, "list_allow_all"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/TableAndColumnNameCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/TableAndColumnNameCompletionRegistrarTest.java deleted file mode 100644 index 0156b97ee..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/TableAndColumnNameCompletionRegistrarTest.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.completion.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDbSchemaXml; - -/** - * Test table and column names completion in the db_schema.xml file. - */ -public class TableAndColumnNameCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - private static final String CATALOG_PRODUCT_ENTITY_TABLE_NAME = "catalog_product_entity"; - - /** - * The `name` attribute of the `table` tag in `db_schema.xml` file must - * have completion based on table and column names index. - */ - public void testTableNameMustHaveCompletion() { - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - assertCompletionContains(filePath, "catalog_category_entity"); - } - - /** - * The `table` attribute of the `constraint` tag in `db_schema.xml` file must - * have completion based on table and column names index. - */ - public void testConstraintTagTableMustHaveCompletion() { - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - assertCompletionContains(filePath, CATALOG_PRODUCT_ENTITY_TABLE_NAME); - } - - /** - * The `referenceTable` attribute of the `constraint` tag in `db_schema.xml` file must - * have completion based on table and column names index. - */ - public void testConstraintTagReferenceTableMustHaveCompletion() { - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - assertCompletionContains(filePath, CATALOG_PRODUCT_ENTITY_TABLE_NAME); - } - - /** - * The `column` attribute of the `constraint` tag in `db_schema.xml` file must - * have completion based on table and column names index. - */ - public void testConstraintColumnNameMustHaveCompletion() { - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - assertCompletionContains(filePath, "children_count"); - } - - /** - * The `referenceColumn` attribute of the `constraint` tag in `db_schema.xml` file must - * have completion based on table and column names index. - */ - public void testConstraintReferenceColumnNameMustHaveCompletion() { - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - assertCompletionContains(filePath, "attribute_set_id"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/UiComponentTemplateCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/UiComponentTemplateCompletionRegistrarTest.java deleted file mode 100644 index 08c2048e1..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/completion/xml/UiComponentTemplateCompletionRegistrarTest.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.completion.xml; - -public class UiComponentTemplateCompletionRegistrarTest extends CompletionXmlFixtureTestCase { - - public void testFileTemplateAttributeMustHaveCompletion() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.configureByFile(filePath); - - assertCompletionContains(filePath, new String[] { - "Foo_Bar/template", - "Foo_Bar/template2" - }); - } - - public void testFileTemplateItemAttributeMustHaveCompletion() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.configureByFile(filePath); - - assertCompletionContains(filePath, new String[] { - "Foo_Bar/template", - "Foo_Bar/template2" - }); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/BaseInspectionsTestCase.java b/src/test/java/com/magento/idea/magento2plugin/inspections/BaseInspectionsTestCase.java deleted file mode 100644 index 65f932ed7..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/BaseInspectionsTestCase.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.inspections; - -import com.intellij.codeInsight.daemon.impl.HighlightInfo; -import com.magento.idea.magento2plugin.BaseProjectTestCase; -import com.magento.idea.magento2plugin.bundles.InspectionBundle; -import java.util.List; - -/** - * Configure test environment with Magento 2 project - */ -abstract public class BaseInspectionsTestCase extends BaseProjectTestCase { - protected final InspectionBundle inspectionBundle = new InspectionBundle(); - - protected void assertHasHighlighting(String message) { - String highlightingNotFound = "Failed that documents contains highlighting with the description `%s`"; - - List highlightingList = myFixture.doHighlighting(); - if (highlightingList.isEmpty()) { - fail(String.format(highlightingNotFound, message)); - } - - for (HighlightInfo highlighting : - highlightingList) { - if (highlighting.getDescription() == null) continue; - if (highlighting.getDescription().equals(message)) { - return; - } - } - fail(String.format(highlightingNotFound, message)); - } - - protected void assertHasNoHighlighting(String message) { - String highlightingNotFound = "Failed that documents not contains highlighting with the description `%s`"; - - List highlightingList = myFixture.doHighlighting(); - if (highlightingList.isEmpty()) { - return; - } - - for (HighlightInfo highlighting : - highlightingList) { - if (highlighting.getDescription() == null) continue; - if (highlighting.getDescription().equals(message)) { - fail(String.format(highlightingNotFound, message)); - } - } - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/InspectionGraphqlsFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/InspectionGraphqlsFixtureTestCase.java deleted file mode 100644 index d92ca85ee..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/InspectionGraphqlsFixtureTestCase.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.graphqls; - -import com.magento.idea.magento2plugin.inspections.BaseInspectionsTestCase; -import com.magento.idea.magento2plugin.magento.packages.File; - -public abstract class InspectionGraphqlsFixtureTestCase extends BaseInspectionsTestCase { - - private static final String testDataFolderPath = "testData" //NOPMD - + File.separator - + "inspections" - + File.separator; - - private static final String fixturesFolderPath = "graphqls" //NOPMD - + File.separator; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.setTestDataPath(testDataFolderPath); - } - - @Override - protected boolean isWriteActionRequired() { - return false; - } - - protected String getFixturePath(final String fileName) { - return prepareFixturePath(fileName, fixturesFolderPath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/SchemaResolverInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/SchemaResolverInspectionTest.java deleted file mode 100644 index a73a008ed..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/SchemaResolverInspectionTest.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.graphqls; - -import com.magento.idea.magento2plugin.magento.files.SchemaGraphQLsFile; - -public class SchemaResolverInspectionTest extends InspectionGraphqlsFixtureTestCase { - - private final String errorMessage = inspectionBundle.message( - "inspection.graphql.resolver.mustImplement" - ); - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(SchemaResolverInspection.class); - } - - protected boolean isWriteActionRequired() { - return false; - } - - /** - * Inspection with valid schema resolver. - */ - public void testWithValidSchemaResolverInterface() throws Exception { - myFixture.configureByFile(getFixturePath(SchemaGraphQLsFile.FILE_NAME)); - assertHasNoHighlighting(errorMessage); - } - - /** - * Inspection with invalid schema resolver. - */ - public void testWithInvalidSchemaResolverInterface() throws Exception { - myFixture.configureByFile(getFixturePath(SchemaGraphQLsFile.FILE_NAME)); - assertHasHighlighting(errorMessage); - } - - /** - * Inspection with valid batch resolver. - */ - public void testWithValidBatchResolverInterface() throws Exception { - myFixture.configureByFile(getFixturePath(SchemaGraphQLsFile.FILE_NAME)); - - assertHasNoHighlighting(errorMessage); - } - - /** - * Inspection with valid batch service contract resolver. - */ - public void testWithValidBatchServiceContractResolverInterface() throws Exception { - myFixture.configureByFile(getFixturePath(SchemaGraphQLsFile.FILE_NAME)); - - assertHasNoHighlighting(errorMessage); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/php/GraphQlResolverInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/php/GraphQlResolverInspectionTest.java deleted file mode 100644 index be9a6fe65..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/php/GraphQlResolverInspectionTest.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.inspections.php; - -public class GraphQlResolverInspectionTest extends InspectionPhpFixtureTestCase { - - private final String errorMessage = inspectionBundle.message( - "inspection.graphql.resolver.mustImplement" - ); - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(GraphQlResolverInspection.class); - } - - @Override - protected boolean isWriteActionRequired() { - return false; - } - - public void testWithInvalidResolverInterface() throws Exception { - myFixture.configureByFile(getFixturePath("ResolverTest.php")); - - assertHasHighlighting(errorMessage); - } - - public void testWithValidResolverInterface() throws Exception { - myFixture.configureByFile(getFixturePath("ResolverTest.php")); - - assertHasNoHighlighting(errorMessage); - } - - public void testWithValidBatchResolverInterface() throws Exception { - myFixture.configureByFile(getFixturePath("ResolverTest.php")); - - assertHasNoHighlighting(errorMessage); - } - - public void testWithValidBatchServiceContractResolverInterface() throws Exception { - myFixture.configureByFile(getFixturePath("ResolverTest.php")); - - assertHasNoHighlighting(errorMessage); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/php/InspectionPhpFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/inspections/php/InspectionPhpFixtureTestCase.java deleted file mode 100644 index 46c6d93cb..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/php/InspectionPhpFixtureTestCase.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.php; - -import com.magento.idea.magento2plugin.inspections.BaseInspectionsTestCase; -import com.magento.idea.magento2plugin.magento.packages.File; - -public abstract class InspectionPhpFixtureTestCase extends BaseInspectionsTestCase { - - private static final String testDataFolderPath = "testData" //NOPMD - + File.separator - + "inspections" - + File.separator; - - private static final String fixturesFolderPath //NOPMD - = "php" + File.separator; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.setTestDataPath(testDataFolderPath); - } - - @Override - protected boolean isWriteActionRequired() { - return false; - } - - protected String getFixturePath(final String fileName) { - return prepareFixturePath(fileName, fixturesFolderPath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/php/ModuleDeclarationInRegistrationPhpInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/php/ModuleDeclarationInRegistrationPhpInspectionTest.java deleted file mode 100644 index 40ef93acf..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/php/ModuleDeclarationInRegistrationPhpInspectionTest.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.php; - -import com.magento.idea.magento2plugin.magento.files.RegistrationPhp; -import com.magento.idea.magento2plugin.project.Settings; - -public class ModuleDeclarationInRegistrationPhpInspectionTest - extends InspectionPhpFixtureTestCase { - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(ModuleDeclarationInRegistrationPhpInspection.class); - } - - @Override - protected boolean isWriteActionRequired() { - return false; - } - - /** - * Inspection highlights warning in editable module. - */ - public void testWrongDeclarationInEditableModule() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.magentoPath = - "/src/php/ModuleDeclarationInRegistrationPhpInspection/" - + "wrongDeclarationInEditableModule"; - myFixture.configureByFile( - getFixturePath("app/code/Test/TestModule/" + RegistrationPhp.FILE_NAME) - ); - - final String errorMessage = inspectionBundle.message( - "inspection.moduleDeclaration.warning.wrongModuleName", - "Wrong_ModuleName", - "Test_TestModule" - ); - - assertHasHighlighting(errorMessage); - } - - /** - * Inspection skips warning in root. - */ - public void testWrongDeclarationInRoot() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.magentoPath = - "/src/php/ModuleDeclarationInRegistrationPhpInspection/wrongDeclarationInRoot"; - myFixture.configureByFile( - getFixturePath(RegistrationPhp.FILE_NAME) - ); - - final String errorMessage = inspectionBundle.message( - "inspection.moduleDeclaration.warning.wrongModuleName", - "Wrong_ModuleName", - "ModuleDeclarationInRegistrationPhpInspection_WrongDeclarationInRoot" - ); - - assertHasNoHighlighting(errorMessage); - } - - /** - * Inspection skips warning in vendor. - */ - public void testWrongDeclarationInVendor() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.magentoPath = - "/src/php/ModuleDeclarationInRegistrationPhpInspection/wrongDeclarationInVendor"; - myFixture.configureByFile( - getFixturePath("vendor/magento/module-catalog/" + RegistrationPhp.FILE_NAME) - ); - - final String errorMessage = inspectionBundle.message( - "inspection.moduleDeclaration.warning.wrongModuleName", - "Wrong_ModuleName", - "magento_module-catalog" - ); - - assertHasNoHighlighting(errorMessage); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/php/PluginInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/php/PluginInspectionTest.java deleted file mode 100644 index d4a03ebf2..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/php/PluginInspectionTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.php; - -import com.jetbrains.php.PhpBundle; -import com.magento.idea.magento2plugin.bundles.InspectionBundle; - -public class PluginInspectionTest extends InspectionPhpFixtureTestCase { - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(PluginInspection.class); - } - - @Override - protected boolean isWriteActionRequired() { - return false; - } - - /** - * Inspection highlights error in parameter type. - */ - public void testWithWrongParameterType() { - myFixture.configureByFile(getFixturePath("Plugin.php")); - - final String wrongParameterError = PhpBundle.message( - "inspection.wrong_param_type", - "\\Magento\\Catalog\\Block\\Navigation", - "\\Magento\\Theme\\Block\\Html\\Topmenu" - ); - - assertHasHighlighting(wrongParameterError); - } - - /** - * Inspection highlights error in callable parameter type. - */ - public void testWithWrongCallableType() { - myFixture.configureByFile(getFixturePath("Plugin.php")); - - final String wrongParameterError = PhpBundle.message( - "inspection.wrong_param_type", - "\\Magento\\Theme\\Block\\Html\\Topmenu", - "callable" - ); - - assertHasHighlighting(wrongParameterError); - } - - /** - * Inspection highlights error in callable parameter type. - */ - public void testWithNoninterceptableTargetClass() { - myFixture.configureByFile(getFixturePath("Plugin.php")); - - assertHasHighlighting(new InspectionBundle().message( - "inspection.plugin.error.noninterceptableInterface" - )); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/AclResourceXmlInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/AclResourceXmlInspectionTest.java deleted file mode 100644 index c48f3b958..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/AclResourceXmlInspectionTest.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleAclXml; - -public class AclResourceXmlInspectionTest extends InspectionXmlFixtureTestCase { - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(AclResourceXmlInspection.class); - } - - @Override - protected boolean isWriteActionRequired() { - return false; - } - - /** - * ACL resource should have a title. - */ - public void testAclResourceWithNoTitleShouldHaveWarning() { - myFixture.configureByFile(getFixturePath(ModuleAclXml.FILE_NAME)); - - final String errorMessage = inspectionBundle.message( - "inspection.error.missingAttribute", - "title" - ); - - assertHasHighlighting(errorMessage); - } - - /** - * Override/Reference for ACL resource may not have a title. - */ - public void testOverrideAclResourceWithNoTitleShouldNotHaveWarning() { - myFixture.configureByFile(getFixturePath(ModuleAclXml.FILE_NAME)); - - final String errorMessage = inspectionBundle.message( - "inspection.error.missingAttribute", - "title" - ); - - assertHasNoHighlighting(errorMessage); - } - - /** - * ID attribute of ACL resource should have a value. - */ - public void testAclResourceWithEmptyIdShouldHaveWarning() { - myFixture.configureByFile(getFixturePath(ModuleAclXml.FILE_NAME)); - - final String errorMessage = inspectionBundle.message( - "inspection.error.idAttributeCanNotBeEmpty", - "id" - ); - - assertHasHighlighting(errorMessage); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/CacheableFalseInDefaultLayoutInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/CacheableFalseInDefaultLayoutInspectionTest.java deleted file mode 100644 index cf2a6079b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/CacheableFalseInDefaultLayoutInspectionTest.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.inspections.xml; - -import com.magento.idea.magento2plugin.magento.files.LayoutXml; - -//tested referenceBlock only as block tag is Special markup for the tests -//@see https://www.jetbrains.org/intellij/sdk/docs/basics/testing_plugins/test_project_and_testdata_directories.html -public class CacheableFalseInDefaultLayoutInspectionTest extends InspectionXmlFixtureTestCase { - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(CacheableFalseInDefaultLayoutInspection.class); - } - - public void testWithCacheableFalseBlock() throws Exception { - myFixture.configureByFile(getFixturePath(LayoutXml.DEFAULT_FILENAME)); - myFixture.testHighlighting(true, false, false); - } - - public void testWithoutCacheableFalseBlock() throws Exception { - myFixture.configureByFile(getFixturePath(LayoutXml.DEFAULT_FILENAME)); - myFixture.testHighlighting(true, true, true); - } - - public void testWithCacheableFalseBlockNotDefaultLayout() throws Exception { - myFixture.configureByFile(getFixturePath("some_layout_index.xml")); - myFixture.testHighlighting(true, true, true); - } -} \ No newline at end of file diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/InspectionXmlFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/InspectionXmlFixtureTestCase.java deleted file mode 100644 index 7ead170af..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/InspectionXmlFixtureTestCase.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.xml; - -import com.magento.idea.magento2plugin.inspections.BaseInspectionsTestCase; -import com.magento.idea.magento2plugin.magento.packages.File; - -public abstract class InspectionXmlFixtureTestCase extends BaseInspectionsTestCase { - - private static final String testDataFolderPath = "testData" //NOPMD - + File.separator - + "inspections" - + File.separator; - - private static final String fixturesFolderPath = "xml" + File.separator; //NOPMD - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.setTestDataPath(testDataFolderPath); - } - - @Override - protected boolean isWriteActionRequired() { - return false; - } - - protected String getFixturePath(final String fileName) { - return prepareFixturePath(fileName, fixturesFolderPath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleDeclarationInModuleXmlInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleDeclarationInModuleXmlInspectionTest.java deleted file mode 100644 index 089d8fcbb..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleDeclarationInModuleXmlInspectionTest.java +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleXml; -import com.magento.idea.magento2plugin.project.Settings; - -public class ModuleDeclarationInModuleXmlInspectionTest - extends InspectionXmlFixtureTestCase { - private static final String MESSAGE_ID = - "inspection.moduleDeclaration.warning.wrongModuleName"; - private static final String WRONG_MODULE_NAME = "Wrong_ModuleName"; - private static final String SETUP_VERSION_ATTRIBUTE_VALUE = "1.0.0"; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(ModuleDeclarationInModuleXmlInspection.class); - } - - @Override - protected boolean isWriteActionRequired() { - return false; - } - - /** - * Inspection highlights warning in editable module. - */ - public void testWrongDeclarationInEditableModule() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.magentoPath = - "/src/xml/ModuleDeclarationInModuleXmlInspection/" - + "wrongDeclarationInEditableModule"; - myFixture.configureByFile( - getFixturePath("app/code/Test/TestModule/etc/" + ModuleXml.FILE_NAME) - ); - - final String errorMessage = inspectionBundle.message( - MESSAGE_ID, - WRONG_MODULE_NAME, - "Test_TestModule" - ); - - assertHasHighlighting(errorMessage); - } - - /** - * Inspection do not highlight wrong module name warning for setup version attribute. - */ - public void testSetupVersionNotErrorMessageInEditableModule() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.magentoPath = - "/src/xml/ModuleDeclarationInModuleXmlInspection/" - + "setupVersionNotErrorMessageInEditableModule"; - myFixture.configureByFile( - getFixturePath("app/code/Test/TestModule/etc/" + ModuleXml.FILE_NAME) - ); - - final String errorMessage = inspectionBundle.message( - MESSAGE_ID, - SETUP_VERSION_ATTRIBUTE_VALUE, - "Test_TestModule" - ); - - assertHasNoHighlighting(errorMessage); - } - - /** - * Inspection skips sub tags. - */ - public void testSubTagShouldNotBeHighlightedInEditableModule() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.magentoPath = - "/src/xml/ModuleDeclarationInModuleXmlInspection/" - + "wrongDeclarationInEditableModule"; - myFixture.configureByFile( - getFixturePath("app/code/Test/TestModule/etc/" + ModuleXml.FILE_NAME) - ); - - final String errorMessage = inspectionBundle.message( - MESSAGE_ID, - WRONG_MODULE_NAME, - "Test_TestModule" - ); - - assertHasNoHighlighting(errorMessage); - } - - /** - * Inspection skips warning in root. - */ - public void testWrongDeclarationInRoot() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.magentoPath = - "/src/xml/ModuleDeclarationInModuleXmlInspection/wrongDeclarationInRoot"; - myFixture.configureByFile( - getFixturePath("etc/" + ModuleXml.FILE_NAME) - ); - - final String errorMessage = inspectionBundle.message( - MESSAGE_ID, - WRONG_MODULE_NAME, - "WrongDeclarationInRoot_etc" - ); - - assertHasNoHighlighting(errorMessage); - } - - /** - * Inspection skips warning in vendor. - */ - public void testWrongDeclarationInVendor() { - final Settings settings = Settings.getInstance(myFixture.getProject()); - settings.magentoPath = - "/src/xml/ModuleDeclarationInModuleXmlInspection/wrongDeclarationInVendor"; - myFixture.configureByFile( - getFixturePath("vendor/magento/module-catalog/etc/" + ModuleXml.FILE_NAME) - ); - - final String errorMessage = inspectionBundle.message( - MESSAGE_ID, - WRONG_MODULE_NAME, - "module-catalog_etc" - ); - - assertHasNoHighlighting(errorMessage); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleScopeInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleScopeInspectionTest.java deleted file mode 100644 index cf3674ffe..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleScopeInspectionTest.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.xml; - -public class ModuleScopeInspectionTest extends InspectionXmlFixtureTestCase { - - private static final String WRONG_AREA = - "inspection.config.wrong.area"; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(ModuleScopeInspection.class); - } - - /** - * Inspection highlights warning if the area of a config file is wrong. - */ - public void testIncorrectArea() { - configureFixture("app/code/Test/TestModule/etc/adminhtmltypo/di.xml"); - - final String errorMessage = inspectionBundle.message( - WRONG_AREA - ); - - assertHasHighlighting(errorMessage); - } - - /** - * Inspection skips warning if the area is correct. - */ - public void testCorrectArea() { - configureFixture("app/code/Test/TestModule/etc/adminhtml/di.xml"); - - final String errorMessage = inspectionBundle.message( - WRONG_AREA - - ); - - assertHasNoHighlighting(errorMessage); - } - - private void configureFixture(final String fixturePath) { - myFixture.copyFileToProject(getFixturePath("app/code/Test/TestModule/registration.php")); - myFixture.configureByFile(getFixturePath(fixturePath)); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ObserverDeclarationInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ObserverDeclarationInspectionTest.java deleted file mode 100644 index 48e30fa17..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ObserverDeclarationInspectionTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleEventsXml; - -@SuppressWarnings({"PMD.JUnitTestsShouldIncludeAssert"}) -public class ObserverDeclarationInspectionTest extends InspectionXmlFixtureTestCase { - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(ObserverDeclarationInspection.class); - } - - /** - * Tests for duplicate observer name inspection warning in the same events.xml - */ - public void testObserverNameUsedInSameFile() { - myFixture.configureByFile(getFixturePath(ModuleEventsXml.FILE_NAME)); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests for duplicate observer name inspection warning in a different events.xml - */ - public void testObserverNameUsedInDifferentFile() { - myFixture.configureByFile(getFixturePath(ModuleEventsXml.FILE_NAME)); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests warning for disabling of non-existing observer. - */ - public void testDisablingNonExistingObserver() { - myFixture.configureByFile(getFixturePath(ModuleEventsXml.FILE_NAME)); - myFixture.testHighlighting(true, false, false); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginAttributeTypeInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginAttributeTypeInspectionTest.java deleted file mode 100644 index 712c69233..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginAttributeTypeInspectionTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class PluginAttributeTypeInspectionTest extends InspectionXmlFixtureTestCase { - - private static final String ARGUMENT_VALUE_IS_EMPTY = - "inspection.error.idAttributeCanNotBeEmpty"; - private static final String CLASS_DOES_NOT_EXIST = - "inspection.warning.class.does.not.exist"; - private static final String EXISTENT_CLASS = - "Magento\\Catalog\\Plugin\\PluginClass"; - private static final String NOT_EXISTENT_CLASS = - "Not\\Existent\\Class"; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(PluginAttributeTypeInspection.class); - } - - /** - * Test for an error for the "type" attribute because it is empty. - * - */ - public void testAttrArgTypeValueIsEmpty() { - configureFixture(); - - final String forAttrIsEmptyMessage = inspectionBundle.message( - ARGUMENT_VALUE_IS_EMPTY, - ModuleDiXml.TYPE_ATTR - ); - - assertHasHighlighting(forAttrIsEmptyMessage); - } - - /** - * Test for no error for the "type" attribute because this class exists. - * - */ - public void testAttrTypeClassExists() { - configureFixture(); - - final String typeAttrIsEmptyMessage = inspectionBundle.message( - ARGUMENT_VALUE_IS_EMPTY, - ModuleDiXml.TYPE_ATTR - ); - - assertHasNoHighlighting(typeAttrIsEmptyMessage); - } - - /** - * Test for throwing an error for a class that does not exist for the "type" attribute. - */ - public void testClassAttrTypeDoesNotExists() { - configureFixture(); - - final String forClassDoesNotExists = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - NOT_EXISTENT_CLASS - ); - - assertHasHighlighting(forClassDoesNotExists); - } - - /** - * Test for the absence of an error in the presence of - * classes or interfaces specified for plugins. - */ - public void testClassAttrTypeIsExist() { - configureFixture(); - - final String classOneExists = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - EXISTENT_CLASS - ); - - assertHasNoHighlighting(classOneExists); - } - - private void configureFixture() { - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginDeclarationInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginDeclarationInspectionTest.java deleted file mode 100644 index 52ba9d8c8..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginDeclarationInspectionTest.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; -import com.magento.idea.magento2plugin.magento.packages.Areas; -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.magento.packages.Package; - -@SuppressWarnings({"PMD.JUnitTestsShouldIncludeAssert"}) -public class PluginDeclarationInspectionTest extends InspectionXmlFixtureTestCase { - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(PluginDeclarationInspection.class); - } - - private String getAreaPath(final String area) { - return Package.moduleBaseAreaDir - + File.separator - + Areas.getAreaByString(area) - + File.separator - + ModuleDiXml.FILE_NAME; - } - - /** - * Tests the plugin name duplication warning won't show in the di.xml file - */ - public void testPluginNameDuplicationWarningWontShow() { - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests warning for disabling of non-existing plugin. - */ - public void testDisabledNonExistingPlugin() { - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests whenever the duplication warning shows when the plugin name already - * defined in the same di.xml file - */ - public void testPluginNameUsedInSameFile() { - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests whenever the duplication warning occurs for a - * plugin name declared in the frontend area - * that is already defined in the frontend module - * area (Vendor/Module/etc/frontend/di.xml) - */ - public void testPluginNameAlreadyUsedInFrontendArea() { - myFixture.configureByFile(getFixturePath(getAreaPath("frontend"))); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests whenever the duplication warning occurs for - * a plugin name declared in the adminhtml area - * that is already defined in the adminhtml module area - * (Vendor/Module/etc/adminhtml/di.xml) - */ - public void testPluginNameAlreadyUsedInAdminhtmlArea() { - myFixture.configureByFile(getFixturePath(getAreaPath("adminhtml"))); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests whenever the duplication warning occurs for a plugin name - * that is already defined in the global module area (Vendor/Module/etc/di.xml) - */ - public void testPluginNameAlreadyUsedInGlobalArea() { - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests whenever the duplication warning occurs for - * a plugin name declared in the webapi_rest area - * that is already defined in the webapi_rest module - * area (Vendor/Module/etc/webapi_rest/di.xml) - */ - public void testPluginNameAlreadyUsedInWebApiRestArea() { - myFixture.configureByFile(getFixturePath(this.getAreaPath("webapi_rest"))); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests whenever the duplication warning occurs for - * a plugin name declared in the webapi_soap area - * that is already defined in the webapi_soap - * module area (Vendor/Module/etc/webapi_soap/di.xml) - */ - public void testPluginNameAlreadyUsedInWebApiSoapArea() { - myFixture.configureByFile(getFixturePath(getAreaPath("webapi_soap"))); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests whenever the duplication warning occurs for - * a plugin name declared in the graphql area - * that is already defined in the graphql module - * area (Vendor/Module/etc/graphql/di.xml) - */ - public void testPluginNameAlreadyUsedInGraphqlArea() { - myFixture.configureByFile(getFixturePath(getAreaPath("graphql"))); - myFixture.testHighlighting(true, false, false); - } - - /** - * Tests whenever the duplication warning occurs for - * a plugin name declared in the crontab area - * that is already defined in the crontab module - * area (Vendor/Module/etc/crontab/di.xml) - */ - public void testPluginNameAlreadyUsedInCrontabArea() { - myFixture.configureByFile(getFixturePath(getAreaPath("crontab"))); - myFixture.testHighlighting(true, false, false); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PreferenceDeclarationInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PreferenceDeclarationInspectionTest.java deleted file mode 100644 index f3696b394..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PreferenceDeclarationInspectionTest.java +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class PreferenceDeclarationInspectionTest extends InspectionXmlFixtureTestCase { - - private static final String ARGUMENT_VALUE_IS_EMPTY = - "inspection.error.idAttributeCanNotBeEmpty"; - private static final String CLASS_DOES_NOT_EXIST = - "inspection.warning.class.does.not.exist"; - private static final String EXISTENT_CLASS_ONE = - "Magento\\Catalog\\Api\\ProductRepositoryInterface"; - private static final String EXISTENT_CLASS_TWO = - "Foo\\Bar\\Model\\Logger"; - private static final String NOT_EXISTENT_CLASS = - "Not\\Existent\\Class"; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(PreferenceDeclarationInspection.class); - } - - /** - * Test for an error for the "for" attribute because it is empty. - * - */ - public void testAttrArgForValueIsEmpty() { - configureFixture(); - - final String forAttrIsEmptyMessage = inspectionBundle.message( - ARGUMENT_VALUE_IS_EMPTY, - ModuleDiXml.PREFERENCE_ATTR_FOR - ); - - assertHasHighlighting(forAttrIsEmptyMessage); - } - - /** - * Test for an error for the "type" attribute because it is empty. - * - */ - public void testAttrArgTypeValueIsEmpty() { - configureFixture(); - - final String forAttrIsEmptyMessage = inspectionBundle.message( - ARGUMENT_VALUE_IS_EMPTY, - ModuleDiXml.TYPE_ATTR - ); - - assertHasHighlighting(forAttrIsEmptyMessage); - } - - /** - * Test for an no error for the "for" attribute because this class exists. - * - */ - public void testAttrForClassExists() { - configureFixture(); - - final String typeAttrIsEmptyMessage = inspectionBundle.message( - ARGUMENT_VALUE_IS_EMPTY, - ModuleDiXml.PREFERENCE_ATTR_FOR - ); - - assertHasNoHighlighting(typeAttrIsEmptyMessage); - } - - /** - * Test for an no error for the "type" attribute because this class exists. - * - */ - public void testAttrTypeClassExists() { - configureFixture(); - - final String typeAttrIsEmptyMessage = inspectionBundle.message( - ARGUMENT_VALUE_IS_EMPTY, - ModuleDiXml.TYPE_ATTR - ); - - assertHasNoHighlighting(typeAttrIsEmptyMessage); - } - - /** - * Test for throwing an error for a class that does not exist for the "for" attribute. - */ - public void testClassAttrForDoesNotExists() { - configureFixture(); - - final String forClassDoesNotExists = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - NOT_EXISTENT_CLASS - ); - - assertHasHighlighting(forClassDoesNotExists); - } - - /** - * Test for the absence of an error in the presence of - * classes or interfaces specified for preferences. - */ - public void testClassAttrForIsExist() { - configureFixture(); - - final String classOneExists = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - EXISTENT_CLASS_ONE - ); - - assertHasNoHighlighting(classOneExists); - } - - /** - * Test for throwing an error for a class that does not exist for the "type" attribute. - */ - public void testClassAttrTypeDoesNotExists() { - configureFixture(); - - final String forClassDoesNotExists = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - NOT_EXISTENT_CLASS - ); - - assertHasHighlighting(forClassDoesNotExists); - } - - /** - * Test for the absence of an error in the presence of - * classes or interfaces specified for preferences. - */ - public void testClassAttrTypeIsExist() { - configureFixture(); - - final String classOneExists = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - EXISTENT_CLASS_TWO - ); - - assertHasNoHighlighting(classOneExists); - } - - private void configureFixture() { - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/TypeConfigurationTagTypesInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/TypeConfigurationTagTypesInspectionTest.java deleted file mode 100644 index c88f4417b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/TypeConfigurationTagTypesInspectionTest.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class TypeConfigurationTagTypesInspectionTest extends InspectionXmlFixtureTestCase { - - private static final String CLASS_DOES_NOT_EXIST = "inspection.warning.class.does.not.exist"; - private static final String NOT_EXISTENT_CLASS = "Not\\Existent\\Class"; - private static final String NOT_EXISTENT_VIRTUAL_TYPE = "NotExistentVirtualType"; - // This virtual type is created in the scope of this inspection and - // it is in the ./testData/project/magento2/app/code/Foo/Bar/etc/di.xml file. - private static final String EXISTENT_VIRTUAL_TYPE = "VirtualProductRepository"; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(InvalidDependencyInjectionTypeInspection.class); - } - - /** - * Test type doesn't exists highlighting: . - */ - public void testNameAttributeValueTypeDoesNotExist() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - NOT_EXISTENT_CLASS - ); - - assertHasHighlighting(errorMessage); - } - - /** - * Test type exists: . - */ - public void testNameAttributeValueTypeExists() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - "Magento\\Catalog\\Api\\ProductRepositoryInterface" - ); - - assertHasNoHighlighting(errorMessage); - } - - /** - * Test argument factory type exists: TestingTypeFactory. - */ - public void testArgumentFactoryTypeExists() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - "Magento\\Catalog\\Api\\ProductRepositoryInterfaceFactory" - ); - - assertHasNoHighlighting(errorMessage); - } - - /** - * Test proxy type doesn't exist highlighting: - * TestType\Proxy. - */ - public void testRecursivelyArgumentProxyTypeDoesNotExist() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - NOT_EXISTENT_CLASS.concat("\\Proxy") - ); - - assertHasHighlighting(errorMessage); - } - - /** - * Test proxy type exists. - * TestType\Proxy - */ - public void testRecursivelyArgumentProxyTypeExists() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - "Magento\\Catalog\\Api\\ProductRepositoryInterfaceFactory\\Proxy" - ); - - assertHasNoHighlighting(errorMessage); - } - - /** - * Test proxy type doesn't exist highlighting: - * TestType\Proxy. - */ - public void testRecursivelyArgumentVirtualTypeDoesNotExist() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - NOT_EXISTENT_VIRTUAL_TYPE - ); - - assertHasHighlighting(errorMessage); - } - - /** - * Test virtual type exists. - * TestVirtualType - */ - public void testRecursivelyArgumentVirtualTypeExists() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - EXISTENT_VIRTUAL_TYPE - ); - - assertHasNoHighlighting(errorMessage); - } - - private void configureFixture() { - myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/WebApiServiceInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/WebApiServiceInspectionTest.java deleted file mode 100644 index 81f496bb3..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/WebApiServiceInspectionTest.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.inspections.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleWebApiXmlFile; - -public class WebApiServiceInspectionTest extends InspectionXmlFixtureTestCase { - - private static final String CLASS_DOES_NOT_EXIST = - "inspection.warning.class.does.not.exist"; - - private static final String METHOD_DOES_NOT_EXIST = - "inspection.warning.method.does.not.exist"; - - private static final String METHOD_SHOULD_HAVE_PUBLIC_ACCESS = - "inspection.warning.method.should.have.public.access"; - - private static final String NOT_EXISTENT_CLASS = - "Not\\Existent\\Class"; - - private static final String NOT_EXISTENT_METHOD = - "notExistent"; - - private static final String NOT_PUBLIC_METHOD = - "myProtected"; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.enableInspections(WebApiServiceInspection.class); - } - - /** - * Inspection highlights warning if the class attribute in the service tag contains - * name of the not existent class. - */ - public void testNotExistentClass() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - NOT_EXISTENT_CLASS - ); - - assertHasHighlighting(errorMessage); - } - - /** - * Inspection skips warning if the service class exists. - */ - public void testExistentClass() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - CLASS_DOES_NOT_EXIST, - NOT_EXISTENT_CLASS - ); - - assertHasNoHighlighting(errorMessage); - } - - /** - * Inspection highlights warning if the method attribute in the service tag contains - * name of the not existent method. - */ - public void testNotExistentMethod() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - METHOD_DOES_NOT_EXIST, - NOT_EXISTENT_METHOD - ); - - assertHasHighlighting(errorMessage); - } - - /** - * Inspection skips warning if the service method exists. - */ - public void testExistentMethod() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - METHOD_DOES_NOT_EXIST, - NOT_EXISTENT_METHOD - ); - - assertHasNoHighlighting(errorMessage); - } - - /** - * Inspection highlights warning if the method attribute in the service tag contains - * name of the method with not public access. - */ - public void testNotPublicMethod() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - METHOD_SHOULD_HAVE_PUBLIC_ACCESS, - NOT_PUBLIC_METHOD - ); - - assertHasHighlighting(errorMessage); - } - - /** - * Inspection skips warning if the service method has public access. - */ - public void testPublicMethod() { - configureFixture(); - - final String errorMessage = inspectionBundle.message( - METHOD_SHOULD_HAVE_PUBLIC_ACCESS, - NOT_PUBLIC_METHOD - ); - - assertHasNoHighlighting(errorMessage); - } - - private void configureFixture() { - myFixture.configureByFile(getFixturePath(ModuleWebApiXmlFile.FILE_NAME)); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/LinemarkerFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/LinemarkerFixtureTestCase.java deleted file mode 100644 index e47e486fc..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/linemarker/LinemarkerFixtureTestCase.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.linemarker; - -import com.intellij.codeInsight.daemon.LineMarkerInfo; -import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl; -import com.magento.idea.magento2plugin.BaseProjectTestCase; -import com.magento.idea.magento2plugin.magento.packages.File; -import java.util.List; -import javax.swing.Icon; -import org.jetbrains.annotations.NotNull; - -public abstract class LinemarkerFixtureTestCase extends BaseProjectTestCase { - - private static final String TEST_DATA_PATH - = "testData" + File.separator + "linemarker" + File.separator; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.setTestDataPath(TEST_DATA_PATH); - } - - protected String getFixturePath(final String fileName, final String folder) { - return prepareFixturePath(fileName, folder + File.separator); - } - - protected void assertHasLinemarkerWithTooltipAndIcon(final String tooltip, final String icon) { - myFixture.doHighlighting(); - - final List> lineMarkers = getDocumentLineMarkers(); - assertNotEmpty(lineMarkers); - for (final LineMarkerInfo lineMarkerInfo: lineMarkers) { - final String lineMarkerTooltip = lineMarkerInfo.getLineMarkerTooltip(); - final Icon lineMarkerIcon = lineMarkerInfo.getIcon(); - if (lineMarkerTooltip == null || lineMarkerIcon == null) { - continue; - } - if (lineMarkerTooltip.equals(tooltip) - && lineMarkerIcon.toString().contains(icon)) { - return; - } - } - - final String lineMarkerNotFound - = "Failed that documents contains linemarker with the tooltip `%s`"; - fail(String.format(lineMarkerNotFound, tooltip)); - } - - protected void assertHasNoLinemarkerWithTooltipAndIcon( - final String tooltip, - final String icon - ) { - myFixture.doHighlighting(); - final String lineMarkerExist - = "Failed that documents not contains linemarker with the tooltip `%s`"; - - final List> lineMarkers = getDocumentLineMarkers(); - for (final LineMarkerInfo lineMarkerInfo: lineMarkers) { - final String lineMarkerTooltip = lineMarkerInfo.getLineMarkerTooltip(); - final Icon lineMarkerIcon = lineMarkerInfo.getIcon(); - if (lineMarkerTooltip == null || lineMarkerIcon == null) { - continue; - } - if (lineMarkerTooltip.equals(tooltip) - && lineMarkerIcon.toString().equals(icon)) { - fail(String.format(lineMarkerExist, tooltip)); - } - } - } - - @NotNull - private List> getDocumentLineMarkers() { - return DaemonCodeAnalyzerImpl.getLineMarkers( - myFixture.getEditor().getDocument(), - getProject() - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/graphqls/GraphQlResolverClassLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/graphqls/GraphQlResolverClassLinemarkerRegistrarTest.java deleted file mode 100644 index ba0bb9048..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/linemarker/graphqls/GraphQlResolverClassLinemarkerRegistrarTest.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.linemarker.graphqls; - -import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; - -public class GraphQlResolverClassLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { - - /** - * Tests linemarkers in the schema.graphqls file for PHP resolver classes. - */ - public void testWithValidSchemaResolver() { - myFixture.configureByFile(this.getFixturePath("schema.graphqls", "graphqls")); - - assertHasLinemarkerWithTooltipAndIcon("Navigate to class", "Class"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ConfigurationTypeClassLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ConfigurationTypeClassLinemarkerRegistrarTest.java deleted file mode 100644 index a9673272a..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ConfigurationTypeClassLinemarkerRegistrarTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.linemarker.php; - -import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; - -public class ConfigurationTypeClassLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { - - /** - * Tests linemarkers in the configured class. - */ - public void testTypeNameClassShouldHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("Topmenu.php", "php")); - - assertHasLinemarkerWithTooltipAndIcon("Navigate to configuration", "fileTypes/xml.svg"); - } - - /** - * Tests linemarkers in the non-configured class. - */ - public void testRegularPhpClassShouldNotHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("ClassNotConfiguredInDiXml.php", "php")); - - assertHasNoLinemarkerWithTooltipAndIcon("Navigate to configuration", "fileTypes/xml.svg"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/GraphQlResolverUsageLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/GraphQlResolverUsageLinemarkerRegistrarTest.java deleted file mode 100644 index 5b1ddb7c6..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/GraphQlResolverUsageLinemarkerRegistrarTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.linemarker.php; - -import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; - -public class GraphQlResolverUsageLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { - - /** - * Tests linemarkers in the resolver class. - */ - public void testResolverClassShouldHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("Resolver.php", "php")); - - assertHasNoLinemarkerWithTooltipAndIcon("Navigate to schema", "icons/graphqlFile.svg"); - } - - /** - * Tests linemarkers in the regular class. - */ - public void testRegularClassShouldNotHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("ClassNotConfiguredInSchema.php", "php")); - - assertHasNoLinemarkerWithTooltipAndIcon("Navigate to schema", "icons/graphqlFile.svg"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ObserverClassLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ObserverClassLinemarkerRegistrarTest.java deleted file mode 100644 index a165c2348..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ObserverClassLinemarkerRegistrarTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.linemarker.php; - -import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; - -public class ObserverClassLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { - - /** - * Tests linemarkers in the Observer class. - */ - public void testObserverClassShouldHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("TestObserver.php", "php")); - - assertHasLinemarkerWithTooltipAndIcon("Navigate to configuration", "fileTypes/xml.svg"); - } - - /** - * Tests linemarkers in the regular class. - */ - public void testRegularPhpClassShouldNotHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("TestNotObserver.php", "php")); - - assertHasNoLinemarkerWithTooltipAndIcon("Navigate to configuration", "fileTypes/xml.svg"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginLinemarkerRegistrarTest.java deleted file mode 100644 index 817a4f005..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginLinemarkerRegistrarTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.linemarker.php; - -import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; - -public class PluginLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { - - /** - * Tests linemarker in a class which has plugins. - */ - public void testClassWithPluginShouldHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("PluginClass.php", "php")); - - assertHasLinemarkerWithTooltipAndIcon("Navigate to plugins", "nodes/plugin.svg"); - } - - /** - * Tests linemarker in a class which does not have plugins. - */ - public void testClassWithoutPluginShouldNotHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("RegularClass.php", "php")); - - assertHasNoLinemarkerWithTooltipAndIcon("Navigate to plugins", "nodes/plugin.svg"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLinemarkerRegistrarTest.java deleted file mode 100644 index 6e9f77647..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLinemarkerRegistrarTest.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.linemarker.php; - -import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; - -@SuppressWarnings("PMD.JUnitTestContainsTooManyAsserts") -public class PluginTargetLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { - - /** - * Tests linemarkers in a class which plugs in to a class and its method. - */ - public void testPluginToClassShouldHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("Topmenu.php", "php")); - - assertHasLinemarkerWithTooltipAndIcon("Navigate to target method", "nodes/method.svg"); - assertHasLinemarkerWithTooltipAndIcon("Navigate to target class", "nodes/class.svg"); - } - - /** - * Tests linemarkers in a class which plugs in to an interface and its method. - */ - public void testPluginToInterfaceShouldHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("MviewState.php", "php")); - - assertHasLinemarkerWithTooltipAndIcon("Navigate to target method", "nodes/method.svg"); - assertHasLinemarkerWithTooltipAndIcon("Navigate to target class", "nodes/class.svg"); - } - - /** - * Tests linemarkers in a regular class which does not plug in to any class or interface. - */ - public void testRegularClassShouldNotHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("ClassNotConfiguredInDiXml.php", "php")); - - assertHasNoLinemarkerWithTooltipAndIcon("Navigate to target method", "/nodes/method.svg"); - assertHasNoLinemarkerWithTooltipAndIcon("Navigate to target class", "nodes/class.svg"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLinemarkerRegistrarTest.java deleted file mode 100644 index 76c712061..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLinemarkerRegistrarTest.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.linemarker.php; - -import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; - -public class TestFixtureLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { - - /** - * Tests linemarkers for @magentoDataFixture tag. - */ - public void testMagentoDataFixtureHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("Test.php", "php")); - - assertHasLinemarkerWithTooltipAndIcon("Navigate to fixtures", "icons/php-icon.svg"); - } - - /** - * Tests linemarkers for @magentoApiDataFixture tag. - */ - public void testMagentoApiDataFixtureHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("Test.php", "php")); - - assertHasLinemarkerWithTooltipAndIcon("Navigate to fixtures", "icons/php-icon.svg"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/WebApiLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/WebApiLinemarkerRegistrarTest.java deleted file mode 100644 index 59ff4d8e8..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/WebApiLinemarkerRegistrarTest.java +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.linemarker.php; - -import com.intellij.openapi.application.ex.ApplicationManagerEx; -import com.magento.idea.magento2plugin.MagentoIcons; -import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; - -@SuppressWarnings("PMD.JUnitTestContainsTooManyAsserts") -public class WebApiLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { - - private static final String EXPECTED_CLASS_LINE_MARKER_TOOLTIP - = "Navigate to Web API configuration:
  PUT     /V1/blog/post\n"
-            + "  POST    /V1/blog/update\n"
-            + "
"; - - private static final String EXPECTED_METHOD_CREATE_LINE_MARKER_TOOLTIP - = "Navigate to Web API configuration:
  POST    /V1/blog/update\n"
-            + "
"; - - private static final String EXPECTED_METHOD_UPDATE_LINE_MARKER_TOOLTIP - = "Navigate to Web API configuration:
  PUT     /V1/blog/post\n"
-            + "
"; - - /** - * Class configured as WEB API service in web_api.xml should have WEB API line markers. - */ - public void testWebApiServiceShouldHaveLinemarker() { - // work around for issue caused by - // com.magento.idea.magento2plugin.linemarker.xml.LineMarkerXmlTagDecorator - // in com.intellij.psi.impl.smartPointers.SmartPsiElementPointerImpl.createElementInfo - final boolean isInStressTestCurrent = ApplicationManagerEx.isInStressTest(); - ApplicationManagerEx.setInStressTest(true); - - myFixture.configureByFile(this.getFixturePath("TestService.php", "php")); - - //assert class line marker - assertHasLinemarkerWithTooltipAndIcon( - EXPECTED_CLASS_LINE_MARKER_TOOLTIP, - MagentoIcons.WEB_API.toString() - ); - - //assert methods line markers - assertHasLinemarkerWithTooltipAndIcon( - EXPECTED_METHOD_CREATE_LINE_MARKER_TOOLTIP, - MagentoIcons.WEB_API.toString() - ); - assertHasLinemarkerWithTooltipAndIcon( - EXPECTED_METHOD_UPDATE_LINE_MARKER_TOOLTIP, - MagentoIcons.WEB_API.toString() - ); - - //restore default value - ApplicationManagerEx.setInStressTest(isInStressTestCurrent); - } - - /** - * Regular class should not have WEB API line markers. - */ - public void testRegularPhpClassShouldNotHaveLinemarker() { - myFixture.configureByFile(this.getFixturePath("ClassNotConfiguredInWebApiXml.php", "php")); - - //assert class line marker - assertHasNoLinemarkerWithTooltipAndIcon( - EXPECTED_CLASS_LINE_MARKER_TOOLTIP, - MagentoIcons.WEB_API.toString() - ); - - //assert methods line markers - assertHasNoLinemarkerWithTooltipAndIcon( - EXPECTED_METHOD_CREATE_LINE_MARKER_TOOLTIP, - MagentoIcons.WEB_API.toString() - ); - assertHasNoLinemarkerWithTooltipAndIcon( - EXPECTED_METHOD_UPDATE_LINE_MARKER_TOOLTIP, - MagentoIcons.WEB_API.toString() - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/pages/WelcomeFrameFixture.java b/src/test/java/com/magento/idea/magento2plugin/pages/WelcomeFrameFixture.java deleted file mode 100644 index 9d0d51a1c..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/pages/WelcomeFrameFixture.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.magento.idea.magento2plugin.pages; - -import com.intellij.remoterobot.RemoteRobot; -import com.intellij.remoterobot.data.RemoteComponent; -import com.intellij.remoterobot.fixtures.*; -import org.jetbrains.annotations.NotNull; - -import static com.intellij.remoterobot.search.locators.Locators.byXpath; -import static com.intellij.remoterobot.utils.UtilsKt.hasAnyComponent; - - -@DefaultXpath(by = "FlatWelcomeFrame type", xpath = "//div[@class='FlatWelcomeFrame']") -@FixtureName(name = "Welcome Frame") -public class WelcomeFrameFixture extends CommonContainerFixture { - public WelcomeFrameFixture(@NotNull RemoteRobot remoteRobot, @NotNull RemoteComponent remoteComponent) { - super(remoteRobot, remoteComponent); - } - - public ComponentFixture createNewProjectLink() { - return welcomeFrameLink("New Project"); - } - - public ComponentFixture importProjectLink() { - return welcomeFrameLink("Get from VCS"); - } - - private ComponentFixture welcomeFrameLink(String text) { - if (hasAnyComponent(this, byXpath("//div[@class='NewRecentProjectPanel']"))) { - return find(ComponentFixture.class, byXpath("//div[@class='JBOptionButton' and @text='" + text + "']")); - } - return find( - ComponentFixture.class, - byXpath("//div[(@class='MainButton' and @text='"+ text +"') or (@accessiblename='"+ text +"' and @class='JButton')]") - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/BaseReferenceTestCase.java b/src/test/java/com/magento/idea/magento2plugin/reference/BaseReferenceTestCase.java deleted file mode 100644 index 1a3adae14..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/BaseReferenceTestCase.java +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference; - -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiReference; -import com.intellij.psi.PsiReferenceProvider; -import com.intellij.psi.ResolveResult; -import com.intellij.psi.impl.file.PsiDirectoryImpl; -import com.intellij.psi.xml.XmlAttributeValue; -import com.intellij.psi.xml.XmlFile; -import com.intellij.psi.xml.XmlTag; -import com.intellij.util.ProcessingContext; -import com.jetbrains.php.lang.psi.elements.Method; -import com.jetbrains.php.lang.psi.elements.Parameter; -import com.jetbrains.php.lang.psi.elements.ParameterList; -import com.jetbrains.php.lang.psi.elements.PhpClass; -import com.magento.idea.magento2plugin.inspections.BaseInspectionsTestCase; -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.reference.xml.PolyVariantReferenceBase; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import org.jetbrains.annotations.Nullable; - -@SuppressWarnings({ - "PMD.TooManyMethods", -}) -public abstract class BaseReferenceTestCase extends BaseInspectionsTestCase { - private static final String testDataFolderPath = "testData" + File.separator//NOPMD - + "reference" + File.separator; - - @Override - public void setUp() throws Exception { - super.setUp(); - myFixture.setTestDataPath(testDataFolderPath); - } - - @SuppressWarnings("PMD.CognitiveComplexity") - protected void assertHasReferenceToXmlAttributeValue(final String reference) { - final PsiElement element = getElementFromCaret(); - for (final PsiReference psiReference: element.getReferences()) { - if (psiReference instanceof PolyVariantReferenceBase) { - final ResolveResult[] resolveResults - = ((PolyVariantReferenceBase) psiReference).multiResolve(true); - - for (final ResolveResult resolveResult : resolveResults) { - final PsiElement resolved = resolveResult.getElement(); - if (!(resolved instanceof XmlAttributeValue)) { - continue; - } - - if (((XmlAttributeValue) resolved).getValue().equals(reference)) { - return; - } - } - } else { - final PsiElement resolved = psiReference.resolve(); - if (!(resolved instanceof XmlAttributeValue)) { - continue; - } - - if (((XmlAttributeValue) resolved).getValue().equals(reference)) { - return; - } - } - } - final String referenceNotFound = - "Failed that element contains reference to the attribute value `%s`"; - - fail(String.format(referenceNotFound, reference)); - } - - @SuppressWarnings("PMD.CognitiveComplexity") - protected void assertHasReferenceToXmlTag(final String tagName) { - final PsiElement element = getElementFromCaret(); - for (final PsiReference psiReference: element.getReferences()) { - if (psiReference instanceof PolyVariantReferenceBase) { - final ResolveResult[] resolveResults - = ((PolyVariantReferenceBase) psiReference).multiResolve(true); - - for (final ResolveResult resolveResult : resolveResults) { - final PsiElement resolved = resolveResult.getElement(); - if (!(resolved instanceof XmlTag)) { - continue; - } - - if (((XmlTag) resolved).getName().equals(tagName)) { - return; - } - } - } else { - final PsiElement resolved = psiReference.resolve(); - if (!(resolved instanceof XmlTag)) { - continue; - } - - if (((XmlTag) resolved).getName().equals(tagName)) { - return; - } - } - } - final String referenceNotFound - = "Failed that element contains reference to the XML tag `%s`"; - - fail(String.format(referenceNotFound, tagName)); - } - - protected void assertHasReferenceToFile(final String reference) { - final PsiElement element = getElementFromCaret(); - - assertHasReferenceToFile(reference, Arrays.asList(element.getReferences())); - } - - protected void assertHasReferenceToFile( - final String reference, - final Class providerClass - ) { - final PsiElement element = getLeafElementFromCaret(); - final List references = new ArrayList<>(); - - try { - final PsiReferenceProvider provider = providerClass.getConstructor().newInstance(); - references.addAll( - Arrays.asList( - provider.getReferencesByElement(element, new ProcessingContext()) - ) - ); - } catch (NoSuchMethodException - | IllegalAccessException - | InvocationTargetException - | InstantiationException exception - ) { - references.addAll(Arrays.asList(element.getReferences())); - } - - assertHasReferenceToFile(reference, references); - } - - protected void assertHasReferenceToFile( - final String reference, - final List references - ) { - for (final PsiReference psiReference : references) { - final PsiElement resolved = psiReference.resolve(); - if (!(resolved instanceof PsiFile)) { - continue; - } - if (((PsiFile) resolved).getVirtualFile().getPath().endsWith(reference)) { - return; - } - } - final String referenceNotFound = "Failed that element contains reference to the file `%s`"; - - fail(String.format(referenceNotFound, reference)); - } - - protected void assertHasReferenceToXmlFile(final String fileName) { - final PsiElement element = getElementFromCaret(); - for (final PsiReference psiReference : element.getReferences()) { - final PsiElement resolved = psiReference.resolve(); - if (!(resolved instanceof XmlFile)) { - continue; - } - - if (((XmlFile) resolved).getName().equals(fileName)) { - return; - } - } - final String referenceNotFound - = "Failed that element contains reference to the XML tag `%s`"; - - fail(String.format(referenceNotFound, fileName)); - } - - protected void assertHasReferenceToDirectory(final String directoryName) { - for (final PsiReference psiReference : getElementFromCaret().getReferences()) { - final PsiElement resolvedElement = psiReference.resolve(); - if (resolvedElement instanceof PsiDirectoryImpl - && ((PsiDirectoryImpl) resolvedElement).getName().equals(directoryName)) { - return; - } - } - - final String referenceNotFound - = "Failed that element contains reference to the directory `%s`"; - fail(String.format(referenceNotFound, directoryName)); - } - - protected void assertHasNoReferenceToDirectory(final String directoryName) { - for (final PsiReference psiReference : getElementFromCaret().getReferences()) { - final PsiElement resolvedElement = psiReference.resolve(); - if (resolvedElement instanceof PsiDirectoryImpl - && ((PsiDirectoryImpl) resolvedElement).getName().equals(directoryName)) { - final String referenceNotFound - = "Failed that element does not contain reference to the directory `%s`"; - fail(String.format(referenceNotFound, directoryName)); - } - } - } - - @SuppressWarnings("PMD") - protected void assertHasReferencePhpClass(final String phpClassFqn) { - final PsiElement element = getElementFromCaret(); - final PsiReference[] references = element.getReferences(); - String result = ((PhpClass) references[references.length - 1] - .resolve()) - .getPresentableFQN(); - assertEquals( - phpClassFqn, - result - ); - } - - protected void assertHasReferencetoConstructorParameter( - final String argumentClassFqn, - final String argumentName - ) { - final PsiElement element = getElementFromCaret(); - final @Nullable PsiReference reference = element.getReference(); - - if (reference == null) { - final String referenceNotFound - = "Failed that element does not contain and reference"; - fail(referenceNotFound); - } - - final String parameterClassFqn = ((Parameter) reference.resolve()) - .getLocalType().toStringResolved(); - final String parameterName = ((Parameter) reference.resolve()).getName(); - - assertEquals("Class name in argument equals class name in parameter", - parameterClassFqn, - argumentClassFqn); - assertEquals("Variable name in argument equals variable name in parameter", - parameterName, - argumentName); - } - - protected void assertHasReferenceToClassMethod( - final String className, - final String methodName - ) { - final PsiElement element = getElementFromCaret(); - final PsiReference[] references = element.getReferences(); - final String actualClassName = ((PhpClass) references[references.length - 1].resolve() - .getParent()).getPresentableFQN(); - final String actualMethodName = ((Method) references[references.length - 1].resolve()) - .getName(); - - assertEquals( - "Class name", - className, - actualClassName - ); - assertEquals( - "Method name", - methodName, - actualMethodName - ); - } - - protected void assertHasReferenceToMethodArgument(final String argument) { - final PsiReference[] references = getElementFromCaret().getReferences(); - final String actualArgument - = StringUtil.unquoteString(references[references.length - 1].resolve().getText()); - final PsiElement parameterList = references[0].resolve().getParent(); - - if (!(parameterList instanceof ParameterList)) { - fail("Element doesn't have a reference to a method parameter"); - } - - assertEquals( - "Event dispatch argument", - argument, - actualArgument - ); - } - - protected void assertEmptyReference() { - final PsiElement element = getElementFromCaret(); - assertEmpty(element.getReferences()); - } - - private PsiElement getElementFromCaret() { - return myFixture.getFile().findElementAt(myFixture.getCaretOffset()).getParent(); - } - - private PsiElement getLeafElementFromCaret() { - return myFixture.getFile().findElementAt(myFixture.getCaretOffset()); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/js/ReferenceJsFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/reference/js/ReferenceJsFixtureTestCase.java deleted file mode 100644 index f9d42dc54..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/js/ReferenceJsFixtureTestCase.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.js; - -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.reference.BaseReferenceTestCase; - -abstract public class ReferenceJsFixtureTestCase extends BaseReferenceTestCase { - - private static final String fixturesFolderPath = "js" + File.separator; - - protected String getFixturePath(String fileName) { - return prepareFixturePath(fileName, fixturesFolderPath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/js/RequireJsReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/js/RequireJsReferenceRegistrarTest.java deleted file mode 100644 index 0ecb6f720..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/js/RequireJsReferenceRegistrarTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.js; - -import com.magento.idea.magento2plugin.reference.provider.FilePathReferenceProvider; - -public class RequireJsReferenceRegistrarTest extends ReferenceJsFixtureTestCase { - - private static final String FIXTURE_PATH = "test.js"; - private static final String MIXIN_FIXTURE_PATH = "requirejs-config.js"; - - /** - * Mapped parameters should have reference to file. - */ - public void testMappedInjectionParameterMustHaveReference() { - myFixture.configureByFile(getFixturePath(FIXTURE_PATH)); - - assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file.js"); - } - - /** - * Path parameters should have reference to file. - */ - public void testPathInjectionParameterMustHaveReference() { - myFixture.configureByFile(getFixturePath(FIXTURE_PATH)); - - assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file2.js"); - } - - /** - * The Magento resource file path parameters should have reference to file. - */ - public void testFileInjectionParameterMustHaveReference() { - myFixture.configureByFile(getFixturePath(FIXTURE_PATH)); - - assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file.js"); - } - - /** - * Lib resource parameters should have reference to file. - */ - public void testLibInjectionParameterMustHaveReference() { - myFixture.configureByFile(getFixturePath(FIXTURE_PATH)); - - assertHasReferenceToFile("/lib/web/testjs.js"); - } - - /** - * Mixin declaration parameters should have reference to file. - */ - public void testFilePathInMixinDeclarationMustHaveReference() { - myFixture.configureByFile(getFixturePath(MIXIN_FIXTURE_PATH)); - - assertHasReferenceToFile( - "app/code/Foo/Bar/view/frontend/web/js/file.js", - FilePathReferenceProvider.class - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/php/ConfigPhpModuleReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/php/ConfigPhpModuleReferenceRegistrarTest.java deleted file mode 100644 index 1eeeb3da9..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/php/ConfigPhpModuleReferenceRegistrarTest.java +++ /dev/null @@ -1,27 +0,0 @@ -/** - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.php; - -public class ConfigPhpModuleReferenceRegistrarTest extends ReferencePhpFixtureTestCase { - - /** - * Tests for module name reference under array key 'modules' in config.php - */ - public void testModuleNameMustHaveReference() { - myFixture.configureByFile(this.getFixturePath("config.php")); - - assertHasReferenceToDirectory("module-catalog"); - } - - /** - * Tests for no module name reference under a different array key in config.php - */ - public void testModuleNameMustNotHaveReference() { - myFixture.configureByFile(this.getFixturePath("config.php")); - - assertHasNoReferenceToDirectory("module-catalog"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/php/ObserverDispatchEventReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/php/ObserverDispatchEventReferenceRegistrarTest.java deleted file mode 100644 index 3e9346457..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/php/ObserverDispatchEventReferenceRegistrarTest.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.php; - -public class ObserverDispatchEventReferenceRegistrarTest extends ReferencePhpFixtureTestCase { - - public void testDispatchCallParamMustHaveReference() { - String filePath = this.getFixturePath("TestBlock.php"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("test_event_in_test_class"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/php/ReferencePhpFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/reference/php/ReferencePhpFixtureTestCase.java deleted file mode 100644 index 47ddefb09..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/php/ReferencePhpFixtureTestCase.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.php; - -import com.magento.idea.magento2plugin.reference.BaseReferenceTestCase; -import com.magento.idea.magento2plugin.magento.packages.File; - -abstract public class ReferencePhpFixtureTestCase extends BaseReferenceTestCase { - - private static final String fixturesFolderPath = "php" + File.separator; - - protected String getFixturePath(String fileName) { - return prepareFixturePath(fileName, fixturesFolderPath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConfigurationTypeReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConfigurationTypeReferenceRegistrarTest.java deleted file mode 100644 index ca0b4550f..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConfigurationTypeReferenceRegistrarTest.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class ConfigurationTypeReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - public void testDiXmlTypeNameMustHaveReference() { - String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - myFixture.configureByFile(filePath); - - assertHasReferencePhpClass("Magento\\Backend\\Model\\Source\\YesNo"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConstructorArgumentReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConstructorArgumentReferenceRegistrarTest.java deleted file mode 100644 index 9bb376e1e..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConstructorArgumentReferenceRegistrarTest.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class ConstructorArgumentReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - /** - * Tests for valid reference in di.xml constructor argument - */ - public void testDiXmlConstructorArgumentMustHaveReference() { - myFixture.configureByFile(this.getFixturePath(ModuleDiXml.FILE_NAME)); - - assertHasReferencetoConstructorParameter( - "\\Magento\\Framework\\Logger\\LoggerInterface", - "logger" - ); - } - - /** - * Tests for no reference in di.xml constructor argument - */ - public void testDiXmlConstructorArgumentMustNotHaveReference() { - myFixture.configureByFile(this.getFixturePath(ModuleDiXml.FILE_NAME)); - - assertEmptyReference(); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/CrontabReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/CrontabReferenceRegistrarTest.java deleted file mode 100644 index bd763fe19..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/CrontabReferenceRegistrarTest.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.CrontabXmlTemplate; - -public class CrontabReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - private static final String EXPECTED_CLASS = "Magento\\Catalog\\Cron\\RefreshSpecialPrices"; - private static final String EXPECTED_METHOD = "execute"; - - /** - * Test instance attribute of the crontab.xml file must have reference. - */ - public void testCrontabInstanceMustHaveReference() { - myFixture.configureByFile(this.getFixturePath(CrontabXmlTemplate.FILE_NAME)); - - assertHasReferencePhpClass(EXPECTED_CLASS); - } - - /** - * Tests for reference to valid PHP method in crontab.xml. - */ - public void testCrontabMethodMustHaveReference() { - myFixture.configureByFile(this.getFixturePath(CrontabXmlTemplate.FILE_NAME)); - - assertHasReferenceToClassMethod( - EXPECTED_CLASS, - EXPECTED_METHOD - ); - } - - /** - * Tests for no reference to invalid PHP method in crontab.xml. - */ - public void testCrontabMethodMustNotHaveReference() { - myFixture.configureByFile(this.getFixturePath(CrontabXmlTemplate.FILE_NAME)); - - assertEmptyReference(); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/DisabledPluginReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/DisabledPluginReferenceRegistrarTest.java deleted file mode 100644 index 83611c9df..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/DisabledPluginReferenceRegistrarTest.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class DisabledPluginReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - /** - * Tests for disabled plugin name reference to original definition. - */ - public void testDisabledPluginNameMustHaveReference() { - myFixture.configureByFile(this.getFixturePath(ModuleDiXml.FILE_NAME)); - - assertHasReferenceToXmlAttributeValue("catalogTopmenu"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutBlockReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutBlockReferenceRegistrarTest.java deleted file mode 100644 index 3367afdeb..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutBlockReferenceRegistrarTest.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.LayoutXml; - -public class LayoutBlockReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - public void testReferenceBlockMustHaveReference() { - String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlTag("block"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutContainerReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutContainerReferenceRegistrarTest.java deleted file mode 100644 index 5c254ec0b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutContainerReferenceRegistrarTest.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.LayoutXml; - -public class LayoutContainerReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - /** - * The `name` attribute of the `referenceContainer` tag in layout XML must - * have reference to the `name` attribute of `container` tag. - */ - public void testReferenceContainerMustHaveReference() { - final String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlTag("container"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUIComponentReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUIComponentReferenceRegistrarTest.java deleted file mode 100644 index 4eb0c4f92..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUIComponentReferenceRegistrarTest.java +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.LayoutXml; - -public class LayoutUIComponentReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - public void testUIComponentMustHaveReference() { - final String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlFile("recently_viewed_2.xml"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUpdateHandleReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUpdateHandleReferenceRegistrarTest.java deleted file mode 100644 index 0c6e684d9..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUpdateHandleReferenceRegistrarTest.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -public class LayoutUpdateHandleReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - /** - * The `handle` attribute of the `update` tag in the layout XML must - * have reference to the layout. - */ - public void testLayoutUpdateHandleMustHaveReference() { - final String filePath = this.getFixturePath("test_test_test.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToFile( - "magento/module-catalog/view/frontend/layout/test_index_index.xml" - ); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MenuReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MenuReferenceRegistrarTest.java deleted file mode 100644 index 1d22614b1..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MenuReferenceRegistrarTest.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleMenuXml; - -public class MenuReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - /** - * The `parent` attribute of the `add` tag in a menu XML must - * have reference to the `id` attribute of the another `add` tag. - */ - public void testAddTagMustHaveCompletion() { - final String filePath = this.getFixturePath(ModuleMenuXml.fileName); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlTag(ModuleMenuXml.addTag); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfEntityNameReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfEntityNameReferenceRegistrarTest.java deleted file mode 100644 index 58553611a..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfEntityNameReferenceRegistrarTest.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.xml; - -public class MftfEntityNameReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - public void testCreateDataActionGroupMustHaveReference() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); - } - - public void testCreateDataInTestMustHaveReference() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); - } - - public void testUpdateDataActionGroupMustHaveReference() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); - } - - public void testUpdateDataInTestMustHaveReference() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); - } - - public void testUserInputInActionGroupMustHaveReference() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); - } - - public void testUserInputInTestMustHaveReference() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); - } - - public void testEntityExtendsInDataMustHaveReference() { - String filePath = this.getFixturePath("TestData.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); - } - - public void testCreateDataActionGroupPluginDisabled() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - disablePluginAndReindex(); - - assertEmptyReference(); - } - - public void testCreateDataActionGroupMftfSupportDisabled() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - disableMftfSupportAndReindex(); - - assertEmptyReference(); - } - - public void testCreateDataInTestWithSectionMustBeEmpty() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } - - public void testUpdateDataInTestWithSectionMustBeEmpty() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } - - public void testUserInputInTestMustBeEmpty() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } - - public void testEntityExtendsInDataMustBeEmpty() { - String filePath = this.getFixturePath("TestData.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfNameReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfNameReferenceRegistrarTest.java deleted file mode 100644 index 60f01911c..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfNameReferenceRegistrarTest.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.xml; - -public class MftfNameReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - public void testExtendsMustHaveReference() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestVerifyTinyMCEv4IsNativeWYSIWYGOnProductTest"); - } - - public void testExtendsInActionGroupMustBeEmpty() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfPageUrlReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfPageUrlReferenceRegistrarTest.java deleted file mode 100644 index a1784f7d7..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfPageUrlReferenceRegistrarTest.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.xml; - -public class MftfPageUrlReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - public void testPageUrlInActionGroupMustHaveReference() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestPage2"); - } - - public void testPageUrlInActionGroupMustBeEmptyForSection() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } - - public void testPageUrlInActionGroupMustBeEmptyForTestDocument() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } - - public void testPageUrlInTestMustHaveReference() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestPage"); - } - - public void testPageUrlBeforeInTestMustHaveReference() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("TestPage"); - } - - public void testPageUrlInTestMustBeEmptyForSection() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } - - public void testPageUrlInTestMustBeEmptyForActionGroup() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } - - public void testPageUrlInActionGroupPluginDisabled() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - disablePluginAndReindex(); - - assertEmptyReference(); - } - - public void testPageUrlInTestMftfSupportDisabled() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - disableMftfSupportAndReindex(); - - assertEmptyReference(); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfSelectorReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfSelectorReferenceRegistrarTest.java deleted file mode 100644 index fd1cdb6f6..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfSelectorReferenceRegistrarTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.xml; - -public class MftfSelectorReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - public void testSelectorInActionGroupMustHaveReference() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("testaddSelectedProducts"); - } - - public void testSelectorInTestMustHaveReference() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlAttributeValue("testaddSelectedProducts"); - } - - public void testSelectorInActionGroupMustBeEmpty() { - String filePath = this.getFixturePath("TestActionGroup.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } - - public void testSelectorInTestMustBeEmpty() { - String filePath = this.getFixturePath("TestMftfTest.xml"); - myFixture.configureByFile(filePath); - - assertEmptyReference(); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ModuleNameReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ModuleNameReferenceRegistrarTest.java deleted file mode 100644 index f464ccd34..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ModuleNameReferenceRegistrarTest.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -public class ModuleNameReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - /** - * Tests for module name reference in module.xml - */ - public void testModuleNameMustHaveReference() { - myFixture.configureByFile(this.getFixturePath("module.xml")); - - assertHasReferenceToDirectory("module-catalog"); - } - - /** - * Tests for module name reference under sequence node in module.xml - */ - public void testSequenceModuleNameMustHaveReference() { - myFixture.configureByFile(this.getFixturePath("module.xml")); - - assertHasReferenceToDirectory("module-config"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ObserverReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ObserverReferenceRegistrarTest.java deleted file mode 100644 index 155852a18..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ObserverReferenceRegistrarTest.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleEventsXml; - -public class ObserverReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - /** - * Tests for observer instance reference in events.xml. - */ - public void testObserverInstanceMustHaveReference() { - myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME)); - - assertHasReferencePhpClass("Magento\\Catalog\\Observer\\TestObserver"); - } - - /** - * Tests for observer instance with snake case reference in events.xml. - */ - public void testObserverInstanceDirectorySnakeCaseMustHaveReference() { - myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME)); - - assertHasReferencePhpClass("Magento\\Catalog\\test_event\\TestObserver"); - } - - /** - * Tests for observer name reference in events.xml. - */ - public void testObserverNameMustHaveReference() { - myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME)); - - assertHasReferenceToXmlAttributeValue("test_observer"); - } - - /** - * Tests for event name reference in events.xml. - */ - public void testEventNameMustHaveReference() { - myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME)); - - assertHasReferenceToMethodArgument("test_event_in_block"); - } - - /** - * Tests for no event name reference in events.xml. - */ - public void testEventNameMustNotHaveReference() { - myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME)); - - assertEmptyReference(); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/PluginTypeReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/PluginTypeReferenceRegistrarTest.java deleted file mode 100644 index 97fba519a..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/PluginTypeReferenceRegistrarTest.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; - -public class PluginTypeReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - /** - * The `type` attribute of the `plugin` tag in di.xml must - * have reference to the PHP class - */ - public void testPluginTypeMustHaveReference() { - final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); - myFixture.configureByFile(filePath); - - assertHasReferencePhpClass("Magento\\Backend\\Model\\Source\\YesNo"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ReferenceXmlFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ReferenceXmlFixtureTestCase.java deleted file mode 100644 index b73bc5d7f..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ReferenceXmlFixtureTestCase.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.packages.File; -import com.magento.idea.magento2plugin.reference.BaseReferenceTestCase; - -abstract public class ReferenceXmlFixtureTestCase extends BaseReferenceTestCase { - - private static final String fixturesFolderPath = "xml" + File.separator; - - protected String getFixturePath(String fileName) { - return prepareFixturePath(fileName, fixturesFolderPath); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/RequireJsReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/RequireJsReferenceRegistrarTest.java deleted file mode 100644 index 7d2d76299..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/RequireJsReferenceRegistrarTest.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.xml; - -public class RequireJsReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - public void testMappedComponentMustHaveReference() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file.js"); - } - - public void testPathComponentMustHaveReference() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file2.js"); - } - - public void testFileComponentMustHaveReference() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file.js"); - } - - public void testLibComponentMustHaveReference() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToFile("/lib/web/testjs.js"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/TableNameAndColumnReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/TableNameAndColumnReferenceRegistrarTest.java deleted file mode 100644 index 97adcd998..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/TableNameAndColumnReferenceRegistrarTest.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -import com.magento.idea.magento2plugin.magento.files.ModuleDbSchemaXml; - -/** - * Test table and columns name references in the db_schema.xml file. - */ -public class TableNameAndColumnReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - /** - * The `name` attribute of the `table` tag in a `db_schema.xml` must - * have reference to the `name` attribute of the another `table` tag. - */ - public void testTableTagMustHaveReference() { - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlTag(ModuleDbSchemaXml.XML_TAG_TABLE); - } - - /** - * The `table` attribute of the `constraint` tag in a `db_schema.xml` must - * have reference to the `name` attribute of the another `table` tag. - */ - public void testConstraintTableTagMustHaveReference() { - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlTag(ModuleDbSchemaXml.XML_TAG_TABLE); - } - - /** - * The `referenceTable` attribute of the `constraint` tag in a `db_schema.xml` must - * have reference to the `name` attribute of the another `table` tag. - */ - public void testConstraintReferenceTableTagMustHaveReference() { - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlTag(ModuleDbSchemaXml.XML_TAG_TABLE); - } - - /** - * The `column` attribute of the `constraint` tag in a `db_schema.xml` must - * have reference to the `name` attribute of the `column` tag. - */ - public void testConstraintColumnTagMustHaveReference() { - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlTag(ModuleDbSchemaXml.XML_TAG_COLUMN); - } - - /** - * The `referenceColumn` attribute of the `constraint` tag in a `db_schema.xml` must - * have reference to the `name` attribute of the `column` tag. - */ - public void testConstraintReferenceColumnTagMustHaveReference() { - final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); - myFixture.configureByFile(filePath); - - assertHasReferenceToXmlTag(ModuleDbSchemaXml.XML_TAG_COLUMN); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/UiComponentTemplateReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/UiComponentTemplateReferenceRegistrarTest.java deleted file mode 100644 index d5310191b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/UiComponentTemplateReferenceRegistrarTest.java +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ -package com.magento.idea.magento2plugin.reference.xml; - -public class UiComponentTemplateReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - public void testFileTemplateAttributeMustHaveReference() { - String filePath = this.getFixturePath("test_form.xml"); - myFixture.configureByFile(filePath); - - assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/template/template2.html"); - } -} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/WebApiMethodReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/WebApiMethodReferenceRegistrarTest.java deleted file mode 100644 index 431a0534b..000000000 --- a/src/test/java/com/magento/idea/magento2plugin/reference/xml/WebApiMethodReferenceRegistrarTest.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright © Magento, Inc. All rights reserved. - * See COPYING.txt for license details. - */ - -package com.magento.idea.magento2plugin.reference.xml; - -public class WebApiMethodReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { - - /** - * Tests for reference to valid PHP method in webapi.xml. - */ - public void testWebApiMethodMustHaveReference() { - myFixture.configureByFile(this.getFixturePath("webapi.xml")); - - assertHasReferenceToClassMethod( - "Magento\\Catalog\\Api\\ProductRepositoryInterface", - "save" - ); - } - - /** - * Tests for no reference to invalid PHP method in webapi.xml. - */ - public void testWebApiMethodMustNotHaveReference() { - myFixture.configureByFile(this.getFixturePath("webapi.xml")); - - assertEmptyReference(); - } -} From 4a703a3db36e642300921f16277c293eb62eda72 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Wed, 19 Mar 2025 21:09:57 +0200 Subject: [PATCH 03/34] 1263: updated java --- .github/workflows/asset.yml | 4 ++-- .github/workflows/gradle.yml | 16 ++++++++-------- .github/workflows/gradlepublish.yml | 4 ++-- README.md | 2 +- build.gradle.kts | 2 +- qodana.yml | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/asset.yml b/.github/workflows/asset.yml index 73549919d..f6c9d94ab 100644 --- a/.github/workflows/asset.yml +++ b/.github/workflows/asset.yml @@ -11,10 +11,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: 17 + java-version: 21 distribution: 'temurin' cache: gradle - name: Gradle wrapper diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 04228d6dc..9d4dfa404 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -13,10 +13,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: 17 + java-version: 21 distribution: 'temurin' cache: gradle - uses: actions/cache@v3 @@ -39,10 +39,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: 17 + java-version: 21 distribution: 'temurin' cache: gradle - uses: actions/cache@v3 @@ -65,10 +65,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: 17 + java-version: 21 distribution: 'temurin' cache: gradle - uses: actions/cache@v3 @@ -91,10 +91,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: 17 + java-version: 21 distribution: 'temurin' cache: gradle - uses: actions/cache@v3 diff --git a/.github/workflows/gradlepublish.yml b/.github/workflows/gradlepublish.yml index 9e43f3172..263d7a971 100644 --- a/.github/workflows/gradlepublish.yml +++ b/.github/workflows/gradlepublish.yml @@ -13,10 +13,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v3 with: - java-version: 17 + java-version: 21 distribution: 'temurin' cache: gradle - name: Gradle wrapper diff --git a/README.md b/README.md index 85a5ae4ef..5115e82a9 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ ## Works with * PhpStorm >= 2023.1 -* JRE >= 17 +* JRE >= 21 ## Setting up development environment diff --git a/build.gradle.kts b/build.gradle.kts index 005927c3d..02003c5a8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -23,7 +23,7 @@ group = providers.gradleProperty("pluginGroup").get() version = providers.gradleProperty("pluginVersion").get() kotlin { - jvmToolchain(17) + jvmToolchain(21) } repositories { diff --git a/qodana.yml b/qodana.yml index a5024279a..0548c0434 100644 --- a/qodana.yml +++ b/qodana.yml @@ -3,7 +3,7 @@ version: 1.0 linter: jetbrains/qodana-jvm-community:2024.2 -projectJDK: "17" +projectJDK: "21" profile: name: qodana.recommended exclude: From 456d8b42c72e79e174135466202e20295027db2e Mon Sep 17 00:00:00 2001 From: vitaliy Date: Wed, 19 Mar 2025 21:26:40 +0200 Subject: [PATCH 04/34] 1263: updated jobs --- .github/workflows/gradle.yml | 110 +++++++++++++---------------------- 1 file changed, 41 insertions(+), 69 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 9d4dfa404..3adfe05b3 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -8,83 +8,55 @@ on: branches: [ master, '*-develop', 'mainline*' ] jobs: - build-linux: - runs-on: ubuntu-latest + + testUI: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + runIde: | + export DISPLAY=:99.0 + Xvfb -ac :99 -screen 0 1920x1080x16 & + gradle runIdeForUiTests & + - os: windows-latest + runIde: start gradlew.bat runIdeForUiTests + - os: macos-latest + runIde: ./gradlew runIdeForUiTests & steps: - - uses: actions/checkout@v3 - - name: Set up JDK 21 - uses: actions/setup-java@v3 - with: - java-version: 21 - distribution: 'temurin' - cache: gradle - - uses: actions/cache@v3 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Gradle wrapper - run: gradle wrapper - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Run automated tests - run: sh runTests.sh - build-windows: - runs-on: windows-latest + # Check out the current repository + - name: Fetch Sources + uses: actions/checkout@v4 - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 21 - uses: actions/setup-java@v3 + # Set up Java environment for the next steps + - name: Setup Java + uses: actions/setup-java@v4 with: - java-version: 21 - distribution: 'temurin' - cache: gradle - - uses: actions/cache@v3 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Gradle wrapper - run: gradle wrapper - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Run automated tests - run: sh runTests.sh + distribution: zulu + java-version: 17 - build-macos: - runs-on: macos-latest + # Setup Gradle + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 - steps: - - uses: actions/checkout@v3 - - name: Set up JDK 21 - uses: actions/setup-java@v3 - with: - java-version: 21 - distribution: 'temurin' - cache: gradle - - uses: actions/cache@v3 + # Run IDEA prepared for UI testing + - name: Run IDE + run: ${{ matrix.runIde }} + + # Wait for IDEA to be started + - name: Health Check + uses: jtalk/url-health-check-action@v4 with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Gradle wrapper - run: gradle wrapper - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Run automated tests - run: sh runTests.sh + url: http://127.0.0.1:8082 + max-attempts: 15 + retry-delay: 30s + + # Run tests + - name: Tests + run: ./gradlew test static-tests: runs-on: ubuntu-latest From bb63f66b9f3df243de205fdf3e4afa2d4b7f2793 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Wed, 19 Mar 2025 21:49:51 +0200 Subject: [PATCH 05/34] Switch from JDK 21 to JDK 17 across project config Updated workflows, build configuration, and documentation to target JDK 17 instead of JDK 21. This ensures compatibility with environments and tools requiring JDK 17 while maintaining a consistent development setup. --- .github/workflows/asset.yml | 4 ++-- .github/workflows/gradle.yml | 4 ++-- .github/workflows/gradlepublish.yml | 4 ++-- README.md | 2 +- build.gradle.kts | 2 +- qodana.yml | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/asset.yml b/.github/workflows/asset.yml index f6c9d94ab..73549919d 100644 --- a/.github/workflows/asset.yml +++ b/.github/workflows/asset.yml @@ -11,10 +11,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 21 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 21 + java-version: 17 distribution: 'temurin' cache: gradle - name: Gradle wrapper diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 3adfe05b3..040aee544 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -63,10 +63,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 21 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 21 + java-version: 17 distribution: 'temurin' cache: gradle - uses: actions/cache@v3 diff --git a/.github/workflows/gradlepublish.yml b/.github/workflows/gradlepublish.yml index 263d7a971..9e43f3172 100644 --- a/.github/workflows/gradlepublish.yml +++ b/.github/workflows/gradlepublish.yml @@ -13,10 +13,10 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Set up JDK 21 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: - java-version: 21 + java-version: 17 distribution: 'temurin' cache: gradle - name: Gradle wrapper diff --git a/README.md b/README.md index 5115e82a9..85a5ae4ef 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ ## Works with * PhpStorm >= 2023.1 -* JRE >= 21 +* JRE >= 17 ## Setting up development environment diff --git a/build.gradle.kts b/build.gradle.kts index 02003c5a8..005927c3d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -23,7 +23,7 @@ group = providers.gradleProperty("pluginGroup").get() version = providers.gradleProperty("pluginVersion").get() kotlin { - jvmToolchain(21) + jvmToolchain(17) } repositories { diff --git a/qodana.yml b/qodana.yml index 0548c0434..a5024279a 100644 --- a/qodana.yml +++ b/qodana.yml @@ -3,7 +3,7 @@ version: 1.0 linter: jetbrains/qodana-jvm-community:2024.2 -projectJDK: "21" +projectJDK: "17" profile: name: qodana.recommended exclude: From 89b2bbe38201ae2bf736fd8af81fd0851114bcaf Mon Sep 17 00:00:00 2001 From: vitaliy Date: Wed, 19 Mar 2025 22:00:39 +0200 Subject: [PATCH 06/34] Add test video artifact capture and upload on failure This ensures that video artifacts from the latest failed test are captured and uploaded for better debugging. The workflow now handles artifact management by copying the video files and uploading them automatically during test failures. --- .github/workflows/gradle.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 040aee544..cc0dad262 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -58,6 +58,23 @@ jobs: - name: Tests run: ./gradlew test + - name: Capture Test Artifacts on Failure + if: failure() + run: | + mkdir -p artifacts/videos + latest_file=$(ls -Art video | tail -n 1) + if [ -n "$latest_file" ]; then + cp "video/$latest_file" "artifacts/videos/latest-test-video.mp4" + fi + shell: bash + + - name: Upload Test Video Artifact + if: failure() + uses: actions/upload-artifact@v3 + with: + name: latest-test-video + path: artifacts/videos/latest-test-video.avi + static-tests: runs-on: ubuntu-latest From c58f401910af8422b27fff5783d81437d62a9cab Mon Sep 17 00:00:00 2001 From: vitaliy Date: Wed, 19 Mar 2025 22:03:52 +0200 Subject: [PATCH 07/34] Improve video artifact upload conditions in CI workflow Restrict artifact uploads to Ubuntu runners on failure and update to `upload-artifact@v4`. Additionally, enable the `overwrite` option to ensure the latest video is consistently stored. --- .github/workflows/gradle.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index cc0dad262..ee98e01a0 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -69,11 +69,12 @@ jobs: shell: bash - name: Upload Test Video Artifact - if: failure() - uses: actions/upload-artifact@v3 + if: failure() && matrix.os == 'ubuntu-latest' + uses: actions/upload-artifact@v4 with: name: latest-test-video path: artifacts/videos/latest-test-video.avi + overwrite: true static-tests: runs-on: ubuntu-latest From b150b17034e59840aef6d3ab184c7cad2ece713c Mon Sep 17 00:00:00 2001 From: vitaliy Date: Wed, 19 Mar 2025 22:10:11 +0200 Subject: [PATCH 08/34] Update artifact upload condition and file extension in CI Restrict video artifact uploads to Ubuntu runners on failure and change the file extension from `.mp4` to `.avi`. This ensures better alignment with the expected platform outputs and maintains consistency in artifact storage. --- .github/workflows/gradle.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index ee98e01a0..2f9818349 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -59,12 +59,12 @@ jobs: run: ./gradlew test - name: Capture Test Artifacts on Failure - if: failure() + if: failure() && matrix.os == 'ubuntu-latest' run: | mkdir -p artifacts/videos latest_file=$(ls -Art video | tail -n 1) if [ -n "$latest_file" ]; then - cp "video/$latest_file" "artifacts/videos/latest-test-video.mp4" + cp "video/$latest_file" "artifacts/videos/latest-test-video.avi" fi shell: bash From a0af93e3fac8cded69f1ffdfc09cfb4da1ebfd02 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Thu, 20 Mar 2025 21:05:05 +0200 Subject: [PATCH 09/34] Simplify test video artifact packaging in CI workflow Replaced individual file handling with tarball compression for test video artifacts. This streamlines the process and reduces complexity in managing files during failures on Ubuntu runners. Updated the upload path to reflect the new tarball format. --- .github/workflows/gradle.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 2f9818349..175d164c6 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -60,12 +60,7 @@ jobs: - name: Capture Test Artifacts on Failure if: failure() && matrix.os == 'ubuntu-latest' - run: | - mkdir -p artifacts/videos - latest_file=$(ls -Art video | tail -n 1) - if [ -n "$latest_file" ]; then - cp "video/$latest_file" "artifacts/videos/latest-test-video.avi" - fi + run: tar -cvzf video.tgz ./video shell: bash - name: Upload Test Video Artifact @@ -73,7 +68,7 @@ jobs: uses: actions/upload-artifact@v4 with: name: latest-test-video - path: artifacts/videos/latest-test-video.avi + path: video.tgz overwrite: true static-tests: From a3c42722e99e1b4d8fdca09e289602e4c27c3fa1 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Thu, 20 Mar 2025 21:19:54 +0200 Subject: [PATCH 10/34] Use `./gradlew` for running UI tests on Linux. Replaced `gradle` with `./gradlew` in the Linux workflow to ensure the correct Gradle wrapper is used consistently. This change aligns with best practices and improves compatibility across environments. --- .github/workflows/gradle.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 175d164c6..a1698e2f1 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -19,7 +19,7 @@ jobs: runIde: | export DISPLAY=:99.0 Xvfb -ac :99 -screen 0 1920x1080x16 & - gradle runIdeForUiTests & + ./gradlew runIdeForUiTests & - os: windows-latest runIde: start gradlew.bat runIdeForUiTests - os: macos-latest From 46b8e90b59cb304da7901debd14fe77b16aa33c6 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Thu, 20 Mar 2025 21:38:46 +0200 Subject: [PATCH 11/34] Update Gradle CI script for UI tests and test execution Change Xvfb screen depth to 24-bit for better compatibility and added a delay to ensure proper initialization. Updated test execution step to set DISPLAY environment variable on Ubuntu. --- .github/workflows/gradle.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index a1698e2f1..5c3f5df0f 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -18,7 +18,8 @@ jobs: - os: ubuntu-latest runIde: | export DISPLAY=:99.0 - Xvfb -ac :99 -screen 0 1920x1080x16 & + Xvfb -ac :99 -screen 0 1920x1080x24 & + sleep 10 ./gradlew runIdeForUiTests & - os: windows-latest runIde: start gradlew.bat runIdeForUiTests @@ -56,7 +57,9 @@ jobs: # Run tests - name: Tests - run: ./gradlew test + run: | + export DISPLAY=:99.0 + ./gradlew test - name: Capture Test Artifacts on Failure if: failure() && matrix.os == 'ubuntu-latest' From a4f65eb2ac47872ca02c5a49fe40bf4fc92010c7 Mon Sep 17 00:00:00 2001 From: vitalii Date: Sat, 22 Mar 2025 22:18:56 +0200 Subject: [PATCH 12/34] 1263: test with licensing workaround --- .../content/MarkDirectoryAsMagentoRootTest.kt | 21 +++++++++++++++---- .../idea/magento2plugin/pages/IdeaFrame.kt | 3 --- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index 3ebf43f5b..aee339230 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -8,13 +8,18 @@ package com.magento.idea.magento2plugin.actions.content import com.automation.remarks.junit5.Video import org.assertj.swing.core.MouseButton import com.intellij.remoterobot.RemoteRobot +import com.intellij.remoterobot.fixtures.ComponentFixture import com.intellij.remoterobot.fixtures.ContainerFixture +import com.intellij.remoterobot.fixtures.Fixture +import com.intellij.remoterobot.fixtures.JButtonFixture import com.intellij.remoterobot.search.locators.byXpath import com.intellij.remoterobot.steps.CommonSteps import com.intellij.remoterobot.stepsProcessing.step +import com.intellij.remoterobot.utils.Keyboard import com.intellij.remoterobot.utils.keyboard import com.intellij.remoterobot.utils.waitFor import com.intellij.remoterobot.utils.waitForIgnoringError +import com.intellij.ui.components.dialog import com.magento.idea.magento2plugin.pages.* import com.magento.idea.magento2plugin.utils.RemoteRobotExtension import com.magento.idea.magento2plugin.utils.StepsLogger @@ -62,6 +67,14 @@ class MarkDirectoryAsMagentoRootTest { @Test @Video fun testMarkDirectoryAsMagentoRoot(remoteRobot: RemoteRobot) = with(remoteRobot) { + // temporary workaround until we get license for CI + val startTrial = find(byXpath("//div[@visible_text='Start trial']")) + startTrial.click() + val startTrialFree = find(byXpath("//div[@class='s']")) + startTrialFree.click() + val dialog = find(byXpath("//div[@class='MyDialog']")) + dialog.button("Close").click(); + // end temporary workaround welcomeFrame { createNewProjectFromExistingFilesLink.click() @@ -85,11 +98,11 @@ class MarkDirectoryAsMagentoRootTest { enableSupportLink.click(java.awt.Point(1, 1)) waitFor(ofMinutes(1)) { isDumbMode().not() } + keyboard { + hotKey(VK_ALT, VK_1) + } + with(projectViewTree) { - if (hasText("vendor").not()) { - findText(projectName).doubleClick() - waitFor { hasText("src") } - } findText("vendor").doubleClick() findText("module-catalog").doubleClick() findText("Block").doubleClick() diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt index 0ca9531fb..614ec850c 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt @@ -25,9 +25,6 @@ class IdeaFrame(remoteRobot: RemoteRobot, remoteComponent: RemoteComponent) : val projectViewTree get() = find(byXpath("ProjectViewTree", "//div[@class='ProjectViewTree']")) - val projectName - get() = step("Get project name") { return@step callJs("component.getProject().getName()") } - @JvmOverloads fun dumbAware(timeout: Duration = Duration.ofMinutes(5), function: () -> Unit) { step("Wait for smart mode") { From 51af5a8471d6934797a13751bcdc2093593d903c Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sun, 23 Mar 2025 09:49:27 +0200 Subject: [PATCH 13/34] Add workaround to handle Firefox overlay during tests This change introduces a step to switch back to PhpStorm IDE if the Firefox overlay is detected during test execution. It uses a JavaScript snippet with Robot actions to simulate the ALT+TAB keypress sequence. This ensures seamless continuation of test cases in multi-window environments. --- .../content/MarkDirectoryAsMagentoRootTest.kt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index aee339230..9a162b0d8 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -74,6 +74,24 @@ class MarkDirectoryAsMagentoRootTest { startTrialFree.click() val dialog = find(byXpath("//div[@class='MyDialog']")) dialog.button("Close").click(); + + step("Switch back to PhpStorm IDE window if Firefox overlay detected") { + waitFor(ofMinutes(2)) { + remoteRobot.callJs( + """ + const robot = java.awt.Robot(); + const activeWindowName = java.awt.Frame.getFrames().find(frame => frame.isActive()).getName(); + if (activeWindowName.contains("Firefox")) { + robot.keyPress(java.awt.event.KeyEvent.VK_ALT); + robot.keyPress(java.awt.event.KeyEvent.VK_TAB); + robot.keyRelease(java.awt.event.KeyEvent.VK_TAB); + robot.keyRelease(java.awt.event.KeyEvent.VK_ALT); + } + true + """.trimIndent() + ) + } + } // end temporary workaround welcomeFrame { From a7fc8d76d7f2b748ba0277d8fe3354b389b6646c Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sun, 23 Mar 2025 10:04:03 +0200 Subject: [PATCH 14/34] Refactor test framework interactions and adjust CI workflow. Updated AWT robot script with improved error handling and logging in test cases. Modified GitHub Actions workflow to run tests differently based on OS, ensuring better compatibility with Ubuntu. --- .github/workflows/gradle.yml | 5 ++++ .../content/MarkDirectoryAsMagentoRootTest.kt | 28 +++++++++++++------ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 5c3f5df0f..89da9f843 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -57,6 +57,11 @@ jobs: # Run tests - name: Tests + if: matrix.os != 'ubuntu-latest' + run: ./gradlew test + + - name: Tests Ubuntu + if: matrix.os == 'ubuntu-latest' run: | export DISPLAY=:99.0 ./gradlew test diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index 9a162b0d8..13375262c 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -73,21 +73,31 @@ class MarkDirectoryAsMagentoRootTest { val startTrialFree = find(byXpath("//div[@class='s']")) startTrialFree.click() val dialog = find(byXpath("//div[@class='MyDialog']")) - dialog.button("Close").click(); + dialog.button("Close").click() step("Switch back to PhpStorm IDE window if Firefox overlay detected") { waitFor(ofMinutes(2)) { remoteRobot.callJs( """ - const robot = java.awt.Robot(); - const activeWindowName = java.awt.Frame.getFrames().find(frame => frame.isActive()).getName(); - if (activeWindowName.contains("Firefox")) { - robot.keyPress(java.awt.event.KeyEvent.VK_ALT); - robot.keyPress(java.awt.event.KeyEvent.VK_TAB); - robot.keyRelease(java.awt.event.KeyEvent.VK_TAB); - robot.keyRelease(java.awt.event.KeyEvent.VK_ALT); + try { + const Robot = Java.type("java.awt.Robot"); + const KeyEvent = Java.type("java.awt.event.KeyEvent"); + const Frames = Java.type("java.awt.Frame"); + const robot = new Robot(); + const activeWindow = Array.from(Frames.getFrames()).find(frame => frame.isActive()); + if (activeWindow && activeWindow.getName().includes("Firefox")) { + print("Firefox overlay detected, switching to PhpStorm..."); + robot.keyPress(KeyEvent.VK_ALT); + robot.keyPress(KeyEvent.VK_TAB); + Thread.sleep(100); + robot.keyRelease(KeyEvent.VK_TAB); + robot.keyRelease(KeyEvent.VK_ALT); + } + true; + } catch (error) { + print("Error during script execution: " + error); + false; } - true """.trimIndent() ) } From e5e47cbe7f5bbb266d071da43eb16a96470d031c Mon Sep 17 00:00:00 2001 From: vitalii Date: Sun, 23 Mar 2025 11:40:56 +0200 Subject: [PATCH 15/34] Added swhitching between tabs --- build.gradle.kts | 5 +---- gradle.properties | 2 +- gradle/libs.versions.toml | 2 +- runTests.sh | 4 ++-- .../generator/ModuleComposerJsonGenerator.java | 13 ++++--------- .../execution/output/ReportBuilder.java | 6 +++--- .../content/MarkDirectoryAsMagentoRootTest.kt | 14 +++++--------- 7 files changed, 17 insertions(+), 29 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 005927c3d..c56d64110 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -40,7 +40,7 @@ dependencies { testImplementation("org.junit.vintage:junit-vintage-engine:5.10.0") - implementation("com.googlecode.json-simple:json-simple:1.1.1") + implementation ("org.json:json:20171018") implementation("org.codehaus.plexus:plexus-utils:3.4.0") testImplementation("com.automation-remarks:video-recorder-junit5:2.0") testImplementation("com.intellij.remoterobot:remote-robot:0.11.23") @@ -53,14 +53,11 @@ dependencies { bundledPlugins(providers.gradleProperty("platformBundledPlugins").map { it.split(',') }) plugins(providers.gradleProperty("platformPlugins").map { it.split(',') }) plugin("com.intellij.lang.jsgraphql", "243.21565.122") - instrumentationTools() pluginVerifier() zipSigner() testFramework(TestFrameworkType.Platform) phpstorm("2024.3") - bundledPlugin("com.jetbrains.php") - bundledPlugin("com.intellij.copyright") } } diff --git a/gradle.properties b/gradle.properties index 42f4a4657..934860abb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ pluginUntilBuild = 258.* platformType = PS platformVersion = 2024.3 platformPlugins = -platformBundledPlugins = com.intellij.modules.json +platformBundledPlugins = com.intellij.modules.json,com.jetbrains.php,JavaScript,com.intellij.copyright gradleVersion = 8.10.2 kotlin.stdlib.default.dependency = false org.gradle.configuration-cache = true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4c2f43f1c..66ad4ce0f 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ junit = "4.13.2" # plugins changelog = "2.2.1" -intelliJPlatform = "2.1.0" +intelliJPlatform = "2.4.0" kotlin = "1.9.25" kover = "0.8.3" qodana = "2024.2.3" diff --git a/runTests.sh b/runTests.sh index 03ac9ad22..69f2cb6a5 100644 --- a/runTests.sh +++ b/runTests.sh @@ -1,12 +1,12 @@ #!/bin/bash ./gradlew clean -./gradlew runIdeForUiTests & +./gradlew runIdeForUiTests --scan & RUN_IDE_PID=$! sleep 10 -./gradlew test --no-daemon +./gradlew test --no-daemon --scan # run certain test #./gradlew test --tests "com.magento.idea.magento2plugin.actions.content.MarkDirectoryAsMagentoRootTest.testMarkDirectoryAsMagentoRoot" --scan diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGenerator.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGenerator.java index 631220870..0a03f9005 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGenerator.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGenerator.java @@ -21,9 +21,8 @@ import java.util.List; import java.util.Properties; import org.jetbrains.annotations.NotNull; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; +import org.json.JSONException; +import org.json.JSONObject; public class ModuleComposerJsonGenerator extends FileGenerator { @@ -176,11 +175,7 @@ private Pair getDependencyData( if (!(composerJsonFile instanceof JsonFile)) { return Pair.create("", ""); } - final JSONParser parser = new JSONParser(); - final Object obj = parser.parse( - composerJsonFile.getText() - ); - final JSONObject jsonObject = (JSONObject) obj; + final JSONObject jsonObject = new JSONObject(composerJsonFile.getText()); if (jsonObject.get("name") == null) { return Pair.create("", ""); @@ -199,7 +194,7 @@ private Pair getDependencyData( } else { return Pair.create("", ""); } - } catch (ParseException exception) { //NOPMD + } catch (JSONException exception) { //NOPMD // It's fine } diff --git a/src/main/java/com/magento/idea/magento2uct/execution/output/ReportBuilder.java b/src/main/java/com/magento/idea/magento2uct/execution/output/ReportBuilder.java index 90a96ee32..960cc727f 100644 --- a/src/main/java/com/magento/idea/magento2uct/execution/output/ReportBuilder.java +++ b/src/main/java/com/magento/idea/magento2uct/execution/output/ReportBuilder.java @@ -30,7 +30,7 @@ import java.util.List; import java.util.Locale; import org.jetbrains.annotations.NotNull; -import org.json.simple.JSONObject; +import org.json.JSONObject; public class ReportBuilder { @@ -148,9 +148,9 @@ public JsonFile build() { final JsonObject issueObject = jsonElementGenerator.createObject("\"lineNumber\": " + issue.getLine() + "," + "\"level\": \"" + issue.getLevel() + "\","//NOPMD - + "\"message\": \"" + JSONObject.escape(issue.getMessage()) + "\"," + + "\"message\": " + JSONObject.quote(issue.getMessage()) + "," + "\"code\": \"" + issue.getCode() + "\"," - + "\"fileName\": \"" + JSONObject.escape(issue.getFilename()) + "\"," + + "\"fileName\": " + JSONObject.quote(issue.getFilename()) + "," + "\"validationType\": \"" + issue.getValidationType() + "\"" ); if (issuesValueBuilder.length() > 0) { diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index 13375262c..d7056f9b4 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -74,19 +74,16 @@ class MarkDirectoryAsMagentoRootTest { startTrialFree.click() val dialog = find(byXpath("//div[@class='MyDialog']")) dialog.button("Close").click() - + Thread.sleep(2_000) step("Switch back to PhpStorm IDE window if Firefox overlay detected") { - waitFor(ofMinutes(2)) { - remoteRobot.callJs( + remoteRobot.runJs( """ try { - const Robot = Java.type("java.awt.Robot"); const KeyEvent = Java.type("java.awt.event.KeyEvent"); const Frames = Java.type("java.awt.Frame"); - const robot = new Robot(); - const activeWindow = Array.from(Frames.getFrames()).find(frame => frame.isActive()); + + const activeWindow = Array.from(Frames.getFrames()).find(frame => frame.isActive()); if (activeWindow && activeWindow.getName().includes("Firefox")) { - print("Firefox overlay detected, switching to PhpStorm..."); robot.keyPress(KeyEvent.VK_ALT); robot.keyPress(KeyEvent.VK_TAB); Thread.sleep(100); @@ -95,12 +92,11 @@ class MarkDirectoryAsMagentoRootTest { } true; } catch (error) { - print("Error during script execution: " + error); false; } """.trimIndent() ) - } + } // end temporary workaround From 46d6b1bef9d8a8478d80cb03044b609960791f8f Mon Sep 17 00:00:00 2001 From: vitalii Date: Sun, 23 Mar 2025 11:49:03 +0200 Subject: [PATCH 16/34] Increased sleep time --- .../actions/content/MarkDirectoryAsMagentoRootTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index d7056f9b4..c0b8a44bc 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -74,7 +74,7 @@ class MarkDirectoryAsMagentoRootTest { startTrialFree.click() val dialog = find(byXpath("//div[@class='MyDialog']")) dialog.button("Close").click() - Thread.sleep(2_000) + Thread.sleep(10_000) step("Switch back to PhpStorm IDE window if Firefox overlay detected") { remoteRobot.runJs( """ From 1e899facea6a524b3090235517ccf8e6d56c590f Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sun, 23 Mar 2025 13:48:36 +0200 Subject: [PATCH 17/34] Fix flaky test by simplifying active window detection logic Removed unnecessary active window checks for Firefox in the test code. This simplifies the logic and improves reliability by avoiding environment-specific conditions. Retained the core functionality for simulating key presses. --- .../actions/content/MarkDirectoryAsMagentoRootTest.kt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index c0b8a44bc..eee6c2adc 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -80,23 +80,17 @@ class MarkDirectoryAsMagentoRootTest { """ try { const KeyEvent = Java.type("java.awt.event.KeyEvent"); - const Frames = Java.type("java.awt.Frame"); - - const activeWindow = Array.from(Frames.getFrames()).find(frame => frame.isActive()); - if (activeWindow && activeWindow.getName().includes("Firefox")) { robot.keyPress(KeyEvent.VK_ALT); robot.keyPress(KeyEvent.VK_TAB); Thread.sleep(100); robot.keyRelease(KeyEvent.VK_TAB); robot.keyRelease(KeyEvent.VK_ALT); - } true; } catch (error) { false; } """.trimIndent() ) - } // end temporary workaround From 7a6ef3b248519601596b463b215ac4f5c6a9af3a Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sun, 23 Mar 2025 13:57:25 +0200 Subject: [PATCH 18/34] Refactor browser closure logic into reusable function Replaced inline JavaScript workaround with a dedicated `closeBrowser` function to handle browser shutdown across different operating systems. This improves code readability and maintainability while ensuring compatibility with Windows, macOS, and Linux environments. --- .../content/MarkDirectoryAsMagentoRootTest.kt | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index eee6c2adc..e8fffd8b8 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -29,6 +29,7 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith import java.awt.event.KeyEvent.* import java.io.File +import java.io.IOException import java.time.Duration.ofMinutes import kotlin.io.path.createTempDirectory @@ -75,23 +76,7 @@ class MarkDirectoryAsMagentoRootTest { val dialog = find(byXpath("//div[@class='MyDialog']")) dialog.button("Close").click() Thread.sleep(10_000) - step("Switch back to PhpStorm IDE window if Firefox overlay detected") { - remoteRobot.runJs( - """ - try { - const KeyEvent = Java.type("java.awt.event.KeyEvent"); - robot.keyPress(KeyEvent.VK_ALT); - robot.keyPress(KeyEvent.VK_TAB); - Thread.sleep(100); - robot.keyRelease(KeyEvent.VK_TAB); - robot.keyRelease(KeyEvent.VK_ALT); - true; - } catch (error) { - false; - } - """.trimIndent() - ) - } + closeBrowser() // end temporary workaround welcomeFrame { @@ -192,6 +177,32 @@ class MarkDirectoryAsMagentoRootTest { } } + fun closeBrowser() { + val os = System.getProperty("os.name").lowercase() + + try { + if (os.contains("win")) { + // For Windows: Close common browsers like Chrome, Firefox, etc. + Runtime.getRuntime().exec("taskkill /F /IM chrome.exe") + Runtime.getRuntime().exec("taskkill /F /IM firefox.exe") + Runtime.getRuntime().exec("taskkill /F /IM msedge.exe") + } else if (os.contains("mac")) { + // For macOS: Kill browsers using `pkill` + Runtime.getRuntime().exec("pkill -f 'Google Chrome'") + Runtime.getRuntime().exec("pkill -f 'Firefox'") + Runtime.getRuntime().exec("pkill -f 'Safari'") + } else if (os.contains("nix") || os.contains("nux")) { + // For Linux-based systems: Kill typical browser processes + Runtime.getRuntime().exec("pkill -f 'chrome'") + Runtime.getRuntime().exec("pkill -f 'firefox'") + Runtime.getRuntime().exec("pkill -f 'edge'") + } + } catch (e: IOException) { + e.printStackTrace() + } + } + + private fun createAPluginWithoutMagentoRootInVendor( ideaFrame: IdeaFrame, remoteRobot1: RemoteRobot From 9ea2092ad42096dfd8dfc13a2856668125569265 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sun, 23 Mar 2025 14:08:00 +0200 Subject: [PATCH 19/34] Simplify browser termination logic in test cleanup. Removed redundant commands and streamlined the process for killing browser processes across different operating systems. This change reduces unnecessary overhead and ensures a more consistent cleanup approach. --- .../actions/content/MarkDirectoryAsMagentoRootTest.kt | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index e8fffd8b8..577607776 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -183,19 +183,13 @@ class MarkDirectoryAsMagentoRootTest { try { if (os.contains("win")) { // For Windows: Close common browsers like Chrome, Firefox, etc. - Runtime.getRuntime().exec("taskkill /F /IM chrome.exe") Runtime.getRuntime().exec("taskkill /F /IM firefox.exe") - Runtime.getRuntime().exec("taskkill /F /IM msedge.exe") } else if (os.contains("mac")) { // For macOS: Kill browsers using `pkill` - Runtime.getRuntime().exec("pkill -f 'Google Chrome'") - Runtime.getRuntime().exec("pkill -f 'Firefox'") - Runtime.getRuntime().exec("pkill -f 'Safari'") + Runtime.getRuntime().exec("killall -9 safari") } else if (os.contains("nix") || os.contains("nux")) { // For Linux-based systems: Kill typical browser processes - Runtime.getRuntime().exec("pkill -f 'chrome'") - Runtime.getRuntime().exec("pkill -f 'firefox'") - Runtime.getRuntime().exec("pkill -f 'edge'") + Runtime.getRuntime().exec("killall -9 firefox") } } catch (e: IOException) { e.printStackTrace() From c4b17eb285f78f42051f1fdc6461774112e1657a Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sun, 23 Mar 2025 15:37:31 +0200 Subject: [PATCH 20/34] Add delay before clicking enable support link in test A 5-second delay was introduced to ensure proper loading of the UI before the enable support link is clicked during the test. This helps prevent timing issues and improves test stability. --- .../actions/content/MarkDirectoryAsMagentoRootTest.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index 577607776..b846f486f 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -98,6 +98,7 @@ class MarkDirectoryAsMagentoRootTest { idea { step("Enable Magento Integration") { waitFor(ofMinutes(1)) { isDumbMode().not() } + Thread.sleep(5_000) enableSupportLink.click(java.awt.Point(1, 1)) waitFor(ofMinutes(1)) { isDumbMode().not() } From 9f74bd6de25332cf1600d4e0e9d5993feeb6fe33 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sun, 23 Mar 2025 15:45:45 +0200 Subject: [PATCH 21/34] Update test scripts for Windows compatibility Replaced browser kill command to target Edge instead of Firefox for Windows. Adjusted GitHub Actions workflow to upload test artifacts on failure specifically for Windows environments. --- .github/workflows/gradle.yml | 4 ++-- .../actions/content/MarkDirectoryAsMagentoRootTest.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 89da9f843..36264b784 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -67,12 +67,12 @@ jobs: ./gradlew test - name: Capture Test Artifacts on Failure - if: failure() && matrix.os == 'ubuntu-latest' + if: failure() && matrix.os == 'windows-latest' run: tar -cvzf video.tgz ./video shell: bash - name: Upload Test Video Artifact - if: failure() && matrix.os == 'ubuntu-latest' + if: failure() && matrix.os == 'windows-latest' uses: actions/upload-artifact@v4 with: name: latest-test-video diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index b846f486f..a5ca9505e 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -184,7 +184,7 @@ class MarkDirectoryAsMagentoRootTest { try { if (os.contains("win")) { // For Windows: Close common browsers like Chrome, Firefox, etc. - Runtime.getRuntime().exec("taskkill /F /IM firefox.exe") + Runtime.getRuntime().exec("taskkill /F /IM edge.exe") } else if (os.contains("mac")) { // For macOS: Kill browsers using `pkill` Runtime.getRuntime().exec("killall -9 safari") From 2cd7dfe67b29a923e460005d774993d97063f43d Mon Sep 17 00:00:00 2001 From: vitaliy Date: Tue, 25 Mar 2025 21:13:16 +0200 Subject: [PATCH 22/34] Add conditional workaround for CI environment in tests The test now checks if it's running in the GitHub Actions environment before executing the trial activation workaround. Additionally, a new step was added to handle a "Don't show again" prompt during project setup. This ensures smoother test execution across environments. --- .../content/MarkDirectoryAsMagentoRootTest.kt | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index a5ca9505e..c4bfb036a 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -69,17 +69,22 @@ class MarkDirectoryAsMagentoRootTest { @Video fun testMarkDirectoryAsMagentoRoot(remoteRobot: RemoteRobot) = with(remoteRobot) { // temporary workaround until we get license for CI - val startTrial = find(byXpath("//div[@visible_text='Start trial']")) - startTrial.click() - val startTrialFree = find(byXpath("//div[@class='s']")) - startTrialFree.click() - val dialog = find(byXpath("//div[@class='MyDialog']")) - dialog.button("Close").click() - Thread.sleep(10_000) - closeBrowser() + if (System.getenv("GITHUB_ACTIONS") == "true") { + val startTrial = find(byXpath("//div[@visible_text='Start trial']")) + startTrial.click() + val startTrialFree = find(byXpath("//div[@class='s']")) + startTrialFree.click() + val dialog = find(byXpath("//div[@class='MyDialog']")) + dialog.button("Close").click() + Thread.sleep(10_000) + closeBrowser() + } // end temporary workaround welcomeFrame { + val launchedFromScript = find(byXpath("//div[@text='Don't show again']")) + launchedFromScript.click() + createNewProjectFromExistingFilesLink.click() dialog("Open File or Project") { // Set the path for the copied test data From 5f241a43753d894d5fc19bcf1801c266132ca43a Mon Sep 17 00:00:00 2001 From: vitaliy Date: Wed, 26 Mar 2025 22:33:23 +0200 Subject: [PATCH 23/34] Fix test behavior and update element locators Added a fallback scenario to handle an alternative dialog in tests. Updated XPath selectors to reflect changes in the UI structure for better stability. --- .../actions/content/MarkDirectoryAsMagentoRootTest.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index c4bfb036a..efe40e1a9 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -78,11 +78,15 @@ class MarkDirectoryAsMagentoRootTest { dialog.button("Close").click() Thread.sleep(10_000) closeBrowser() + } else { + val dialog = find(byXpath("//div[@class='MyDialog']")) + dialog.button("Activate").click() + dialog.button("Close").click() } // end temporary workaround welcomeFrame { - val launchedFromScript = find(byXpath("//div[@text='Don't show again']")) + val launchedFromScript = find(byXpath("//div[@class='LinkLabel']")) launchedFromScript.click() createNewProjectFromExistingFilesLink.click() From 85746b69baf5e83191e0b46d608b7988e18a7a94 Mon Sep 17 00:00:00 2001 From: Vitaliy Boyrko Date: Thu, 27 Mar 2025 19:47:09 +0200 Subject: [PATCH 24/34] 1211: fixed widows path --- .../actions/content/MarkDirectoryAsMagentoRootTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index 511ebff0e..cea43812b 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -109,7 +109,7 @@ class MarkDirectoryAsMagentoRootTest { comboBox.keyboard { hotKey(VK_CONTROL, VK_A) // Select all text key(VK_DELETE) // Delete selected text - enterText(tempProjectDir.absolutePath) + enterText(tempProjectDir.absolutePath.toString().replace("\\", "\\\\")) } button("OK").click() From d1dd93e18ce223bf6d6218c0dea8a0f9057f481c Mon Sep 17 00:00:00 2001 From: vitaliy Date: Thu, 27 Mar 2025 20:41:24 +0200 Subject: [PATCH 25/34] Refactor project setup and add project view visibility check Updated project setup to use user home directory for temporary files. Introduced a utility method to verify if the project view is visible, improving reliability. Adjusted error handling to ensure tests proceed even when some UI elements are missing. --- .../content/MarkDirectoryAsMagentoRootTest.kt | 38 +++++++++++++------ .../idea/magento2plugin/pages/IdeaFrame.kt | 14 ++++++- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index efe40e1a9..6ae3a2f7f 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -6,20 +6,16 @@ package com.magento.idea.magento2plugin.actions.content import com.automation.remarks.junit5.Video +import com.intellij.openapi.util.io.NioFiles.createDirectories import org.assertj.swing.core.MouseButton import com.intellij.remoterobot.RemoteRobot -import com.intellij.remoterobot.fixtures.ComponentFixture import com.intellij.remoterobot.fixtures.ContainerFixture -import com.intellij.remoterobot.fixtures.Fixture -import com.intellij.remoterobot.fixtures.JButtonFixture import com.intellij.remoterobot.search.locators.byXpath import com.intellij.remoterobot.steps.CommonSteps import com.intellij.remoterobot.stepsProcessing.step -import com.intellij.remoterobot.utils.Keyboard import com.intellij.remoterobot.utils.keyboard import com.intellij.remoterobot.utils.waitFor import com.intellij.remoterobot.utils.waitForIgnoringError -import com.intellij.ui.components.dialog import com.magento.idea.magento2plugin.pages.* import com.magento.idea.magento2plugin.utils.RemoteRobotExtension import com.magento.idea.magento2plugin.utils.StepsLogger @@ -30,8 +26,8 @@ import org.junit.jupiter.api.extension.ExtendWith import java.awt.event.KeyEvent.* import java.io.File import java.io.IOException +import java.nio.file.Paths import java.time.Duration.ofMinutes -import kotlin.io.path.createTempDirectory @ExtendWith(RemoteRobotExtension::class) class MarkDirectoryAsMagentoRootTest { @@ -43,9 +39,21 @@ class MarkDirectoryAsMagentoRootTest { @BeforeEach fun setup() { - // Create a temporary directory + // Get the user's home directory in a platform-independent way + val userHomeDir = System.getProperty("user.home") + + // Create a temporary directory inside the user's home directory + val tempDirPath = Paths.get(userHomeDir, "intellij-test-project") + tempProjectDir = createDirectories(tempDirPath).toFile().apply { + // Ensure the temporary directory is deleted and recreated + if (exists()) { + deleteRecursively() + } + mkdirs() + } + + // Define the source directory for the test data val sourceDir = File("testData/project/magento2") - tempProjectDir = createTempDirectory("intellij-test-project").toFile() // Copy the test data to the temporary directory sourceDir.copyRecursively( @@ -86,8 +94,12 @@ class MarkDirectoryAsMagentoRootTest { // end temporary workaround welcomeFrame { - val launchedFromScript = find(byXpath("//div[@class='LinkLabel']")) - launchedFromScript.click() + try { + val launchedFromScript = find(byXpath("//div[@class='LinkLabel']")) + launchedFromScript.click() + } catch (e: Exception) { + // Element does not exist, continue without failing the test + } createNewProjectFromExistingFilesLink.click() dialog("Open File or Project") { @@ -111,8 +123,10 @@ class MarkDirectoryAsMagentoRootTest { enableSupportLink.click(java.awt.Point(1, 1)) waitFor(ofMinutes(1)) { isDumbMode().not() } - keyboard { - hotKey(VK_ALT, VK_1) + if (!isProjectViewVisible()) { + keyboard { + hotKey(VK_ALT, VK_1) + } } with(projectViewTree) { diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt index 614ec850c..96d93eb33 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt @@ -23,7 +23,7 @@ class IdeaFrame(remoteRobot: RemoteRobot, remoteComponent: RemoteComponent) : get() = actionLink(byXpath("//div[@accessiblename='Enable Magento support for this project?' and @class='JEditorPane']")) val projectViewTree - get() = find(byXpath("ProjectViewTree", "//div[@class='ProjectViewTree']")) + get() = find(byXpath("//div[@class='ProjectViewTree']")) @JvmOverloads fun dumbAware(timeout: Duration = Duration.ofMinutes(5), function: () -> Unit) { @@ -40,6 +40,18 @@ class IdeaFrame(remoteRobot: RemoteRobot, remoteComponent: RemoteComponent) : } } + fun isProjectViewVisible(): Boolean { + return try { + with(projectViewTree) { + findText("vendor") + true + } + } catch (e: Exception) { + false + } + } + + fun isDumbMode(): Boolean { return callJs( """ From f73d170f626899812171f0adffef21985a177ca1 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Thu, 27 Mar 2025 20:54:28 +0200 Subject: [PATCH 26/34] Use absolute path for directory input in test setup Changed the test to use `absolutePath` instead of `path` for the temporary project directory. This ensures compatibility and correctness when setting up the test environment. --- .../actions/content/MarkDirectoryAsMagentoRootTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index 6ae3a2f7f..511ebff0e 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -109,7 +109,7 @@ class MarkDirectoryAsMagentoRootTest { comboBox.keyboard { hotKey(VK_CONTROL, VK_A) // Select all text key(VK_DELETE) // Delete selected text - enterText(tempProjectDir.path) + enterText(tempProjectDir.absolutePath) } button("OK").click() From 7f19fb8e7a37e736a5eda650b276f2b1039527ca Mon Sep 17 00:00:00 2001 From: Vitaliy Boyrko Date: Fri, 28 Mar 2025 19:19:16 +0200 Subject: [PATCH 27/34] 1211: adjusted path and SettingsForm --- .gitignore | 3 +- .../magento2plugin/project/SettingsForm.java | 4 +++ .../content/MarkDirectoryAsMagentoRootTest.kt | 35 +++++++++---------- 3 files changed, 22 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index 6af12fe4b..a288ce8ad 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,5 @@ out .idea-sandbox build .intellijPlatform/* -video/* \ No newline at end of file +video/* +intellij-test-project \ No newline at end of file diff --git a/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java b/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java index 2427acaf4..9f3774d30 100644 --- a/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java +++ b/src/main/java/com/magento/idea/magento2plugin/project/SettingsForm.java @@ -120,6 +120,10 @@ protected void reindex() { @Override public boolean isModified() { + if (moduleDefaultLicenseName == null) { + return true; + } + final boolean licenseChanged = !moduleDefaultLicenseName.getText().equals( getSettings().defaultLicense ); diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index cea43812b..10fcd4acc 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -39,12 +39,9 @@ class MarkDirectoryAsMagentoRootTest { @BeforeEach fun setup() { - // Get the user's home directory in a platform-independent way - val userHomeDir = System.getProperty("user.home") - // Create a temporary directory inside the user's home directory - val tempDirPath = Paths.get(userHomeDir, "intellij-test-project") - tempProjectDir = createDirectories(tempDirPath).toFile().apply { + val projectDir = Paths.get("intellij-test-project") + tempProjectDir = createDirectories(projectDir).toFile().apply { // Ensure the temporary directory is deleted and recreated if (exists()) { deleteRecursively() @@ -77,20 +74,20 @@ class MarkDirectoryAsMagentoRootTest { @Video fun testMarkDirectoryAsMagentoRoot(remoteRobot: RemoteRobot) = with(remoteRobot) { // temporary workaround until we get license for CI - if (System.getenv("GITHUB_ACTIONS") == "true") { - val startTrial = find(byXpath("//div[@visible_text='Start trial']")) - startTrial.click() - val startTrialFree = find(byXpath("//div[@class='s']")) - startTrialFree.click() - val dialog = find(byXpath("//div[@class='MyDialog']")) - dialog.button("Close").click() - Thread.sleep(10_000) - closeBrowser() - } else { - val dialog = find(byXpath("//div[@class='MyDialog']")) - dialog.button("Activate").click() - dialog.button("Close").click() - } +// if (System.getenv("GITHUB_ACTIONS") == "true") { +// val startTrial = find(byXpath("//div[@visible_text='Start trial']")) +// startTrial.click() +// val startTrialFree = find(byXpath("//div[@class='s']")) +// startTrialFree.click() +// val dialog = find(byXpath("//div[@class='MyDialog']")) +// dialog.button("Close").click() +// Thread.sleep(10_000) +// closeBrowser() +// } else { +// val dialog = find(byXpath("//div[@class='MyDialog']")) +// dialog.button("Activate").click() +// dialog.button("Close").click() +// } // end temporary workaround welcomeFrame { From 798f3f5394810b8b726ca0975fb28f7f183ee16f Mon Sep 17 00:00:00 2001 From: Vitaliy Boyrko Date: Fri, 28 Mar 2025 19:20:13 +0200 Subject: [PATCH 28/34] 1211: removed redundant commenting --- .../content/MarkDirectoryAsMagentoRootTest.kt | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index 10fcd4acc..f97af54ba 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -74,20 +74,20 @@ class MarkDirectoryAsMagentoRootTest { @Video fun testMarkDirectoryAsMagentoRoot(remoteRobot: RemoteRobot) = with(remoteRobot) { // temporary workaround until we get license for CI -// if (System.getenv("GITHUB_ACTIONS") == "true") { -// val startTrial = find(byXpath("//div[@visible_text='Start trial']")) -// startTrial.click() -// val startTrialFree = find(byXpath("//div[@class='s']")) -// startTrialFree.click() -// val dialog = find(byXpath("//div[@class='MyDialog']")) -// dialog.button("Close").click() -// Thread.sleep(10_000) -// closeBrowser() -// } else { -// val dialog = find(byXpath("//div[@class='MyDialog']")) -// dialog.button("Activate").click() -// dialog.button("Close").click() -// } + if (System.getenv("GITHUB_ACTIONS") == "true") { + val startTrial = find(byXpath("//div[@visible_text='Start trial']")) + startTrial.click() + val startTrialFree = find(byXpath("//div[@class='s']")) + startTrialFree.click() + val dialog = find(byXpath("//div[@class='MyDialog']")) + dialog.button("Close").click() + Thread.sleep(10_000) + closeBrowser() + } else { + val dialog = find(byXpath("//div[@class='MyDialog']")) + dialog.button("Activate").click() + dialog.button("Close").click() + } // end temporary workaround welcomeFrame { From 500c52175b3a228c5f8479da3e5b46118bca0484 Mon Sep 17 00:00:00 2001 From: Vitaliy Boyrko Date: Sat, 29 Mar 2025 16:10:30 +0200 Subject: [PATCH 29/34] Restored legacy tests --- .github/workflows/gradle.yml | 127 +++---- .github/workflows/uitests.yml | 85 +++++ build.gradle.kts | 15 +- .../magento2plugin/BaseProjectTestCase.java | 88 +++++ .../generator/AclXmlGeneratorTest.java | 93 +++++ .../ArgumentInjectionGeneratorTest.java | 338 ++++++++++++++++++ .../generator/BaseGeneratorTestCase.java | 70 ++++ .../CLICommandClassGeneratorTest.java | 45 +++ .../CLICommandDiXmlGeneratorTest.java | 83 +++++ ...ributePropertySetupPatchGeneratorTest.java | 94 +++++ .../generator/CronjobClassGeneratorTest.java | 29 ++ .../generator/CrontabXmlGeneratorTest.java | 140 ++++++++ ...tomerAttributeSetupPatchGeneratorTest.java | 63 ++++ .../generator/DataModelGeneratorTest.java | 70 ++++ .../DataModelInterfaceGeneratorTest.java | 36 ++ .../DataProviderDeclarationGeneratorTest.java | 53 +++ .../DbSchemaWhitelistGeneratorTest.java | 146 ++++++++ .../generator/DbSchemaXmlGeneratorTest.java | 188 ++++++++++ .../DeleteEntityCommandGeneratorTest.java | 65 ++++ .../generator/DeleteEntityGeneratorTest.java | 62 ++++ .../EditEntityActionGeneratorTest.java | 48 +++ .../EntityDataMapperClassGeneratorTest.java | 49 +++ .../FormButtonBlockGeneratorTest.java | 189 ++++++++++ .../FormGenericButtonBlockGeneratorTest.java | 56 +++ .../GridActionColumnFileGeneratorTest.java | 53 +++ .../IndexControllerGeneratorTest.java | 39 ++ .../generator/LayoutXmlGeneratorTest.java | 45 +++ .../generator/MenuXmlGeneratorTest.java | 54 +++ .../MessageQueueClassGeneratorTest.java | 87 +++++ .../ModuleBlockClassGeneratorTest.java | 33 ++ .../ModuleCollectionGeneratorTest.java | 64 ++++ .../ModuleComposerJsonGeneratorTest.java | 118 ++++++ .../ModuleControllerClassGeneratorTest.java | 102 ++++++ .../ModuleCronGroupXmlGeneratorTest.java | 138 +++++++ .../ModuleEmailTemplateHtmlGeneratorTest.java | 110 ++++++ .../ModuleEmailTemplatesXmlGeneratorTest.java | 116 ++++++ ...duleGraphQlResolverClassGeneratorTest.java | 38 ++ .../generator/ModuleModelGeneratorTest.java | 62 ++++ .../ModuleObserverGeneratorTest.java | 41 +++ .../ModuleReadmeMdGeneratorTest.java | 36 ++ .../ModuleRegistrationPhpGeneratorTest.java | 69 ++++ .../ModuleResourceModelGeneratorTest.java | 81 +++++ .../ModuleSetupDataPatchGeneratorTest.java | 40 +++ .../ModuleViewModelClassGeneratorTest.java | 37 ++ ...oduleXmlGeneratorHaveSetupVersionTest.java | 44 +++ .../generator/ModuleXmlGeneratorTest.java | 80 +++++ .../NewActionEntityGeneratorTest.java | 53 +++ .../NewEntityLayoutGeneratorTest.java | 46 +++ .../generator/ObserverClassGeneratorTest.java | 39 ++ .../ObserverEventsXmlGeneratorTest.java | 117 ++++++ .../generator/PluginClassGeneratorTest.java | 76 ++++ .../generator/PluginDiXmlGeneratorTest.java | 189 ++++++++++ .../PreferenceClassGeneratorTest.java | 127 +++++++ .../PreferenceDiXmlGeneratorTest.java | 138 +++++++ ...ributePropertySetupPatchGeneratorTest.java | 215 +++++++++++ .../generator/QueryModelGeneratorTest.java | 46 +++ .../QueueCommunicationGeneratorTest.java | 44 +++ .../generator/QueueConsumerGeneratorTest.java | 74 ++++ .../QueuePublisherGeneratorTest.java | 42 +++ .../generator/QueueTopologyGeneratorTest.java | 46 +++ .../generator/RoutesXmlGeneratorTest.java | 40 +++ .../SaveEntityActionGeneratorTest.java | 90 +++++ .../SaveEntityCommandGeneratorTest.java | 54 +++ .../SearchResultsFilesGeneratorTest.java | 102 ++++++ .../generator/SourceModelGeneratorTest.java | 61 ++++ .../UiComponentFormGeneratorTest.java | 173 +++++++++ ...omponentGridDataProviderGeneratorTest.java | 107 ++++++ .../UiComponentGridXmlGeneratorTest.java | 163 +++++++++ .../WebApiInterfaceGeneratorTest.java | 265 ++++++++++++++ .../WebApiXmlDeclarationGeneratorTest.java | 53 +++ .../pool/NewEntityGeneratorPoolTest.java | 133 +++++++ .../DbSchemaGeneratorDataProviderUtil.java | 51 +++ .../completion/BaseCompletionTestCase.java | 128 +++++++ .../php/CompletionPhpFixtureTestCase.java | 18 + ...onfigPhpModuleCompletionRegistrarTest.java | 33 ++ ...ackendModelXmlCompletionRegistrarTest.java | 115 ++++++ .../xml/CompletionXmlFixtureTestCase.java | 18 + ...figurationTypeCompletionRegistrarTest.java | 21 ++ ...ructorArgumentCompletionRegistrarTest.java | 21 ++ .../xml/CrontabCompletionRegistrarTest.java | 68 ++++ .../LayoutBlockCompletionRegistrarTest.java | 20 ++ ...ayoutContainerCompletionRegistrarTest.java | 26 ++ ...outUIComponentCompletionRegistrarTest.java | 24 ++ ...utUpdateHandleCompletionRegistrarTest.java | 24 ++ .../xml/MenuCompletionRegistrarTest.java | 26 ++ ...MftfEntityNameCompletionRegistrarTest.java | 106 ++++++ .../xml/MftfNameCompletionRegistrarTest.java | 41 +++ .../MftfPageUrlCompletionRegistrarTest.java | 68 ++++ .../MftfSelectorCompletionRegistrarTest.java | 52 +++ .../ModuleNameCompletionRegistrarTest.java | 33 ++ .../xml/ObserverCompletionRegistrarTest.java | 38 ++ ...PhpClassMemberCompletionRegistrarTest.java | 21 ++ ...pServiceMethodCompletionRegistrarTest.java | 19 + .../PluginTypeCompletionRegistrarTest.java | 22 ++ .../xml/RequireJsCompletionRegistrarTest.java | 46 +++ ...SourceModelXmlCompletionRegistrarTest.java | 82 +++++ ...ystemConfigurationPathsCompletionTest.java | 66 ++++ ...eAndColumnNameCompletionRegistrarTest.java | 60 ++++ ...ponentTemplateCompletionRegistrarTest.java | 28 ++ .../inspections/BaseInspectionsTestCase.java | 52 +++ .../InspectionGraphqlsFixtureTestCase.java | 35 ++ .../SchemaResolverInspectionTest.java | 59 +++ .../php/GraphQlResolverInspectionTest.java | 47 +++ .../php/InspectionPhpFixtureTestCase.java | 35 ++ ...rationInRegistrationPhpInspectionTest.java | 85 +++++ .../inspections/php/PluginInspectionTest.java | 64 ++++ .../xml/AclResourceXmlInspectionTest.java | 64 ++++ ...bleFalseInDefaultLayoutInspectionTest.java | 33 ++ .../xml/InspectionXmlFixtureTestCase.java | 34 ++ ...eDeclarationInModuleXmlInspectionTest.java | 131 +++++++ .../xml/ModuleScopeInspectionTest.java | 50 +++ .../ObserverDeclarationInspectionTest.java | 42 +++ .../PluginAttributeTypeInspectionTest.java | 89 +++++ .../xml/PluginDeclarationInspectionTest.java | 129 +++++++ .../PreferenceDeclarationInspectionTest.java | 150 ++++++++ ...peConfigurationTagTypesInspectionTest.java | 130 +++++++ .../xml/WebApiServiceInspectionTest.java | 126 +++++++ .../linemarker/LinemarkerFixtureTestCase.java | 82 +++++ ...lResolverClassLinemarkerRegistrarTest.java | 20 ++ ...ationTypeClassLinemarkerRegistrarTest.java | 29 ++ ...lResolverUsageLinemarkerRegistrarTest.java | 29 ++ .../ObserverClassLinemarkerRegistrarTest.java | 29 ++ .../php/PluginLinemarkerRegistrarTest.java | 29 ++ .../PluginTargetLinemarkerRegistrarTest.java | 42 +++ .../TestFixtureLinemarkerRegistrarTest.java | 29 ++ .../php/WebApiLinemarkerRegistrarTest.java | 82 +++++ .../reference/BaseReferenceTestCase.java | 298 +++++++++++++++ .../js/ReferenceJsFixtureTestCase.java | 17 + .../js/RequireJsReferenceRegistrarTest.java | 62 ++++ ...ConfigPhpModuleReferenceRegistrarTest.java | 27 ++ ...erDispatchEventReferenceRegistrarTest.java | 15 + .../php/ReferencePhpFixtureTestCase.java | 17 + ...nfigurationTypeReferenceRegistrarTest.java | 17 + ...tructorArgumentReferenceRegistrarTest.java | 31 ++ .../xml/CrontabReferenceRegistrarTest.java | 43 +++ .../DisabledPluginReferenceRegistrarTest.java | 20 ++ .../LayoutBlockReferenceRegistrarTest.java | 17 + ...LayoutContainerReferenceRegistrarTest.java | 22 ++ ...youtUIComponentReferenceRegistrarTest.java | 18 + ...outUpdateHandleReferenceRegistrarTest.java | 22 ++ .../xml/MenuReferenceRegistrarTest.java | 22 ++ .../MftfEntityNameReferenceRegistrarTest.java | 101 ++++++ .../xml/MftfNameReferenceRegistrarTest.java | 22 ++ .../MftfPageUrlReferenceRegistrarTest.java | 73 ++++ .../MftfSelectorReferenceRegistrarTest.java | 36 ++ .../xml/ModuleNameReferenceRegistrarTest.java | 27 ++ .../xml/ObserverReferenceRegistrarTest.java | 56 +++ .../xml/PluginTypeReferenceRegistrarTest.java | 22 ++ .../xml/ReferenceXmlFixtureTestCase.java | 17 + .../xml/RequireJsReferenceRegistrarTest.java | 36 ++ ...leNameAndColumnReferenceRegistrarTest.java | 69 ++++ ...mponentTemplateReferenceRegistrarTest.java | 15 + .../WebApiMethodReferenceRegistrarTest.java | 30 ++ .../content/MarkDirectoryAsMagentoRootTest.kt | 4 +- 154 files changed, 10305 insertions(+), 64 deletions(-) create mode 100644 .github/workflows/uitests.yml create mode 100644 src/test/java/com/magento/idea/magento2plugin/BaseProjectTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/AclXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ArgumentInjectionGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandDiXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CategoryAttributePropertySetupPatchGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CronjobClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CrontabXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CustomerAttributeSetupPatchGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelInterfaceGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataProviderDeclarationGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaWhitelistGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityCommandGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EditEntityActionGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EntityDataMapperClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormButtonBlockGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormGenericButtonBlockGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/GridActionColumnFileGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/IndexControllerGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/LayoutXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MenuXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MessageQueueClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleBlockClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCronGroupXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplateHtmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplatesXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleGraphQlResolverClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleObserverGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleRegistrationPhpGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleSetupDataPatchGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleViewModelClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorHaveSetupVersionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewActionEntityGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewEntityLayoutGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverEventsXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginDiXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceClassGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceDiXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ProductAttributePropertySetupPatchGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueryModelGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueCommunicationGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueConsumerGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueuePublisherGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueTopologyGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/RoutesXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityActionGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityCommandGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SearchResultsFilesGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SourceModelGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentFormGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridDataProviderGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridXmlGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiInterfaceGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiXmlDeclarationGeneratorTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/pool/NewEntityGeneratorPoolTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DbSchemaGeneratorDataProviderUtil.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/BaseCompletionTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/php/CompletionPhpFixtureTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/php/ConfigPhpModuleCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/BackendModelXmlCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/CompletionXmlFixtureTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/ConfigurationTypeCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/ConstructorArgumentCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/CrontabCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutBlockCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutContainerCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUIComponentCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUpdateHandleCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/MenuCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfEntityNameCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfNameCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfPageUrlCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfSelectorCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/ModuleNameCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/ObserverCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpClassMemberCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpServiceMethodCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/PluginTypeCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/RequireJsCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/SourceModelXmlCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/SystemConfigurationPathsCompletionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/TableAndColumnNameCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/completion/xml/UiComponentTemplateCompletionRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/BaseInspectionsTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/InspectionGraphqlsFixtureTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/SchemaResolverInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/php/GraphQlResolverInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/php/InspectionPhpFixtureTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/php/ModuleDeclarationInRegistrationPhpInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/php/PluginInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/AclResourceXmlInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/CacheableFalseInDefaultLayoutInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/InspectionXmlFixtureTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleDeclarationInModuleXmlInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleScopeInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/ObserverDeclarationInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginAttributeTypeInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginDeclarationInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/PreferenceDeclarationInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/TypeConfigurationTagTypesInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/inspections/xml/WebApiServiceInspectionTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/LinemarkerFixtureTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/graphqls/GraphQlResolverClassLinemarkerRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/ConfigurationTypeClassLinemarkerRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/GraphQlResolverUsageLinemarkerRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/ObserverClassLinemarkerRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginLinemarkerRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLinemarkerRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLinemarkerRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/linemarker/php/WebApiLinemarkerRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/BaseReferenceTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/js/ReferenceJsFixtureTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/js/RequireJsReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/php/ConfigPhpModuleReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/php/ObserverDispatchEventReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/php/ReferencePhpFixtureTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/ConfigurationTypeReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/ConstructorArgumentReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/CrontabReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/DisabledPluginReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutBlockReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutContainerReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUIComponentReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUpdateHandleReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/MenuReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfEntityNameReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfNameReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfPageUrlReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfSelectorReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/ModuleNameReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/ObserverReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/PluginTypeReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/ReferenceXmlFixtureTestCase.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/RequireJsReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/TableNameAndColumnReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/UiComponentTemplateReferenceRegistrarTest.java create mode 100644 src/test/java/com/magento/idea/magento2plugin/reference/xml/WebApiMethodReferenceRegistrarTest.java rename src/test/kotlin/com/magento/idea/magento2plugin/{actions => userInterface}/content/MarkDirectoryAsMagentoRootTest.kt (99%) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 36264b784..4426cb199 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -8,76 +8,83 @@ on: branches: [ master, '*-develop', 'mainline*' ] jobs: - - testUI: - runs-on: ${{ matrix.os }} - strategy: - fail-fast: false - matrix: - include: - - os: ubuntu-latest - runIde: | - export DISPLAY=:99.0 - Xvfb -ac :99 -screen 0 1920x1080x24 & - sleep 10 - ./gradlew runIdeForUiTests & - - os: windows-latest - runIde: start gradlew.bat runIdeForUiTests - - os: macos-latest - runIde: ./gradlew runIdeForUiTests & + build-linux: + runs-on: ubuntu-latest steps: - - # Check out the current repository - - name: Fetch Sources - uses: actions/checkout@v4 - - # Set up Java environment for the next steps - - name: Setup Java - uses: actions/setup-java@v4 + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 with: - distribution: zulu java-version: 17 - - # Setup Gradle - - name: Setup Gradle - uses: gradle/actions/setup-gradle@v4 - - # Run IDEA prepared for UI testing - - name: Run IDE - run: ${{ matrix.runIde }} - - # Wait for IDEA to be started - - name: Health Check - uses: jtalk/url-health-check-action@v4 + distribution: 'temurin' + cache: gradle + - uses: actions/cache@v3 with: - url: http://127.0.0.1:8082 - max-attempts: 15 - retry-delay: 30s + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} + restore-keys: | + ${{ runner.os }}-gradle- + - name: Gradle wrapper + run: gradle wrapper + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Run automated tests + run: ./gradlew legacyTests --no-daemon - # Run tests - - name: Tests - if: matrix.os != 'ubuntu-latest' - run: ./gradlew test + build-windows: + runs-on: windows-latest - - name: Tests Ubuntu - if: matrix.os == 'ubuntu-latest' - run: | - export DISPLAY=:99.0 - ./gradlew test + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: 17 + distribution: 'temurin' + cache: gradle + - uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} + restore-keys: | + ${{ runner.os }}-gradle- + - name: Gradle wrapper + run: gradle wrapper + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Run automated tests + run: ./gradlew legacyTests --no-daemon - - name: Capture Test Artifacts on Failure - if: failure() && matrix.os == 'windows-latest' - run: tar -cvzf video.tgz ./video - shell: bash + build-macos: + runs-on: macos-latest - - name: Upload Test Video Artifact - if: failure() && matrix.os == 'windows-latest' - uses: actions/upload-artifact@v4 + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 with: - name: latest-test-video - path: video.tgz - overwrite: true + java-version: 17 + distribution: 'temurin' + cache: gradle + - uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }} + restore-keys: | + ${{ runner.os }}-gradle- + - name: Gradle wrapper + run: gradle wrapper + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Run automated tests + run: ./gradlew legacyTests --no-daemon static-tests: runs-on: ubuntu-latest diff --git a/.github/workflows/uitests.yml b/.github/workflows/uitests.yml new file mode 100644 index 000000000..3ae414585 --- /dev/null +++ b/.github/workflows/uitests.yml @@ -0,0 +1,85 @@ +# This workflow will build a Java project with Gradle +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle + +name: Run automated tests + +on: + pull_request: + branches: [ master, '*-develop', 'mainline*' ] + +jobs: + + testUI: + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + runIde: | + export DISPLAY=:99.0 + Xvfb -ac :99 -screen 0 1920x1080x24 & + sleep 10 + ./gradlew runIdeForUiTests & +# TODO: fix for windows is needed, currently Gradle can't process .form files for windows + +# - os: windows-latest +# runIde: start gradlew.bat runIdeForUiTests +# - os: macos-latest +# runIde: ./gradlew runIdeForUiTests & + + steps: + + # Check out the current repository + - name: Fetch Sources + uses: actions/checkout@v4 + + # Set up Java environment for the next steps + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: zulu + java-version: 17 + + # Setup Gradle + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + # Run IDEA prepared for UI testing + - name: Run IDE + run: ${{ matrix.runIde }} + + # Wait for IDEA to be started + - name: Health Check + uses: jtalk/url-health-check-action@v4 + with: + url: http://127.0.0.1:8082 + max-attempts: 15 + retry-delay: 30s + + # Run tests + - name: Tests + if: matrix.os != 'ubuntu-latest' + run: ./gradlew uiTests + + - name: Tests Ubuntu + if: matrix.os == 'ubuntu-latest' + run: | + export DISPLAY=:99.0 + ./gradlew uiTests + +# Uncomment if investigation is needed: + +# - name: Capture Test Artifacts on Failure +# if: failure() && matrix.os == 'windows-latest' +# run: tar -cvzf video.tgz ./video +# shell: bash +# +# - name: Upload Test Video Artifact +# if: failure() && matrix.os == 'windows-latest' +# uses: actions/upload-artifact@v4 +# with: +# name: latest-test-video +# path: video.tgz +# overwrite: true + diff --git a/build.gradle.kts b/build.gradle.kts index c56d64110..5adf59301 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,8 +39,7 @@ dependencies { testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.10.0") testImplementation("org.junit.vintage:junit-vintage-engine:5.10.0") - - implementation ("org.json:json:20171018") + implementation("org.json:json:20171018") implementation("org.codehaus.plexus:plexus-utils:3.4.0") testImplementation("com.automation-remarks:video-recorder-junit5:2.0") testImplementation("com.intellij.remoterobot:remote-robot:0.11.23") @@ -247,3 +246,15 @@ kover { } } } + +tasks.register("legacyTests") { + exclude("**/userInterface/**") +} + +tasks.register("uiTests") { + exclude("**/reference/**") + exclude("**/linemarker/**") + exclude("**/inspections/**") + exclude("**/completion/**") + exclude("**/actions/**") // Deprecated, all actions should be reimplemented in the UI tests and this exclude should be removed +} diff --git a/src/test/java/com/magento/idea/magento2plugin/BaseProjectTestCase.java b/src/test/java/com/magento/idea/magento2plugin/BaseProjectTestCase.java new file mode 100644 index 000000000..427237113 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/BaseProjectTestCase.java @@ -0,0 +1,88 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin; + +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.testFramework.IndexingTestUtil; +import com.intellij.testFramework.PlatformTestUtil; +import com.intellij.testFramework.fixtures.BasePlatformTestCase; +import com.magento.idea.magento2plugin.indexes.IndexManager; +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.project.Settings; + +/** + * Configure test environment with Magento 2 project. + */ +public abstract class BaseProjectTestCase extends BasePlatformTestCase { + private static final String testDataProjectPath = "testData" //NOPMD + + File.separator + + "project"; + + private static final String testDataProjectDirectory = "magento2"; //NOPMD + + @Override + public void setUp() throws Exception { + super.setUp(); + copyMagento2ToTestProject(); + enablePluginAndReindex(); + } + + private void copyMagento2ToTestProject() { + myFixture.setTestDataPath(testDataProjectPath); + myFixture.copyDirectoryToProject( + testDataProjectDirectory, + "" + ); + } + + @Override + protected String getTestDataPath() { + //configure specific test data in your test. + return "testData"; + } + + protected void enablePluginAndReindex() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.magentoPath = "/src"; + settings.pluginEnabled = true; + settings.mftfSupportEnabled = true; + IndexManager.manualReindex(); + PlatformTestUtil.dispatchAllEventsInIdeEventQueue(); + IndexingTestUtil.waitUntilIndexesAreReady(myFixture.getProject()); + } + + protected void disablePluginAndReindex() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.pluginEnabled = false; + IndexManager.manualReindex(); + PlatformTestUtil.dispatchAllEventsInIdeEventQueue(); + IndexingTestUtil.waitUntilIndexesAreReady(myFixture.getProject()); + } + + protected void disableMftfSupportAndReindex() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.mftfSupportEnabled = false; + IndexManager.manualReindex(); + PlatformTestUtil.dispatchAllEventsInIdeEventQueue(); + IndexingTestUtil.waitUntilIndexesAreReady(myFixture.getProject()); + } + + protected String prepareFixturePath( + final String fileName, + final String fixturesFolderPath + ) { + return fixturesFolderPath + getClass().getSimpleName().replace("Test", "") + + File.separator + + name() + + File.separator + + fileName; + } + + private String name() { + return StringUtil.trimEnd(getTestName(true), "Test"); + } + +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/AclXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/AclXmlGeneratorTest.java new file mode 100644 index 000000000..b905ff571 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/AclXmlGeneratorTest.java @@ -0,0 +1,93 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.AclXmlData; +import com.magento.idea.magento2plugin.magento.files.ModuleAclXml; + +public class AclXmlGeneratorTest extends BaseGeneratorTestCase { + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String CONFIG_ACL_ID = "Magento_Config::config"; + private static final String FOO_BAR_MANAGE_ACL_ID = "Foo_Bar::manage"; + private static final String FOO_BAR_MANAGE_ACL_TITLE = "Bar Management"; + + /** + * Test checks whether acl.xml file generated correctly. + */ + public void testGenerateAclXmlFile() { + final String filePath = this.getFixturePath(ModuleAclXml.FILE_NAME); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + generateAclXmlFile( + CONFIG_ACL_ID, + FOO_BAR_MANAGE_ACL_ID, + FOO_BAR_MANAGE_ACL_TITLE + ) + ); + } + + /** + * Test checks whether acl.xml file generated correctly + * for non existed parent. + */ + public void testGenerateAclXmlFileForNonExistedParent() { + final String filePath = this.getFixturePath(ModuleAclXml.FILE_NAME); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + generateAclXmlFile( + "Non_Existed::test", + "Foo_Bar::test", + "Non Existed Test" + ) + ); + } + + /** + * Test adding new acl rule to existing acl.xml file. + */ + public void testGetAclXmlFileAndGenerateNewAcl() { + final String filePath = this.getFixturePath(ModuleAclXml.FILE_NAME); + generateAclXmlFile(CONFIG_ACL_ID, FOO_BAR_MANAGE_ACL_ID, FOO_BAR_MANAGE_ACL_TITLE); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + generateAclXmlFile( + FOO_BAR_MANAGE_ACL_ID, + "Foo_Bar::manage_save", + "Save" + ) + ); + } + + /** + * Generate ACL XML file. + * + * @param parentResourceId String + * @param resourceId String + * @param resourceTitle String + * + * @return PsiFile + */ + private PsiFile generateAclXmlFile( + final String parentResourceId, + final String resourceId, + final String resourceTitle + ) { + final AclXmlGenerator aclXmlGenerator = new AclXmlGenerator( + new AclXmlData(parentResourceId, resourceId, resourceTitle), + MODULE_NAME, + myFixture.getProject() + ); + return aclXmlGenerator.generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ArgumentInjectionGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ArgumentInjectionGeneratorTest.java new file mode 100644 index 000000000..496a86f5d --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ArgumentInjectionGeneratorTest.java @@ -0,0 +1,338 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.xml.DiArgumentData; +import com.magento.idea.magento2plugin.actions.generation.data.xml.DiArrayValueData; +import com.magento.idea.magento2plugin.actions.generation.generator.code.ArgumentInjectionGenerator; +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; +import com.magento.idea.magento2plugin.magento.packages.Areas; +import com.magento.idea.magento2plugin.magento.packages.DiArgumentType; +import java.util.ArrayList; +import java.util.List; + +@SuppressWarnings("PMD.TooManyMethods") +public class ArgumentInjectionGeneratorTest extends BaseGeneratorTestCase { + + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc/frontend"; + private static final String EXPECTED_DIR_FOR_REPLACING = "src/app/code/Foo/Bar/etc/crontab"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String TARGET_CLASS = "Foo\\Bar\\Model\\Test"; + private static final String STRING_PARAMETER = "name"; + private static final String STRING_VALUE = "test"; + private static final String BOOL_PARAMETER = "isEmpty"; + private static final String BOOL_VALUE = "false"; + private static final String NUMBER_PARAMETER = "age"; + private static final String NUMBER_VALUE = "12"; + private static final String INIT_PARAM_PARAMETER = "defaultArea"; + private static final String INIT_PARAM_VALUE = "Foo\\Bar\\Model\\AreaTest::DEFAULT_AREA"; + private static final String CONST_PARAMETER = "defaultService"; + private static final String CONST_VALUE = "Foo\\Bar\\Model\\ServiceTest::DEFAULT_SERVICE"; + private static final String NULL_PARAMETER = "object"; + private static final String NULL_VALUE = ""; + private static final String OBJECT_PARAMETER = "object"; + private static final String OBJECT_VALUE = "Foo\\Bar\\Model\\Service"; + private static final String ARRAY_PARAMETER = "methods"; + private static final Areas TEST_AREA = Areas.frontend; + + /** + * Tested string value injection. + */ + public void testInjectStringValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIRECTORY, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + STRING_PARAMETER, + TEST_AREA, + DiArgumentType.STRING, + STRING_VALUE + ) + ) + ); + } + + /** + * Tested boolean value injection. + */ + public void testInjectBooleanValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIRECTORY, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + BOOL_PARAMETER, + TEST_AREA, + DiArgumentType.BOOLEAN, + BOOL_VALUE + ) + ) + ); + } + + /** + * Tested number value injection. + */ + public void testInjectNumberValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIRECTORY, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + NUMBER_PARAMETER, + TEST_AREA, + DiArgumentType.NUMBER, + NUMBER_VALUE + ) + ) + ); + } + + /** + * Tested init_parameter value injection. + */ + public void testInjectInitParameterValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIRECTORY, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + INIT_PARAM_PARAMETER, + TEST_AREA, + DiArgumentType.INIT_PARAMETER, + INIT_PARAM_VALUE + ) + ) + ); + } + + /** + * Tested constant value injection. + */ + public void testInjectConstValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIRECTORY, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + CONST_PARAMETER, + TEST_AREA, + DiArgumentType.CONST, + CONST_VALUE + ) + ) + ); + } + + /** + * Tested null value injection. + */ + public void testInjectNullValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIRECTORY, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + NULL_PARAMETER, + TEST_AREA, + DiArgumentType.NULL, + NULL_VALUE + ) + ) + ); + } + + /** + * Tested object value injection. + */ + public void testInjectObjectValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIRECTORY, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + OBJECT_PARAMETER, + TEST_AREA, + DiArgumentType.OBJECT, + OBJECT_VALUE + ) + ) + ); + } + + /** + * Tested array value injection. + */ + public void testInjectArrayValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIRECTORY, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + ARRAY_PARAMETER, + TEST_AREA, + DiArgumentType.ARRAY, + getArrayValue() + ) + ) + ); + } + + /** + * Tested nested array value injection. + */ + public void testInjectNestedArrayValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIRECTORY, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + ARRAY_PARAMETER, + TEST_AREA, + DiArgumentType.ARRAY, + getNestedArrayValue() + ) + ) + ); + } + + /** + * Tested object value replacing with the null value injection. + */ + public void testReplaceObjectValueWithNullValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIR_FOR_REPLACING, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + OBJECT_PARAMETER, + Areas.crontab, + DiArgumentType.NULL, + NULL_VALUE + ) + ) + ); + } + + /** + * Tested object value replacing with the object proxy value injection. + */ + public void testReplaceObjectValueWithProxyValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIR_FOR_REPLACING, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + OBJECT_PARAMETER, + Areas.crontab, + DiArgumentType.OBJECT, + OBJECT_VALUE + "\\Proxy" + ) + ) + ); + } + + /** + * Tested object value replacing with the object factory value injection. + */ + public void testReplaceObjectValueWithFactoryValue() { + assertGeneratedFileIsCorrect( + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)), + EXPECTED_DIR_FOR_REPLACING, + injectConstructorArgument( + new DiArgumentData( + MODULE_NAME, + TARGET_CLASS, + OBJECT_PARAMETER, + Areas.crontab, + DiArgumentType.OBJECT, + OBJECT_VALUE + "Factory" + ) + ) + ); + } + + private PsiFile injectConstructorArgument( + final DiArgumentData data + ) { + final ArgumentInjectionGenerator generator = new ArgumentInjectionGenerator( + data, + myFixture.getProject() + ); + + return generator.generate("test"); + } + + private String getArrayValue() { + final List items = new ArrayList<>(); + items.add(new DiArrayValueData.DiArrayItemData("method1", DiArgumentType.STRING, "QW1")); + items.add(new DiArrayValueData.DiArrayItemData("method2", DiArgumentType.STRING, "QW2")); + items.add(new DiArrayValueData.DiArrayItemData("method3", DiArgumentType.STRING, "QW3")); + items.add(new DiArrayValueData.DiArrayItemData("method4", DiArgumentType.STRING, "QW4")); + items.add(new DiArrayValueData.DiArrayItemData("method5", DiArgumentType.STRING, "QW5")); + final DiArrayValueData arrayValueData = new DiArrayValueData(); + arrayValueData.setItems(items); + + return arrayValueData.convertToXml(arrayValueData); + } + + private String getNestedArrayValue() { + final List items = new ArrayList<>(); + items.add(new DiArrayValueData.DiArrayItemData("method1", DiArgumentType.STRING, "QW1")); + items.add(new DiArrayValueData.DiArrayItemData("method2", DiArgumentType.STRING, "QW2")); + items.add(new DiArrayValueData.DiArrayItemData("method3", DiArgumentType.STRING, "QW3")); + items.add(new DiArrayValueData.DiArrayItemData("method4", DiArgumentType.STRING, "QW4")); + final DiArrayValueData.DiArrayItemData nestedItem = new DiArrayValueData.DiArrayItemData( + "nested", + DiArgumentType.ARRAY, + "" + ); + + final DiArrayValueData nestedItemsHolder = new DiArrayValueData(); + final List nestedItems = new ArrayList<>(); + nestedItems.add( + new DiArrayValueData.DiArrayItemData("nested1", DiArgumentType.STRING, "NT1") + ); + nestedItems.add( + new DiArrayValueData.DiArrayItemData("nested2", DiArgumentType.BOOLEAN, "true") + ); + nestedItems.add( + new DiArrayValueData.DiArrayItemData("nested3", DiArgumentType.NULL, "") + ); + nestedItemsHolder.setItems(nestedItems); + nestedItem.setChildren(nestedItemsHolder); + items.add(nestedItem); + + final DiArrayValueData arrayValueData = new DiArrayValueData(); + arrayValueData.setItems(items); + + return arrayValueData.convertToXml(arrayValueData); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java new file mode 100644 index 000000000..4ed4691ae --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/BaseGeneratorTestCase.java @@ -0,0 +1,70 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; +import com.intellij.testFramework.LightPlatformTestCase; +import com.magento.idea.magento2plugin.BaseProjectTestCase; +import com.magento.idea.magento2plugin.actions.generation.generator.util.DefaultCodeStyleSettingsAdjustmentsUtil; +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.project.util.GetProjectBasePath; +import org.junit.After; +import org.junit.Before; + +public abstract class BaseGeneratorTestCase extends BaseProjectTestCase { + private static final String TEST_DATA_FOLDER_PATH = "testData" + File.separator + + "actions" + File.separator; + private static final String FIXTURES_FOLDER_PATH = "generation" + File.separator + + "generator" + File.separator; + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + myFixture.setTestDataPath(TEST_DATA_FOLDER_PATH); + // Reset changed default code style settings to the previous default settings. + DefaultCodeStyleSettingsAdjustmentsUtil.execute(myFixture.getProject()); + } + + @Override + @After + public void tearDown() throws Exception { + super.tearDown(); + LightPlatformTestCase.closeAndDeleteProject(); + } + + protected String getFixturePath(final String fileName) { + return prepareFixturePath(fileName, FIXTURES_FOLDER_PATH); + } + + @SuppressWarnings({"PMD.JUnitAssertionsShouldIncludeMessage"}) + protected void assertGeneratedFileIsCorrect( + final PsiFile expectedFile, + final String expectedDirectory, + final PsiFile resultFile + ) { + assertTrue(resultFile.getContainingDirectory().getVirtualFile().getPath() + .endsWith(expectedDirectory)); + assertEquals(expectedFile.getText(), resultFile.getText()); + assertEquals(expectedFile.getName(), resultFile.getName()); + } + + @SuppressWarnings({"PMD.JUnitAssertionsShouldIncludeMessage"}) + protected void assertGeneratedFileIsCorrect( + final PsiFile expectedFile, + final PsiFile resultFile + ) { + assertEquals(expectedFile.getText(), resultFile.getText()); + assertEquals(expectedFile.getName(), resultFile.getName()); + } + + protected PsiDirectory getProjectDirectory() { + return myFixture.getPsiManager().findDirectory( + GetProjectBasePath.execute(myFixture.getProject()) + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandClassGeneratorTest.java new file mode 100644 index 000000000..a3e398791 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandClassGeneratorTest.java @@ -0,0 +1,45 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.CLICommandClassData; + +public class CLICommandClassGeneratorTest extends BaseGeneratorTestCase { + private static final String CLASS_NAME = "TestCLICommandPHPClass"; + private static final String PARENT_DIRECTORY = "Console/Command"; + private static final String COMMAND_NAME = "bar:test-command"; + private static final String DESCRIPTION = "This is the test command"; + private static final String NAMESPACE = "Foo\\Bar\\Console\\Command"; + private static final String MODULE_NAME = "Foo_Bar"; + + /** + * Test generation of the new CLI command class. + */ + public void testGenerateCLICommandClass() { + final Project project = myFixture.getProject(); + final CLICommandClassData classData = new CLICommandClassData( + CLASS_NAME, + PARENT_DIRECTORY, + COMMAND_NAME, + DESCRIPTION, + NAMESPACE, + MODULE_NAME + ); + final CLICommandClassGenerator generator = new CLICommandClassGenerator(project, classData); + final PsiFile cliCommandClass = generator.generate("test"); + + final String filePath = this.getFixturePath(CLASS_NAME.concat(".php")); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Console/Command", + cliCommandClass + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandDiXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandDiXmlGeneratorTest.java new file mode 100644 index 000000000..6c0c281e7 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CLICommandDiXmlGeneratorTest.java @@ -0,0 +1,83 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.CLICommandXmlData; +import com.magento.idea.magento2plugin.actions.generation.generator.util.NamespaceBuilder; +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; +import com.magento.idea.magento2plugin.magento.packages.Package; +import com.magento.idea.magento2plugin.util.CamelCaseToSnakeCase; + +@SuppressWarnings({ + "PMD.FieldNamingConventions", + "PMD.LongVariable", + "PMD.CommentSize" +}) +public class CLICommandDiXmlGeneratorTest extends BaseGeneratorTestCase { + private static final String CLASS_NAME = "TestCommand"; + private static final String SECOND_CLASS_NAME = "OneMoreCLICommand"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String PARENT_DIR = "Console\\Command"; + private static final String MODULE_DIR = "src/app/code/Foo/Bar/"; + + /** + * Test generation of the di.xml file with the CLI command initialization. + */ + public void testInitializeCLICommand() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiFile diXml = initializeCLICommandInDiXml(CLASS_NAME); + + final String expectedDir = MODULE_DIR + Package.moduleBaseAreaDir; + assertGeneratedFileIsCorrect( + expectedFile, + expectedDir, + diXml + ); + } + + /** + * Test adding one more CLI command to the di.xml with already initialized CLI command. + */ + public void testAddingTwoCLICommandToDiXml() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + initializeCLICommandInDiXml(CLASS_NAME); + final PsiFile diXml = initializeCLICommandInDiXml(SECOND_CLASS_NAME); + + final String expectedDir = MODULE_DIR + Package.moduleBaseAreaDir; + assertGeneratedFileIsCorrect( + expectedFile, + expectedDir, + diXml + ); + } + + private PsiFile initializeCLICommandInDiXml(final String className) { + final NamespaceBuilder classFqn = new NamespaceBuilder(MODULE_NAME, className, PARENT_DIR); + + final String diItemName = new CamelCaseToSnakeCase().convert(className); + final String itemName = MODULE_NAME.toLowerCase(new java.util.Locale("en","EN")) + + "_" + + diItemName; + + final CLICommandXmlData cliCommandDiXmlData = new CLICommandXmlData( + MODULE_NAME, + classFqn.getClassFqn(), + itemName + ); + + final Project project = myFixture.getProject(); + final CLICommandDiXmlGenerator diXmlGenerator = new CLICommandDiXmlGenerator( + project, + cliCommandDiXmlData + ); + + return diXmlGenerator.generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CategoryAttributePropertySetupPatchGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CategoryAttributePropertySetupPatchGeneratorTest.java new file mode 100644 index 000000000..9dcd4093b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CategoryAttributePropertySetupPatchGeneratorTest.java @@ -0,0 +1,94 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + * + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.CategoryEntityData; +import com.magento.idea.magento2plugin.actions.generation.data.CategoryFormXmlData; +import com.magento.idea.magento2plugin.magento.packages.eav.AttributeScope; + +public class CategoryAttributePropertySetupPatchGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + + /** + * Tests the generated patch file. + */ + public void testGenerateFile() { + final Project project = myFixture.getProject(); + + final CategoryEntityData categoryEntityData = new CategoryEntityData(); + categoryEntityData.setCode("test_attribute"); + categoryEntityData.setInput("text"); + categoryEntityData.setVisible(true); + categoryEntityData.setLabel("Test Attribute"); + categoryEntityData.setType("static"); + categoryEntityData.setRequired(false); + categoryEntityData.setGroup("Content"); + categoryEntityData.setSortOrder(10); + categoryEntityData.setScope(AttributeScope.GLOBAL.getScope()); + + categoryEntityData.setDataPatchName("AddTestAttributeCategoryAttribute"); + categoryEntityData.setModuleName(MODULE_NAME); + + + final EavAttributeSetupPatchGenerator setupPatchGenerator = + new EavAttributeSetupPatchGenerator(categoryEntityData, project); + final PsiFile dataPatchFile = setupPatchGenerator.generate("testGenerateFile"); + + final String filePatch = this.getFixturePath("AddTestAttributeCategoryAttribute.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePatch); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Setup/Patch/Data", + dataPatchFile + ); + } + + /** + * Tests the generated form file. + */ + public void testGenerateFormFile() { + final Project project = myFixture.getProject(); + + final CategoryEntityData categoryEntityData = new CategoryEntityData(); + categoryEntityData.setCode("test_attribute"); + categoryEntityData.setInput("text"); + categoryEntityData.setVisible(true); + categoryEntityData.setLabel("Test Attribute"); + categoryEntityData.setType("static"); + categoryEntityData.setRequired(false); + categoryEntityData.setGroup("Content"); + categoryEntityData.setSortOrder(10); + categoryEntityData.setScope(AttributeScope.GLOBAL.getScope()); + + categoryEntityData.setDataPatchName("AddTestAttributeCategoryAttribute"); + categoryEntityData.setModuleName(MODULE_NAME); + + final CategoryFormXmlData categoryFormXmlData = new CategoryFormXmlData( + categoryEntityData.getGroup(), + categoryEntityData.getCode(), + categoryEntityData.getInput(), + categoryEntityData.getSortOrder() + ); + + final CategoryFormXmlGenerator categoryFormXmlGenerator = + new CategoryFormXmlGenerator(categoryFormXmlData, project, MODULE_NAME); + final PsiFile categoryForm = categoryFormXmlGenerator.generate("category_form"); + + final String fileCategoryForm = this.getFixturePath("category_form.xml"); + final PsiFile expectedCategoryFile = myFixture.configureByFile(fileCategoryForm); + + assertGeneratedFileIsCorrect( + expectedCategoryFile, + "src/app/code/Foo/Bar/view/adminhtml/ui_component", + categoryForm + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CronjobClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CronjobClassGeneratorTest.java new file mode 100644 index 000000000..ca9360caa --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CronjobClassGeneratorTest.java @@ -0,0 +1,29 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.CronjobClassData; + +public class CronjobClassGeneratorTest extends BaseGeneratorTestCase { + + public void testGenerateFile() { + String filePath = this.getFixturePath("CleanTableCronjob.php"); + PsiFile expectedFile = myFixture.configureByFile(filePath); + + Project project = myFixture.getProject(); + CronjobClassData cronjobClassData = new CronjobClassData( + "CleanTableCronjob", + "Cron/Test", + "Foo\\Bar\\Cron\\Test", + "Foo_Bar" + ); + CronjobClassGenerator cronjobClassGenerator = new CronjobClassGenerator(project, cronjobClassData); + PsiFile cronJobFile = cronjobClassGenerator.generate("test"); + + assertGeneratedFileIsCorrect(expectedFile, "src/app/code/Foo/Bar/Cron/Test", cronJobFile); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CrontabXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CrontabXmlGeneratorTest.java new file mode 100644 index 000000000..a17976746 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CrontabXmlGeneratorTest.java @@ -0,0 +1,140 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.CrontabXmlData; +import com.magento.idea.magento2plugin.magento.files.CrontabXmlTemplate; + +public class CrontabXmlGeneratorTest extends BaseGeneratorTestCase { + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String DEFAULT_CRON_GROUP = "default"; + private static final String INDEX_CRON_GROUP = "index"; + private static final String CRONJOB_INSTANCE_ONE = "Foo\\Bar\\Cron\\TestOne"; + private static final String CRONJOB_NAME_ONE = "test_cron_job_one"; + private static final String CRONJOB_INSTANCE_TWO = "Foo\\Bar\\Cron\\TestTwo"; + private static final String CRONJOB_NAME_TWO = "test_cron_job_two"; + private static final String CRONJOB_SCHEDULE = "* * * * *"; + private static final String CRONJOB_SCHEDULE_CONFIG_PATH = "path/to/config"; + + /** + * Test generating crontab with schedule. + */ + public void testGenerateCronTabXmlFileWithSchedule() { + final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiFile cronJobFile = addCronJobToCronTabXml( + DEFAULT_CRON_GROUP, + CRONJOB_NAME_ONE, + CRONJOB_INSTANCE_ONE, + CRONJOB_SCHEDULE, + null + ); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronJobFile); + } + + /** + * Test generating crontab with schedule config path. + */ + public void testGenerateCronTabXmlFileWithScheduleConfig() { + final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiFile cronJobFile = addCronJobToCronTabXml( + DEFAULT_CRON_GROUP, + CRONJOB_NAME_TWO, + CRONJOB_INSTANCE_TWO, + null, + CRONJOB_SCHEDULE_CONFIG_PATH + ); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronJobFile); + } + + /** + * Test adding two cronjobs to the crontab.xml with one cron groups. + */ + public void testAddTwoCronJobsToOneCronTab() { + final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + addCronJobToCronTabXml( + DEFAULT_CRON_GROUP, + CRONJOB_NAME_ONE, + CRONJOB_INSTANCE_ONE, + CRONJOB_SCHEDULE, + null + ); + final PsiFile cronJobFile = addCronJobToCronTabXml( + DEFAULT_CRON_GROUP, + CRONJOB_NAME_TWO, + CRONJOB_INSTANCE_TWO, + null, + CRONJOB_SCHEDULE_CONFIG_PATH + ); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronJobFile); + } + + /** + * Test adding two cronjobs to the crontab.xml with different cron groups. + */ + public void testAddTwoCronJobsToDifferentCronTabs() { + final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + addCronJobToCronTabXml( + DEFAULT_CRON_GROUP, + CRONJOB_NAME_ONE, + CRONJOB_INSTANCE_ONE, + CRONJOB_SCHEDULE, + null + ); + final PsiFile cronJobFile = addCronJobToCronTabXml( + INDEX_CRON_GROUP, + CRONJOB_NAME_TWO, + CRONJOB_INSTANCE_TWO, + null, + CRONJOB_SCHEDULE_CONFIG_PATH + ); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronJobFile); + } + + /** + * Add cronjob to crontab.xml. + * + * @param cronGroup Cron group name + * @param cronjobName Cron job name + * @param cronjobInstance Cron job instance FQN + * @param cronjobSchedule Cron job schedule + * @param cronjobScheduleConfigPath Cron job schedule config path + * @return PsiFile + */ + private PsiFile addCronJobToCronTabXml( + final String cronGroup, + final String cronjobName, + final String cronjobInstance, + final String cronjobSchedule, + final String cronjobScheduleConfigPath + ) { + final Project project = myFixture.getProject(); + final CrontabXmlData crontabXmlData = new CrontabXmlData( + MODULE_NAME, + cronGroup, + cronjobName, + cronjobInstance, + cronjobSchedule, + cronjobScheduleConfigPath + ); + final CrontabXmlGenerator cronjobClassGenerator = new CrontabXmlGenerator( + project, + crontabXmlData + ); + + return cronjobClassGenerator.generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CustomerAttributeSetupPatchGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CustomerAttributeSetupPatchGeneratorTest.java new file mode 100644 index 000000000..bcd76c58c --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/CustomerAttributeSetupPatchGeneratorTest.java @@ -0,0 +1,63 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.CustomerEntityData; +import com.magento.idea.magento2plugin.magento.packages.eav.AttributeInput; +import com.magento.idea.magento2plugin.magento.packages.eav.AttributeSourceModel; +import com.magento.idea.magento2plugin.magento.packages.eav.AttributeType; +import java.util.HashMap; +import java.util.Map; + +public class CustomerAttributeSetupPatchGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + + /** + * Test generating the customer attribute data patch. + */ + public void testGenerateMultiselectAttributeDataPatch() { + final Project project = myFixture.getProject(); + + final CustomerEntityData customerEntityData = new CustomerEntityData(); + customerEntityData.setCode("multiselect_test"); + customerEntityData.setLabel("Multiselect Test"); + customerEntityData.setVisible(true); + customerEntityData.setSource(AttributeSourceModel.TABLE.getSource()); + customerEntityData.setType(AttributeType.VARCHAR.getType()); + customerEntityData.setInput(AttributeInput.MULTISELECT.getInput()); + customerEntityData.setUserDefined(true); + customerEntityData.setSortOrder(10); + customerEntityData.setUseInAdminhtmlCustomerForm(true); + + final Map options = new HashMap<>(); + options.put(0, "option1"); + options.put(1, "option2"); + options.put(2, "option3"); + customerEntityData.setOptions(options); + + customerEntityData.setDataPatchName("AddMultiselectTestCustomerAttribute"); + customerEntityData.setModuleName(MODULE_NAME); + + + final CustomerEavAttributePatchGenerator setupPatchGenerator = + new CustomerEavAttributePatchGenerator(customerEntityData, project); + final PsiFile dataPatchFile = setupPatchGenerator.generate( + "testGenerateMultiselectAttributeDataPatch" + ); + + final String filePatch = this.getFixturePath("AddMultiselectTestCustomerAttribute.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePatch); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Setup/Patch/Data", + dataPatchFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelGeneratorTest.java new file mode 100644 index 000000000..87f81c8a2 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelGeneratorTest.java @@ -0,0 +1,70 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.NewDataModelAction; +import com.magento.idea.magento2plugin.actions.generation.data.DataModelData; + +public class DataModelGeneratorTest extends BaseGeneratorTestCase { + + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Model/Data"; + + /** + * Tests for generation of a Magento 2 Data Model. + */ + public void testGenerateDataModel() { + final Project project = myFixture.getProject(); + final DataModelData modelData = new DataModelData( + "Sample", + "SampleInterface", + "Foo_Bar", + "ID_PROPERTY;id_property;int;IdProperty;idProperty," + + "SAMPLE_PROPERTY;sample_property;string;SampleProperty;sampleProperty", + true + ); + final DataModelGenerator generator = new DataModelGenerator( + project, modelData + ); + final PsiFile modelFile = generator.generate(NewDataModelAction.ACTION_NAME); + final PsiFile expectedFile + = myFixture.configureByFile(this.getFixturePath("Sample.php")); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIRECTORY, + modelFile + ); + } + + /** + * Tests for generation of a Magento 2 Data Model without interface. + */ + public void testGenerateDataModelWithoutInterface() { + final Project project = myFixture.getProject(); + final DataModelData modelData = new DataModelData( + "Sample", + "SampleInterface", + "Foo_Bar", + "ID_PROPERTY;id_property;int;IdProperty;idProperty," + + "SAMPLE_PROPERTY;sample_property;string;SampleProperty;sampleProperty", + false + ); + final DataModelGenerator generator = new DataModelGenerator( + project, modelData + ); + final PsiFile modelFile = generator.generate(NewDataModelAction.ACTION_NAME); + final PsiFile expectedFile + = myFixture.configureByFile(this.getFixturePath("Sample.php")); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIRECTORY, + modelFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelInterfaceGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelInterfaceGeneratorTest.java new file mode 100644 index 000000000..6ad8b4076 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataModelInterfaceGeneratorTest.java @@ -0,0 +1,36 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.NewDataModelAction; +import com.magento.idea.magento2plugin.actions.generation.data.DataModelInterfaceData; + +public class DataModelInterfaceGeneratorTest extends BaseGeneratorTestCase { + + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Api/Data"; + + /** + * Tests for generation of a Magento 2 Data Model Interface. + */ + public void testGenerateDataModelInterface() { + final DataModelInterfaceGenerator generator = new DataModelInterfaceGenerator( + new DataModelInterfaceData( + "SampleInterface", + "Foo_Bar", + "ID_PROPERTY;id_property;int;IdProperty;idProperty," + + "SAMPLE_PROPERTY;sample_property;string;" + + "SampleProperty;sampleProperty" + ), + myFixture.getProject() + ); + final PsiFile interfaceFile = generator.generate(NewDataModelAction.ACTION_NAME); + final PsiFile expectedFile + = myFixture.configureByFile(this.getFixturePath("SampleInterface.php")); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, interfaceFile); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataProviderDeclarationGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataProviderDeclarationGeneratorTest.java new file mode 100644 index 000000000..8169e066a --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DataProviderDeclarationGeneratorTest.java @@ -0,0 +1,53 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.DataProviderDeclarationData; +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class DataProviderDeclarationGeneratorTest extends BaseGeneratorTestCase { + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String CLASS_NAME = "MyVirtualClass"; + private static final String COLLECTION = "My/Collection"; + private static final String DATA_SOURCE = "my_grid_data_source"; + private static final String TABLE = "my_table"; + private static final String ACTION_NAME = "test"; + + /** + * Test checks whether menu.xml file generated correctly. + */ + public void testGenerateDataProviderDeclarationFile() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + generateDiXmlFile() + ); + } + + /** + * Generate Menu XML file. + * + * @return PsiFile + */ + private PsiFile generateDiXmlFile() { + final DataProviderDeclarationGenerator dataProviderDeclaration = + new DataProviderDeclarationGenerator( + new DataProviderDeclarationData( + MODULE_NAME, + CLASS_NAME, + COLLECTION, + DATA_SOURCE, + TABLE + ), + myFixture.getProject() + ); + return dataProviderDeclaration.generate(ACTION_NAME); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaWhitelistGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaWhitelistGeneratorTest.java new file mode 100644 index 000000000..a8d747fa5 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaWhitelistGeneratorTest.java @@ -0,0 +1,146 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.magento.idea.magento2plugin.actions.generation.data.DbSchemaXmlData; +import com.magento.idea.magento2plugin.actions.generation.generator.util.DbSchemaGeneratorDataProviderUtil; +import com.magento.idea.magento2plugin.actions.generation.generator.util.DbSchemaGeneratorUtil; +import com.magento.idea.magento2plugin.magento.files.ModuleDbSchemaWhitelistJson; +import com.magento.idea.magento2plugin.magento.packages.database.ColumnAttributes; +import com.magento.idea.magento2plugin.magento.packages.database.TableColumnTypes; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class DbSchemaWhitelistGeneratorTest extends BaseGeneratorTestCase { + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + private static final String TABLE_NAME = "test_table"; + + /** + * Test whether db_schema_whitelist.json file generated correctly. + */ + public void testGenerateDbSchemaWhitelistJsonFile() { + final DbSchemaXmlData dbSchemaXmlData = new DbSchemaXmlData( + TABLE_NAME, + "", + "", + "", + createColumnsForTest() + ); + final DbSchemaWhitelistJsonGenerator dbSchemaWhitelistJsonGenerator = + new DbSchemaWhitelistJsonGenerator( + myFixture.getProject(), + dbSchemaXmlData, + MODULE_NAME + ); + + final String filePath = this.getFixturePath(ModuleDbSchemaWhitelistJson.FILE_NAME); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + dbSchemaWhitelistJsonGenerator.generate("test") + ); + } + + /** + * Test whether db_schema_whitelist.json file generated correctly + * when columns provided as short entity properties. + */ + public void testGenerateDbSchemaWhitelistJsonFileForShortProperties() { + final List> properties = + DbSchemaGeneratorDataProviderUtil.generateEntityPropertiesForTest(); + + final List> columnsData = + DbSchemaGeneratorUtil.complementShortPropertiesByDefaults(properties); + columnsData.add(0, DbSchemaGeneratorUtil.getTableIdentityColumnData("entity_id")); + + final DbSchemaXmlData dbSchemaXmlData = new DbSchemaXmlData( + TABLE_NAME, + "", + "", + "", + columnsData + ); + final DbSchemaWhitelistJsonGenerator dbSchemaWhitelistJsonGenerator = + new DbSchemaWhitelistJsonGenerator( + myFixture.getProject(), + dbSchemaXmlData, + MODULE_NAME + ); + + final String filePath = this.getFixturePath(ModuleDbSchemaWhitelistJson.FILE_NAME); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + dbSchemaWhitelistJsonGenerator.generate("test") + ); + } + + /** + * Generate columns for testcase. + * + * @return List + */ + private List> createColumnsForTest() { + final List> columns = new LinkedList<>(); + final Map entityIdColumnData = new LinkedHashMap<>(); + entityIdColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.INT.getColumnType() + ); + entityIdColumnData.put(ColumnAttributes.NAME.getName(), "entity_id"); + entityIdColumnData.put(ColumnAttributes.IDENTITY.getName(), "true"); + columns.add(entityIdColumnData); + final Map nameColumnData = new LinkedHashMap<>(); + nameColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.VARCHAR.getColumnType() + ); + nameColumnData.put(ColumnAttributes.NAME.getName(), "name"); + columns.add(nameColumnData); + final Map ageColumnData = new LinkedHashMap<>(); + ageColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.INT.getColumnType() + ); + ageColumnData.put(ColumnAttributes.NAME.getName(), "age"); + columns.add(ageColumnData); + final Map salaryColumnData = new LinkedHashMap<>(); + salaryColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.DECIMAL.getColumnType() + ); + salaryColumnData.put(ColumnAttributes.NAME.getName(), "salary"); + columns.add(salaryColumnData); + final Map dobColumnData = new LinkedHashMap<>(); + dobColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.DATE.getColumnType() + ); + dobColumnData.put(ColumnAttributes.NAME.getName(), "dob"); + columns.add(dobColumnData); + final Map createdAtColumnData = new LinkedHashMap<>(); + createdAtColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.TIMESTAMP.getColumnType() + ); + createdAtColumnData.put(ColumnAttributes.NAME.getName(), "created_at"); + columns.add(createdAtColumnData); + final Map updatedAtColumnData = new LinkedHashMap<>(); + updatedAtColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.TIMESTAMP.getColumnType() + ); + updatedAtColumnData.put(ColumnAttributes.NAME.getName(), "updated_at"); + columns.add(updatedAtColumnData); + + return columns; + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaXmlGeneratorTest.java new file mode 100644 index 000000000..5e31071f1 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DbSchemaXmlGeneratorTest.java @@ -0,0 +1,188 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.magento.idea.magento2plugin.actions.generation.data.DbSchemaXmlData; +import com.magento.idea.magento2plugin.actions.generation.generator.util.DbSchemaGeneratorDataProviderUtil; +import com.magento.idea.magento2plugin.actions.generation.generator.util.DbSchemaGeneratorUtil; +import com.magento.idea.magento2plugin.magento.files.ModuleDbSchemaXml; +import com.magento.idea.magento2plugin.magento.packages.database.ColumnAttributes; +import com.magento.idea.magento2plugin.magento.packages.database.TableColumnTypes; +import com.magento.idea.magento2plugin.magento.packages.database.TableEngines; +import com.magento.idea.magento2plugin.magento.packages.database.TableResources; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public class DbSchemaXmlGeneratorTest extends BaseGeneratorTestCase { + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + private static final String TABLE_NAME = "test_table"; + private static final String TABLE_COMMENT = "Test Table"; + private static final String BOOLEAN_VALUE_TRUE = "true"; + private static final String BOOLEAN_VALUE_FALSE = "false"; + private static final String CURRENT_TIMESTAMP_DEFAULT_VALUE = "CURRENT_TIMESTAMP"; + private static final String TABLE_RESOURCE = TableResources.DEFAULT.getResource(); + private static final String TABLE_ENGINE = TableEngines.INNODB.getEngine(); + + /** + * Test whether db_schema.xml file generated correctly. + */ + public void testGenerateDbSchemaXmlFile() { + final DbSchemaXmlData dbSchemaXmlData = new DbSchemaXmlData( + TABLE_NAME, + TABLE_RESOURCE, + TABLE_ENGINE, + TABLE_COMMENT, + createColumnsForTest() + ); + final DbSchemaXmlGenerator dbSchemaXmlGenerator = new DbSchemaXmlGenerator( + dbSchemaXmlData, + myFixture.getProject(), + MODULE_NAME + ); + + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + dbSchemaXmlGenerator.generate("test") + ); + } + + /** + * Test db_schema.xml file generation when columns provided as short entity properties. + */ + public void testGenerateDbSchemaXmlFileForShortProperties() { + final List> properties = + DbSchemaGeneratorDataProviderUtil.generateEntityPropertiesForTest(); + + final List> columnsData = + DbSchemaGeneratorUtil.complementShortPropertiesByDefaults(properties); + columnsData.add(0, DbSchemaGeneratorUtil.getTableIdentityColumnData("entity_id")); + + final DbSchemaXmlData dbSchemaXmlData = new DbSchemaXmlData( + TABLE_NAME, + TABLE_RESOURCE, + TABLE_ENGINE, + TABLE_COMMENT, + columnsData + ); + final DbSchemaXmlGenerator dbSchemaXmlGenerator = new DbSchemaXmlGenerator( + dbSchemaXmlData, + myFixture.getProject(), + MODULE_NAME + ); + + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + dbSchemaXmlGenerator.generate("test") + ); + } + + /** + * Generate columns for testcase. + * + * @return List + */ + @SuppressWarnings("PMD") + private List> createColumnsForTest() { + final List> columns = new LinkedList<>(); + final Map entityIdColumnData = new LinkedHashMap<>(); + entityIdColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.INT.getColumnType() + ); + entityIdColumnData.put(ColumnAttributes.NAME.getName(), "entity_id"); + entityIdColumnData.put(ColumnAttributes.PADDING.getName(), "11"); + entityIdColumnData.put(ColumnAttributes.UNSIGNED.getName(), BOOLEAN_VALUE_TRUE); + entityIdColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_FALSE); + entityIdColumnData.put(ColumnAttributes.IDENTITY.getName(), BOOLEAN_VALUE_TRUE); + entityIdColumnData.put(ColumnAttributes.COMMENT.getName(), "Entity Id Column"); + columns.add(entityIdColumnData); + final Map nameColumnData = new LinkedHashMap<>(); + nameColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.VARCHAR.getColumnType() + ); + nameColumnData.put(ColumnAttributes.NAME.getName(), "name"); + nameColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_FALSE); + nameColumnData.put(ColumnAttributes.LENGTH.getName(), "255"); + nameColumnData.put(ColumnAttributes.DEFAULT.getName(), "John Smith"); + nameColumnData.put(ColumnAttributes.COMMENT.getName(), "Name Column"); + columns.add(nameColumnData); + final Map ageColumnData = new LinkedHashMap<>(); + ageColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.INT.getColumnType() + ); + ageColumnData.put(ColumnAttributes.NAME.getName(), "age"); + ageColumnData.put(ColumnAttributes.PADDING.getName(), "5"); + ageColumnData.put(ColumnAttributes.UNSIGNED.getName(), BOOLEAN_VALUE_TRUE); + ageColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_TRUE); + ageColumnData.put(ColumnAttributes.IDENTITY.getName(), BOOLEAN_VALUE_FALSE); + ageColumnData.put(ColumnAttributes.COMMENT.getName(), "Age Column"); + columns.add(ageColumnData); + final Map salaryColumnData = new LinkedHashMap<>(); + salaryColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.DECIMAL.getColumnType() + ); + salaryColumnData.put(ColumnAttributes.NAME.getName(), "salary"); + salaryColumnData.put(ColumnAttributes.PADDING.getName(), "5"); + salaryColumnData.put(ColumnAttributes.UNSIGNED.getName(), BOOLEAN_VALUE_TRUE); + salaryColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_FALSE); + salaryColumnData.put(ColumnAttributes.PRECISION.getName(), "10"); + salaryColumnData.put(ColumnAttributes.SCALE.getName(), "2"); + salaryColumnData.put(ColumnAttributes.DEFAULT.getName(), "0.0"); + salaryColumnData.put(ColumnAttributes.COMMENT.getName(), "Salary Column"); + columns.add(salaryColumnData); + final Map dobColumnData = new LinkedHashMap<>(); + dobColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.DATE.getColumnType() + ); + dobColumnData.put(ColumnAttributes.NAME.getName(), "dob"); + dobColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_TRUE); + dobColumnData.put(ColumnAttributes.COMMENT.getName(), "Date Of The Birth Column"); + columns.add(dobColumnData); + final Map createdAtColumnData = new LinkedHashMap<>(); + createdAtColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.TIMESTAMP.getColumnType() + ); + createdAtColumnData.put(ColumnAttributes.NAME.getName(), "created_at"); + createdAtColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_FALSE); + createdAtColumnData.put(ColumnAttributes.ON_UPDATE.getName(), BOOLEAN_VALUE_FALSE); + createdAtColumnData.put( + ColumnAttributes.DEFAULT.getName(), + CURRENT_TIMESTAMP_DEFAULT_VALUE + ); + createdAtColumnData.put(ColumnAttributes.COMMENT.getName(), "Created At Column"); + columns.add(createdAtColumnData); + final Map updatedAtColumnData = new LinkedHashMap<>(); + updatedAtColumnData.put( + ColumnAttributes.TYPE.getName(), + TableColumnTypes.TIMESTAMP.getColumnType() + ); + updatedAtColumnData.put(ColumnAttributes.NAME.getName(), "updated_at"); + updatedAtColumnData.put(ColumnAttributes.NULLABLE.getName(), BOOLEAN_VALUE_FALSE); + updatedAtColumnData.put(ColumnAttributes.ON_UPDATE.getName(), BOOLEAN_VALUE_TRUE); + updatedAtColumnData.put( + ColumnAttributes.DEFAULT.getName(), + CURRENT_TIMESTAMP_DEFAULT_VALUE + ); + updatedAtColumnData.put(ColumnAttributes.COMMENT.getName(), "Updated At Column"); + columns.add(updatedAtColumnData); + + return columns; + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityCommandGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityCommandGeneratorTest.java new file mode 100644 index 000000000..ee0a271fe --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityCommandGeneratorTest.java @@ -0,0 +1,65 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; +import com.magento.idea.magento2plugin.actions.generation.data.DeleteEntityByIdCommandData; +import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; +import com.magento.idea.magento2plugin.magento.files.commands.DeleteEntityByIdCommandFile; + +public class DeleteEntityCommandGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Book"; + private static final String MODEL_NAME = ENTITY_NAME + "Model"; + private static final String RESOURCE_MODEL_NAME = ENTITY_NAME + "Resource"; + private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Command/" + ENTITY_NAME; + private static final String ENTITY_ID = "book_id"; + private static final String ACL = "Foo_Bar::book_management"; + + @Override + public void setUp() throws Exception { + super.setUp(); + final EntityCreatorContext context = new EntityCreatorContext(); + context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); + context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID); + GenerationContextRegistry.getInstance().setContext(context); + } + + /** + * Test generation of DeleteByIdCommand model for entity. + */ + public void testGenerateDeleteEntityByIdCommandFile() { + final DeleteEntityByIdCommandData deleteEntityByIdCommandData = + new DeleteEntityByIdCommandData( + MODULE_NAME, + ENTITY_NAME, + ENTITY_ID, + MODEL_NAME, + RESOURCE_MODEL_NAME, + ACL + ); + final DeleteEntityByIdCommandGenerator deleteEntityByIdCommandGenerator = + new DeleteEntityByIdCommandGenerator( + deleteEntityByIdCommandData, + myFixture.getProject(), + false + ); + final String filePath = this.getFixturePath( + new DeleteEntityByIdCommandFile(MODULE_NAME, ENTITY_NAME).getFileName() + ); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiFile deleteEntityCommandFile = deleteEntityByIdCommandGenerator.generate("test"); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIRECTORY, + deleteEntityCommandFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityGeneratorTest.java new file mode 100644 index 000000000..d11ead6ef --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/DeleteEntityGeneratorTest.java @@ -0,0 +1,62 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; +import com.magento.idea.magento2plugin.actions.generation.data.DeleteEntityControllerFileData; +import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; +import com.magento.idea.magento2plugin.magento.files.actions.DeleteActionFile; + +public class DeleteEntityGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Company"; + private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\CompanyData"; + private static final String ACL = "Foo_Bar::company_id"; + private static final String ENTITY_ID = "company_id"; + private static final String EXPECTED_DIRECTORY = + "/src/app/code/Foo/Bar/Controller/Adminhtml/" + ENTITY_NAME; + + @Override + public void setUp() throws Exception { + super.setUp(); + final EntityCreatorContext context = new EntityCreatorContext(); + context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); + context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID); + GenerationContextRegistry.getInstance().setContext(context); + } + + /** + * Test generation of Delete controller. + */ + public void testGenerateDeleteEntityFile() { + final DeleteEntityControllerFileData deleteEntityControllerFileData = + new DeleteEntityControllerFileData( + ENTITY_NAME, + MODULE_NAME, + ACL, + ENTITY_ID, + false + ); + final DeleteEntityControllerFileGenerator deleteEntityControllerFileGenerator = + new DeleteEntityControllerFileGenerator( + deleteEntityControllerFileData, + myFixture.getProject() + ); + final PsiFile deleteEntityActionFile = + deleteEntityControllerFileGenerator.generate("test"); + final String filePath = + this.getFixturePath(new DeleteActionFile(MODULE_NAME, ENTITY_NAME).getFileName()); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIRECTORY, + deleteEntityActionFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EditEntityActionGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EditEntityActionGeneratorTest.java new file mode 100644 index 000000000..5d3040662 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EditEntityActionGeneratorTest.java @@ -0,0 +1,48 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.EditEntityActionData; +import com.magento.idea.magento2plugin.magento.files.actions.EditActionFile; + +public class EditEntityActionGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Book"; + private static final String EXPECTED_DIRECTORY = + "/src/app/code/Foo/Bar/Controller/Adminhtml/" + ENTITY_NAME; + private static final String ACL = "Foo_Bar::management"; + private static final String MENU = "Foo_Bar::management"; + + /** + * Test generation of edit entity controller file. + */ + public void testGenerateEditEntityActionFile() { + final EditActionFile file = new EditActionFile(MODULE_NAME, ENTITY_NAME); + final EditEntityActionGenerator generator = + new EditEntityActionGenerator( + new EditEntityActionData( + ENTITY_NAME, + MODULE_NAME, + ACL, + MENU + ), + myFixture.getProject(), + false + ); + + final PsiFile resultFile = generator.generate("test"); + final String filePath = this.getFixturePath(file.getFileName()); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIRECTORY, + resultFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EntityDataMapperClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EntityDataMapperClassGeneratorTest.java new file mode 100644 index 000000000..8654857c2 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/EntityDataMapperClassGeneratorTest.java @@ -0,0 +1,49 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.magento.idea.magento2plugin.actions.generation.data.EntityDataMapperData; +import com.magento.idea.magento2plugin.magento.files.EntityDataMapperFile; + +public class EntityDataMapperClassGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Mapper"; + private static final String ENTITY_NAME = "Unicorn"; + private static final String MODEL_NAME = "UnicornModel"; + private static final String DTO_NAME = "UnicornData"; + private static final String DTO_INTERFACE_NAME = "UnicornDataInterface"; + private static final boolean DTO_HAS_INTERFACE = true; + + /** + * Test generation of entity data mapper class. + */ + public void testGenerateEntityDataMapperFile() { + final EntityDataMapperData entityDataMapperData = new EntityDataMapperData( + MODULE_NAME, + ENTITY_NAME, + MODEL_NAME, + DTO_NAME, + DTO_INTERFACE_NAME, + DTO_HAS_INTERFACE + ); + final EntityDataMapperGenerator entityDataMapperGenerator = + new EntityDataMapperGenerator( + entityDataMapperData, + myFixture.getProject(), + false + ); + final EntityDataMapperFile entityDataMapperFile = + new EntityDataMapperFile(MODULE_NAME, ENTITY_NAME); + final String filePath = this.getFixturePath(entityDataMapperFile.getFileName()); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + entityDataMapperGenerator.generate("test") + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormButtonBlockGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormButtonBlockGeneratorTest.java new file mode 100644 index 000000000..c80afe551 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormButtonBlockGeneratorTest.java @@ -0,0 +1,189 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; +import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormButtonData; +import com.magento.idea.magento2plugin.actions.generation.generator.util.NamespaceBuilder; +import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; +import org.junit.Before; + +public class FormButtonBlockGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String FORM_NAME = "my_form"; + private static final String ENTITY_NAME = "Book"; + private static final String BLOCK_DIRECTORY = "Block/Form/" + ENTITY_NAME; + private static final String ACTION_NAME = "test"; + private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; + private static final String ENTITY_ID = "book_id"; + public static final String EXPECTED_DIRECTORY + = "src/app/code/Foo/Bar/Block/Form/" + ENTITY_NAME; + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + final EntityCreatorContext context = new EntityCreatorContext(); + context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); + context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID); + GenerationContextRegistry.getInstance().setContext(context); + } + + /** + * Test creation Block type Save. + */ + public void testGenerateSaveButtonBlock() { + final String filePath = this.getFixturePath("SaveBlock.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final String className = "SaveBlock"; + final NamespaceBuilder namespace = new NamespaceBuilder( + MODULE_NAME, + className, + BLOCK_DIRECTORY + ); + + final UiComponentFormButtonData uiComponentFormButtonData = new UiComponentFormButtonData( + BLOCK_DIRECTORY, + className, + MODULE_NAME, + "Save", + namespace.getNamespace(), + "Save Entity", + "10", + FORM_NAME, + namespace.getClassFqn() + ); + final UiComponentFormButtonBlockGenerator formButtonPhpClassGenerator = + new UiComponentFormButtonBlockGenerator( + uiComponentFormButtonData, + project, + ENTITY_NAME, + ENTITY_ID, + false + ); + + final PsiFile file = formButtonPhpClassGenerator.generate(ACTION_NAME); + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } + + /** + * Test creation Block type Back. + */ + public void testGenerateBackButtonBlock() { + final String filePath = this.getFixturePath("MyBackButton.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final String className = "MyBackButton"; + final NamespaceBuilder namespace = new NamespaceBuilder( + MODULE_NAME, + className, + BLOCK_DIRECTORY + ); + + final UiComponentFormButtonData uiComponentFormButtonData = new UiComponentFormButtonData( + BLOCK_DIRECTORY, + className, + MODULE_NAME, + "Back", + namespace.getNamespace(), + "Back Button", + "20", + FORM_NAME, + namespace.getClassFqn() + ); + final UiComponentFormButtonBlockGenerator formButtonPhpClassGenerator = + new UiComponentFormButtonBlockGenerator( + uiComponentFormButtonData, + project, + ENTITY_NAME, + ENTITY_ID, + false + ); + + final PsiFile file = formButtonPhpClassGenerator.generate(ACTION_NAME); + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } + + /** + * Test creation Block type Delete. + */ + public void testGenerateDeleteButtonBlock() { + final String filePath = this.getFixturePath("DeleteBlock.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final String className = "DeleteBlock"; + final NamespaceBuilder namespace = new NamespaceBuilder( + MODULE_NAME, + className, + BLOCK_DIRECTORY + ); + + final UiComponentFormButtonData uiComponentFormButtonData = new UiComponentFormButtonData( + BLOCK_DIRECTORY, + className, + MODULE_NAME, + "Delete", + namespace.getNamespace(), + "Delete Entity", + "30", + FORM_NAME, + namespace.getClassFqn() + ); + final UiComponentFormButtonBlockGenerator generator = + new UiComponentFormButtonBlockGenerator( + uiComponentFormButtonData, + project, + ENTITY_NAME, + ENTITY_ID, + false + ); + + final PsiFile file = generator.generate(ACTION_NAME); + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } + + /** + * Test creation Block custom type. + */ + public void testGenerateCustomButtonBlock() { + final String filePath = this.getFixturePath("MyCustom.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final String className = "MyCustom"; + final NamespaceBuilder namespace = new NamespaceBuilder( + MODULE_NAME, + className, + BLOCK_DIRECTORY + ); + + final UiComponentFormButtonData uiComponentFormButtonData = new UiComponentFormButtonData( + BLOCK_DIRECTORY, + className, + MODULE_NAME, + "Custom", + namespace.getNamespace(), + "My Custom Button", + "40", + FORM_NAME, + namespace.getClassFqn() + ); + final UiComponentFormButtonBlockGenerator formButtonPhpClassGenerator = + new UiComponentFormButtonBlockGenerator( + uiComponentFormButtonData, + project, + ENTITY_NAME, + ENTITY_ID, + false + ); + + final PsiFile file = formButtonPhpClassGenerator.generate(ACTION_NAME); + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormGenericButtonBlockGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormGenericButtonBlockGeneratorTest.java new file mode 100644 index 000000000..8f500851e --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/FormGenericButtonBlockGeneratorTest.java @@ -0,0 +1,56 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; +import com.magento.idea.magento2plugin.actions.generation.data.FormGenericButtonBlockData; +import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; +import com.magento.idea.magento2plugin.magento.files.FormGenericButtonBlockFile; + +public class FormGenericButtonBlockGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Book"; + private static final String ENTITY_ID = "book_id"; + private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; + private static final String EXPECTED_DIRECTORY + = "src/app/code/Foo/Bar/Block/Form/" + ENTITY_NAME; + + @Override + public void setUp() throws Exception { + super.setUp(); + final EntityCreatorContext context = new EntityCreatorContext(); + context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); + context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID); + GenerationContextRegistry.getInstance().setContext(context); + } + + /** + * Test generation of form ui component generic button block. + */ + public void testGenerateFormGenericButtonBlockFile() { + final FormGenericButtonBlockData data = new FormGenericButtonBlockData( + MODULE_NAME, + ENTITY_NAME, + ENTITY_ID + ); + final FormGenericButtonBlockGenerator generator = + new FormGenericButtonBlockGenerator( + data, + myFixture.getProject(), + false + ); + final String filePath = this.getFixturePath( + new FormGenericButtonBlockFile(MODULE_NAME, ENTITY_NAME).getFileName() + ); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + generator.generate("test") + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/GridActionColumnFileGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/GridActionColumnFileGeneratorTest.java new file mode 100644 index 000000000..b21d31d1f --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/GridActionColumnFileGeneratorTest.java @@ -0,0 +1,53 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; +import com.magento.idea.magento2plugin.actions.generation.data.GridActionColumnData; +import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; +import com.magento.idea.magento2plugin.magento.files.GridActionColumnFile; + +public class GridActionColumnFileGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Book"; + private static final String ENTITY_ID_COLUMN = "book_id"; + private static final String EDIT_URL_PATH = "book_book_edit"; + private static final String DELETE_URL_PATH = "book_book_delete"; + private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; + + @Override + public void setUp() throws Exception { + super.setUp(); + final EntityCreatorContext context = new EntityCreatorContext(); + context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); + context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID_COLUMN); + GenerationContextRegistry.getInstance().setContext(context); + } + + /** + * Test generation of grid actions column file. + */ + public void testGenerateGridActionColumnFile() { + final GridActionColumnFile file = new GridActionColumnFile(MODULE_NAME, ENTITY_NAME); + final GridActionColumnData data = new GridActionColumnData( + MODULE_NAME, + ENTITY_NAME, + ENTITY_ID_COLUMN, + EDIT_URL_PATH, + DELETE_URL_PATH + ); + final String filePath = this.getFixturePath(file.getFileName()); + final GridActionColumnFileGenerator generator = + new GridActionColumnFileGenerator(data, myFixture.getProject(), false); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + "src/app/code/Foo/Bar/".concat(file.getDirectory()), + generator.generate("test") + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/IndexControllerGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/IndexControllerGeneratorTest.java new file mode 100644 index 000000000..68b821448 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/IndexControllerGeneratorTest.java @@ -0,0 +1,39 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.magento.idea.magento2plugin.actions.generation.data.IndexActionData; +import com.magento.idea.magento2plugin.magento.files.actions.IndexActionFile; + +public class IndexControllerGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Book"; + private static final String ACL = "Foo_Bar::book_management"; + private static final String MENU = "Foo_Bar::book_management_menu"; + + /** + * Test generation of list view entity controller (adminhtml). + */ + public void testGenerateIndexControllerFile() { + final IndexActionFile file = new IndexActionFile(MODULE_NAME, ENTITY_NAME); + final IndexActionData data = new IndexActionData( + MODULE_NAME, + ENTITY_NAME, + ACL, + MENU + ); + final String filePath = this.getFixturePath(file.getFileName()); + final IndexActionGenerator generator = + new IndexActionGenerator(data, myFixture.getProject(), false); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + "src/app/code/Foo/Bar/".concat(file.getDirectory()), + generator.generate("test") + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/LayoutXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/LayoutXmlGeneratorTest.java new file mode 100644 index 000000000..3dbf17100 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/LayoutXmlGeneratorTest.java @@ -0,0 +1,45 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.LayoutXmlData; +import com.magento.idea.magento2plugin.magento.packages.Areas; + +public class LayoutXmlGeneratorTest extends BaseGeneratorTestCase { + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/view/adminhtml/layout"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ROUTE = "customroute"; + private static final String CONTROLLER_NAME = "Entity"; + private static final String ACTION_NAME = "View"; + private static final String FORM_NAME = "my_form"; + private static final String FILE_NAME = "customroute_entity_view.xml"; + + /** + * Test generating layout XML file. + */ + public void testGenerateLayoutXmlFile() { + final String filePath = this.getFixturePath(FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final LayoutXmlData layoutXmlData = new LayoutXmlData( + Areas.adminhtml.toString(), + ROUTE, + MODULE_NAME, + CONTROLLER_NAME, + ACTION_NAME, + FORM_NAME + ); + final LayoutXmlGenerator cronjobClassGenerator = new LayoutXmlGenerator( + layoutXmlData, + project + ); + + final PsiFile file = cronjobClassGenerator.generate("test"); + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MenuXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MenuXmlGeneratorTest.java new file mode 100644 index 000000000..b1d12ea6d --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MenuXmlGeneratorTest.java @@ -0,0 +1,54 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.MenuXmlData; +import com.magento.idea.magento2plugin.magento.files.ModuleMenuXml; + +public class MenuXmlGeneratorTest extends BaseGeneratorTestCase { + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc/adminhtml"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ACL_ID = "Foo_Bar::acl"; + private static final String MENU_IDENTIFIER = "Foo_Bar::menu"; + private static final String MENU_TITLE = "My Title"; + private static final String PARENT_MENU = "Magento_Customer::customer"; + private static final String ACTION_NAME = "test"; + + /** + * Test checks whether menu.xml file generated correctly. + */ + public void testGenerateMenuXmlFile() { + final String filePath = this.getFixturePath(ModuleMenuXml.fileName); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + generateMenuXmlFile() + ); + } + + /** + * Generate Menu XML file. + * + * @return PsiFile + */ + private PsiFile generateMenuXmlFile() { + final MenuXmlGenerator menuXmlGenerator = new MenuXmlGenerator( + new MenuXmlData( + PARENT_MENU, + "10", + MODULE_NAME, + MENU_IDENTIFIER, + MENU_TITLE, + ACL_ID, + ACTION_NAME + ), + myFixture.getProject() + ); + return menuXmlGenerator.generate(ACTION_NAME); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MessageQueueClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MessageQueueClassGeneratorTest.java new file mode 100644 index 000000000..84cfc1d77 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/MessageQueueClassGeneratorTest.java @@ -0,0 +1,87 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.MessageQueueClassData; +import com.magento.idea.magento2plugin.magento.files.MessageQueueClassPhp; + +public class MessageQueueClassGeneratorTest extends BaseGeneratorTestCase { + private static final String MODULE_NAME = "Foo_Bar"; + + private static final String HANDLER_EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Queue/Handler"; + private static final String HANDLER_CLASS_NAME = "MyHandler"; + private static final String HANDLER_NAMESPACE = "Foo\\Bar\\Queue\\Handler"; + private static final String HANDLER_PATH = "Queue/Handler"; + private static final String HANDLER_FQN = "\\Foo\\Bar\\Queue\\Handler\\MyHandler"; + + private static final String CONSUMER_EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Queue/Consumer"; + private static final String CONSUMER_CLASS_NAME = "MyConsumer"; + private static final String CONSUMER_NAMESPACE = "Foo\\Bar\\Queue\\Consumer"; + private static final String CONSUMER_PATH = "Queue/Consumer"; + private static final String CONSUMER_FQN = "\\Foo\\Bar\\Queue\\Handler\\MyConsumer"; + + /** + * Test handler class file generation. + */ + public void testGenerateHandler() { + final Project project = myFixture.getProject(); + final MessageQueueClassData messageQueueClassData = new MessageQueueClassData( + HANDLER_CLASS_NAME, + HANDLER_NAMESPACE, + HANDLER_PATH, + HANDLER_FQN, + MessageQueueClassPhp.Type.HANDLER + ); + final MessageQueueClassGenerator generator; + generator = new MessageQueueClassGenerator( + messageQueueClassData, + MODULE_NAME, + project + ); + + final PsiFile messageQueue = generator.generate("test"); + final String filePath = this.getFixturePath("MyHandler.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + HANDLER_EXPECTED_DIRECTORY, + messageQueue + ); + } + + /** + * Test consumer class file generation. + */ + public void testGenerateConsumer() { + final Project project = myFixture.getProject(); + final MessageQueueClassData messageQueueClassData = new MessageQueueClassData( + CONSUMER_CLASS_NAME, + CONSUMER_NAMESPACE, + CONSUMER_PATH, + CONSUMER_FQN, + MessageQueueClassPhp.Type.CONSUMER + ); + final MessageQueueClassGenerator generator; + generator = new MessageQueueClassGenerator( + messageQueueClassData, + MODULE_NAME, + project + ); + + final PsiFile messageQueue = generator.generate("test"); + final String filePath = this.getFixturePath("MyConsumer.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + CONSUMER_EXPECTED_DIRECTORY, + messageQueue + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleBlockClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleBlockClassGeneratorTest.java new file mode 100644 index 000000000..285e4491a --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleBlockClassGeneratorTest.java @@ -0,0 +1,33 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.BlockFileData; + +public class ModuleBlockClassGeneratorTest extends BaseGeneratorTestCase { + + /** + * Test Block generator + */ + public void testGenerateFile() { + Project project = myFixture.getProject(); + + BlockFileData blockData = new BlockFileData( + "Block/Test", + "ViewBlock", + "Foo_Bar", + "Foo\\Bar\\Block\\Test" + ); + ModuleBlockClassGenerator moduleBlockClassGenerator = new ModuleBlockClassGenerator(blockData, project); + PsiFile blockFile = moduleBlockClassGenerator.generate("test"); + + String filePath = this.getFixturePath("ViewBlock.php"); + PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect(expectedFile, "src/app/code/Foo/Bar/Block/Test", blockFile); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java new file mode 100644 index 000000000..d3aac20ce --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCollectionGeneratorTest.java @@ -0,0 +1,64 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.CollectionData; + +public class ModuleCollectionGeneratorTest extends BaseGeneratorTestCase { + + /** + * Test generation of collection file. + */ + public void testGenerateFile() { + final Project project = myFixture.getProject(); + final CollectionData collectionFileData = new CollectionData( + "Foo_Bar", + "my_table", + "TestModel", + "TestResource", + "TestCollection", + "TestModel" + ); + final ModuleCollectionGenerator generator = new ModuleCollectionGenerator( + collectionFileData, + project + ); + final PsiFile collectionFile = generator.generate("test"); + final String filePath = this.getFixturePath("TestCollection.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Model/ResourceModel/TestModel", + collectionFile + ); + } + + /** + * Test generation of collection file where resource model name equal to the model name. + */ + public void testGenerateWithTheSameNamesForResourceModelAndModel() { + final PsiFile collectionFile = new ModuleCollectionGenerator( + new CollectionData( + "Foo_Bar", + "my_table", + "Test", + "Test", + "Collection", + "Test" + ), + myFixture.getProject() + ).generate("test"); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(this.getFixturePath("Collection.php")), + "src/app/code/Foo/Bar/Model/ResourceModel/Test", + collectionFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGeneratorTest.java new file mode 100644 index 000000000..f02c36460 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleComposerJsonGeneratorTest.java @@ -0,0 +1,118 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ModuleComposerJsonData; +import com.magento.idea.magento2plugin.magento.files.ComposerJson; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ModuleComposerJsonGeneratorTest extends BaseGeneratorTestCase { + + /** + * Test for the module composer.json generation with dependencies. + */ + public void testGenerateModuleFile() { + final String filePath = this.getFixturePath(ComposerJson.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiDirectory projectDir = getProjectDirectory(); + + final String expectedDirectory = + projectDir.getVirtualFile().getPath() + "/TestWithDependencies/Test"; + final PsiFile composerJson = generateComposerJson( + true, + projectDir, + true, + "TestWithDependencies"); + + assertGeneratedFileIsCorrect( + expectedFile, + expectedDirectory, + composerJson + ); + } + + /** + * Test for generation the composer.json with dependencies in the root directory. + */ + public void testGenerateFileInRoot() { + final String filePath = this.getFixturePath(ComposerJson.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiDirectory projectDir = getProjectDirectory(); + + final String composerJsonDirPath = projectDir.getVirtualFile().getPath(); + final PsiFile composerJson = generateComposerJson( + false, + projectDir, + true, + "TestWithDependencies"); + + assertGeneratedFileIsCorrect(expectedFile, composerJsonDirPath, composerJson); + } + + /** + * Test case for the composer.json generation without dependencies. + */ + public void testGenerateModuleFileWithoutDependencies() { + final String filePath = this.getFixturePath(ComposerJson.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiDirectory projectDir = getProjectDirectory(); + final String expectedDirectory = projectDir.getVirtualFile().getPath() + + "/TestWithoutDependencies/Test"; + final PsiFile composerJson = generateComposerJson( + true, + projectDir, + false, + "TestWithoutDependencies"); + + assertGeneratedFileIsCorrect( + expectedFile, + expectedDirectory, + composerJson + ); + } + + /** + * Generate composer.json file for tests. + * + * @param createModuleDirectories create module directory flag + * @param projectDir project directory + * @param withDependencies generate composer.json with dependencies or not + * @param packageName the package name of the test module + * @return PsiFile + */ + private PsiFile generateComposerJson( + final boolean createModuleDirectories, + final PsiDirectory projectDir, + final boolean withDependencies, + final String packageName) { + final Project project = myFixture.getProject(); + final List dependencies = withDependencies + ? new ArrayList<>(Arrays.asList("Foo_Bar", "Magento_Backend")) + : new ArrayList<>(Arrays.asList("Foo_BarWithOutComposer")); + final List licenses = new ArrayList<>( + Arrays.asList("Test License 1", "Test License 2") + ); + final ModuleComposerJsonData composerJsonData = new ModuleComposerJsonData( + packageName, + "Test", + projectDir, + "test-description", + "test/module-test", + "1.0.0-dev", + licenses, + dependencies, + createModuleDirectories + ); + final ModuleComposerJsonGenerator composerJsonGenerator = + new ModuleComposerJsonGenerator(composerJsonData, project); + return composerJsonGenerator.generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGeneratorTest.java new file mode 100644 index 000000000..d828cc9fe --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleControllerClassGeneratorTest.java @@ -0,0 +1,102 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ControllerFileData; + +public class ModuleControllerClassGeneratorTest extends BaseGeneratorTestCase { + /** + * Test generation of frontend controller file. + */ + public void testGenerateFrontendControllerFile() { + final Project project = myFixture.getProject(); + final ControllerFileData controllerFileData = new ControllerFileData( + "Controller/Entity", + "GetAction", + "Foo_Bar", + "frontend", + "GET", + "", + false, + "Foo\\Bar\\Controller\\Entity" + ); + final ModuleControllerClassGenerator generator = new ModuleControllerClassGenerator( + controllerFileData, + project + ); + final PsiFile controllerFile = generator.generate("test"); + final String filePath = this.getFixturePath("GetAction.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Controller/Entity", + controllerFile + ); + } + + /** + * Test generation of frontend controller file with action class inheritance. + */ + public void testGenerateFrontendInheritActionControllerFile() { + final Project project = myFixture.getProject(); + final ControllerFileData controllerFileData = new ControllerFileData( + "Controller/Entity", + "DeleteAction", + "Foo_Bar", + "frontend", + "DELETE", + "", + true, + "Foo\\Bar\\Controller\\Entity" + ); + final ModuleControllerClassGenerator generator = new ModuleControllerClassGenerator( + controllerFileData, + project + ); + final PsiFile controllerFile = generator.generate("test"); + final String filePath = this.getFixturePath("DeleteAction.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Controller/Entity", + controllerFile + ); + } + + /** + * Test generation of backend controller file. + */ + public void testGenerateBackendControllerFile() { + final Project project = myFixture.getProject(); + final ControllerFileData controllerFileData = new ControllerFileData( + "Controller/Adminhtml/Entity", + "BackendSaveAction", + "Foo_Bar", + "adminhtml", + "POST", + "Foo_Bar::entity", + true, + "Foo\\Bar\\Controller\\Adminhtml\\Entity" + ); + final ModuleControllerClassGenerator generator = new ModuleControllerClassGenerator( + controllerFileData, + project + ); + final PsiFile controllerFile = generator.generate("test"); + final String filePath = this.getFixturePath("BackendSaveAction.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Controller/Adminhtml/Entity", + controllerFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCronGroupXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCronGroupXmlGeneratorTest.java new file mode 100644 index 000000000..166d5e147 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleCronGroupXmlGeneratorTest.java @@ -0,0 +1,138 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.CronGroupXmlData; +import com.magento.idea.magento2plugin.magento.files.CronGroupXmlTemplate; + +public class ModuleCronGroupXmlGeneratorTest extends BaseGeneratorTestCase { + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String CRON_GROUP_NAME_ONE = "custom_cron_group_one"; + private static final String CRON_GROUP_NAME_TWO = "custom_cron_group_two"; + private static final int SCHEDULE_GENERATE_EVERY = 1; + private static final int SCHEDULE_AHEAD_FOR = 4; + private static final int SCHEDULE_LIFETIME = 2; + private static final int HISTORY_CLEANUP_EVERY = 10; + private static final int HISTORY_SUCCESS_LIFETIME = 60; + private static final int HISTORY_FAILURE_LIFETIME = 600; + private static final int USE_SEPARATE_PROCESS = 1; + + /** + * Test generating CRON group with no options. + */ + public void testGenerateEmptyCronGroup() { + final String filePath = this.getFixturePath(CronGroupXmlTemplate.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiFile cronGroupsXmlFile = addCronGroupToCronGroupsXml( + CRON_GROUP_NAME_ONE, + null, + null, + null, + null, + null, + null, + null + ); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronGroupsXmlFile); + } + + /** + * Test generating CRON group with all options. + */ + public void testGenerateCronGroupWithAllOptions() { + final String filePath = this.getFixturePath(CronGroupXmlTemplate.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiFile cronGroupsXmlFile = addCronGroupToCronGroupsXml( + CRON_GROUP_NAME_TWO, + SCHEDULE_GENERATE_EVERY, + SCHEDULE_AHEAD_FOR, + SCHEDULE_LIFETIME, + HISTORY_CLEANUP_EVERY, + HISTORY_SUCCESS_LIFETIME, + HISTORY_FAILURE_LIFETIME, + USE_SEPARATE_PROCESS + ); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronGroupsXmlFile); + } + + /** + * Test adding two CRON groups to the cron_groups.xml. + */ + public void testAddTwoCronGroupsToCronGroupsXmlFile() { + final String filePath = this.getFixturePath(CronGroupXmlTemplate.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + addCronGroupToCronGroupsXml( + CRON_GROUP_NAME_ONE, + null, + null, + null, + null, + null, + null, + null + ); + final PsiFile cronGroupsXmlFile = addCronGroupToCronGroupsXml( + CRON_GROUP_NAME_TWO, + SCHEDULE_GENERATE_EVERY, + SCHEDULE_AHEAD_FOR, + SCHEDULE_LIFETIME, + HISTORY_CLEANUP_EVERY, + HISTORY_SUCCESS_LIFETIME, + HISTORY_FAILURE_LIFETIME, + USE_SEPARATE_PROCESS + ); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, cronGroupsXmlFile); + } + + /** + * Add CRON group to cron_groups.xml. + * + * @param cronGroupName CRON group name + * @param scheduleGenerateEvery Schedule generate every + * @param scheduleAheadFor Schedule ahead for + * @param scheduleLifetime Schedule lifetime + * @param historyCleanupEvery History cleanup every + * @param historySuccessLifetime History success lifetime + * @param historyFailureLifetime History failure lifetime + * @param useSeparateProcess Use separate process + * @return PsiFile + */ + private PsiFile addCronGroupToCronGroupsXml( + final String cronGroupName, + final Integer scheduleGenerateEvery, + final Integer scheduleAheadFor, + final Integer scheduleLifetime, + final Integer historyCleanupEvery, + final Integer historySuccessLifetime, + final Integer historyFailureLifetime, + final Integer useSeparateProcess + ) { + final Project project = myFixture.getProject(); + final CronGroupXmlData cronGroupXmlData = new CronGroupXmlData( + MODULE_NAME, + cronGroupName, + scheduleGenerateEvery, + scheduleAheadFor, + scheduleLifetime, + historyCleanupEvery, + historySuccessLifetime, + historyFailureLifetime, + useSeparateProcess + ); + final ModuleCronGroupXmlGenerator cronGroupXmlGenerator = new ModuleCronGroupXmlGenerator( + cronGroupXmlData, + project + ); + + return cronGroupXmlGenerator.generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplateHtmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplateHtmlGeneratorTest.java new file mode 100644 index 000000000..5e5bfa193 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplateHtmlGeneratorTest.java @@ -0,0 +1,110 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.EmailTemplateHtmlData; +import com.magento.idea.magento2plugin.magento.files.EmailTemplateHtml; +import com.magento.idea.magento2plugin.magento.packages.Areas; + +public class ModuleEmailTemplateHtmlGeneratorTest extends BaseGeneratorTestCase { + private static final String EMAIL_TEMPLATE_DIR = "src/app/code/Foo/Bar/view/%s/email"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EMAIL_TEMPLATE_FILE_NAME_HTML = "custom_email_template_html"; + private static final String EMAIL_TEMPLATE_FILE_NAME_TEXT = "custom_email_template_text"; + private static final String EMAIL_TEMPLATE_SUBJECT_HTML = "HTML Email Template Subject"; + private static final String EMAIL_TEMPLATE_SUBJECT_TEXT = "TEXT Email Template Subject"; + + /** + * Test generating email template with HTML type. + */ + public void testGenerateEmailTemplateHtml() { + final String filePath = this.getFixturePath( + String.format( + "%s.%s", + EMAIL_TEMPLATE_FILE_NAME_HTML, + EmailTemplateHtml.HTML_FILE_EXTENSION + ) + ); + final String area = Areas.adminhtml.toString(); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiFile emailTemplateXmlFile = generateEmailTemplateHtml( + EMAIL_TEMPLATE_FILE_NAME_HTML, + EMAIL_TEMPLATE_SUBJECT_HTML, + EmailTemplateHtml.HTML_TYPE, + area + ); + + assertGeneratedFileIsCorrect( + expectedFile, + getExpectedDirectory(area), + emailTemplateXmlFile + ); + } + + /** + * Test generating email template with TEXT type. + */ + public void testGenerateEmailTemplateText() { + final String filePath = this.getFixturePath( + String.format( + "%s.%s", + EMAIL_TEMPLATE_FILE_NAME_TEXT, + EmailTemplateHtml.HTML_FILE_EXTENSION + ) + ); + final String area = Areas.frontend.toString(); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiFile emailTemplateXmlFile = generateEmailTemplateHtml( + EMAIL_TEMPLATE_FILE_NAME_TEXT, + EMAIL_TEMPLATE_SUBJECT_TEXT, + EmailTemplateHtml.TEXT_TYPE, + area + ); + + assertGeneratedFileIsCorrect( + expectedFile, + getExpectedDirectory(area), + emailTemplateXmlFile + ); + } + + /** + * Generate email template Html file. + * + * @param filename Email Template Filename + * @param subject Email Template Filename + * @param type Email Type + * @param area Area + * @return PsiFile + */ + private PsiFile generateEmailTemplateHtml( + final String filename, + final String subject, + final String type, + final String area + ) { + final Project project = myFixture.getProject(); + final EmailTemplateHtmlData emailTemplatesData = new EmailTemplateHtmlData( + MODULE_NAME, + filename, + area, + subject, + type + ); + final ModuleEmailTemplateHtmlGenerator generator = new ModuleEmailTemplateHtmlGenerator( + emailTemplatesData, + project + ); + + return generator.generate("test"); + } + + private String getExpectedDirectory(final String area) { + return String.format(EMAIL_TEMPLATE_DIR, area); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplatesXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplatesXmlGeneratorTest.java new file mode 100644 index 000000000..17d82a941 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleEmailTemplatesXmlGeneratorTest.java @@ -0,0 +1,116 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.EmailTemplatesXmlData; +import com.magento.idea.magento2plugin.magento.files.EmailTemplateHtml; +import com.magento.idea.magento2plugin.magento.files.EmailTemplatesXml; +import com.magento.idea.magento2plugin.magento.packages.Areas; + +public class ModuleEmailTemplatesXmlGeneratorTest extends BaseGeneratorTestCase { + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EMAIL_TEMPLATE_ID_HTML = "custom_email_template_html"; + private static final String EMAIL_TEMPLATE_LABEL_HTML = "Custom Email Template HTML"; + private static final String EMAIL_TEMPLATE_FILE_NAME_HTML = "custom_email_template_html"; + private static final String EMAIL_TEMPLATE_ID_TEXT = "custom_email_template_text"; + private static final String EMAIL_TEMPLATE_LABEL_TEXT = "Custom Email Template TEXT"; + private static final String EMAIL_TEMPLATE_FILE_NAME_TEXT = "custom_email_template_text"; + + /** + * Test generating email template configuration with HTML type. + */ + public void testGenerateEmailTemplateHtmlXml() { + final String filePath = this.getFixturePath(EmailTemplatesXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiFile emailTemplateXmlFile = addEmailTemplateXml( + EMAIL_TEMPLATE_ID_HTML, + EMAIL_TEMPLATE_LABEL_HTML, + EMAIL_TEMPLATE_FILE_NAME_HTML, + EmailTemplateHtml.HTML_TYPE, + Areas.adminhtml.toString() + ); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, emailTemplateXmlFile); + } + + /** + * Test generating email template configuration with TEXT type. + */ + public void testGenerateEmailTemplateTextXml() { + final String filePath = this.getFixturePath(EmailTemplatesXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiFile emailTemplateXmlFile = addEmailTemplateXml( + EMAIL_TEMPLATE_ID_TEXT, + EMAIL_TEMPLATE_LABEL_TEXT, + EMAIL_TEMPLATE_FILE_NAME_TEXT, + EmailTemplateHtml.TEXT_TYPE, + Areas.frontend.toString() + ); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, emailTemplateXmlFile); + } + + /** + * Test adding two email templates to email_templates.xml. + */ + public void testAddTwoEmailTemplatesToEmailTemplatesXmlFile() { + final String filePath = this.getFixturePath(EmailTemplatesXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + addEmailTemplateXml( + EMAIL_TEMPLATE_ID_HTML, + EMAIL_TEMPLATE_LABEL_HTML, + EMAIL_TEMPLATE_FILE_NAME_HTML, + EmailTemplateHtml.HTML_TYPE, + Areas.adminhtml.toString() + ); + final PsiFile emailTemplateXmlFile = addEmailTemplateXml( + EMAIL_TEMPLATE_ID_TEXT, + EMAIL_TEMPLATE_LABEL_TEXT, + EMAIL_TEMPLATE_FILE_NAME_TEXT, + EmailTemplateHtml.TEXT_TYPE, + Areas.frontend.toString() + ); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, emailTemplateXmlFile); + } + + /** + * Add email template XML. + * + * @param emailTemplateId Email Template ID + * @param label Email Template Label + * @param filename Email Template Filename + * @param type Email Type + * @param area Area + * @return PsiFile + */ + private PsiFile addEmailTemplateXml( + final String emailTemplateId, + final String label, + final String filename, + final String type, + final String area + ) { + final Project project = myFixture.getProject(); + final EmailTemplatesXmlData emailTemplatesData = new EmailTemplatesXmlData( + MODULE_NAME, + emailTemplateId, + label, + filename, + type, + area + ); + final ModuleEmailTemplatesXmlGenerator generator = new ModuleEmailTemplatesXmlGenerator( + emailTemplatesData, + project + ); + + return generator.generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleGraphQlResolverClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleGraphQlResolverClassGeneratorTest.java new file mode 100644 index 000000000..a8b955820 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleGraphQlResolverClassGeneratorTest.java @@ -0,0 +1,38 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.GraphQlResolverFileData; + +public class ModuleGraphQlResolverClassGeneratorTest extends BaseGeneratorTestCase { + + public void testGenerateModuleGraphQlResolverClassFile() + { + Project project = myFixture.getProject(); + GraphQlResolverFileData graphQlResolverFileData = new GraphQlResolverFileData( + "Model", + "TestResolver", + "Foo_Bar", + "Foo\\Bar\\Model\\TestResolver", + "Foo\\Bar\\Model" + ); + ModuleGraphQlResolverClassGenerator graphQlResolverClassGenerator = new ModuleGraphQlResolverClassGenerator( + graphQlResolverFileData, + project + ); + PsiFile graphQlResolverFile = graphQlResolverClassGenerator.generate("test"); + + String filePath = this.getFixturePath("TestResolver.php"); + PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Model", + graphQlResolverFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java new file mode 100644 index 000000000..b673ced26 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleModelGeneratorTest.java @@ -0,0 +1,62 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ModelData; + +public class ModuleModelGeneratorTest extends BaseGeneratorTestCase { + + private static final String EXPECTED_DIR = "src/app/code/Foo/Bar/Model"; + + /** + * Test generation of model file. + */ + public void testGenerateFile() { + final Project project = myFixture.getProject(); + final ModelData modelData = new ModelData( + "Foo_Bar", + "my_table", + "TestModel", + "TestResource" + ); + final ModuleModelGenerator generator = new ModuleModelGenerator( + modelData, + project + ); + final PsiFile modelFile = generator.generate("test"); + final String filePath = this.getFixturePath("TestModel.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIR, + modelFile + ); + } + + /** + * Test generation of model file where resource model name equal to the model name. + */ + public void testGenerateWithTheSameNameForResourceModel() { + final PsiFile modelFile = new ModuleModelGenerator( + new ModelData( + "Foo_Bar", + "my_table", + "Test", + "Test" + ), + myFixture.getProject() + ).generate("test"); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(this.getFixturePath("Test.php")), + EXPECTED_DIR, + modelFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleObserverGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleObserverGeneratorTest.java new file mode 100644 index 000000000..e7d3d70e4 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleObserverGeneratorTest.java @@ -0,0 +1,41 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.ModuleObserverData; +import com.magento.idea.magento2plugin.magento.files.ModuleObserverFile; + +public final class ModuleObserverGeneratorTest extends BaseGeneratorTestCase { + + private static final String CLASS_NAME = "TestClassObserver"; + + /** + * Test module README.md file generation. + */ + public void testGenerateModuleObserverFile() { + final PsiFile expectedFile = myFixture.configureByFile( + getFixturePath(CLASS_NAME + ModuleObserverFile.EXTENSION) + ); + final ModuleObserverGenerator generator = new ModuleObserverGenerator( + new ModuleObserverData( + "Foo", + "Bar", + "Foo\\Bar\\Observer", + "test_event_name", + getProjectDirectory(), + CLASS_NAME + ), + myFixture.getProject() + ); + final PsiFile generatedFile = generator.generate("test"); + + assertGeneratedFileIsCorrect( + expectedFile, + generatedFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java new file mode 100644 index 000000000..d4c130cf8 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleReadmeMdGeneratorTest.java @@ -0,0 +1,36 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ModuleReadmeMdData; +import com.magento.idea.magento2plugin.magento.files.ModuleReadmeMdFile; + +public final class ModuleReadmeMdGeneratorTest extends BaseGeneratorTestCase { + + /** + * Test module README.md file generation. + */ + public void testGenerateModuleReadmeMdFile() { + final PsiFile expectedFile = myFixture.configureByFile( + getFixturePath(ModuleReadmeMdFile.FILE_NAME) + ); + final ModuleReadmeMdGenerator generator = new ModuleReadmeMdGenerator( + new ModuleReadmeMdData( + "Foo", + "Bar", + getProjectDirectory() + ), + myFixture.getProject() + ); + final PsiFile generatedFile = generator.generate("test"); + + assertGeneratedFileIsCorrect( + expectedFile, + generatedFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleRegistrationPhpGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleRegistrationPhpGeneratorTest.java new file mode 100644 index 000000000..9ab1decfd --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleRegistrationPhpGeneratorTest.java @@ -0,0 +1,69 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ModuleRegistrationPhpData; +import com.magento.idea.magento2plugin.magento.files.RegistrationPhp; + +public class ModuleRegistrationPhpGeneratorTest extends BaseGeneratorTestCase { + + /** + * Test for generation of registration.php file. + */ + public void testGenerateRegistrationPhpFile() { + final String filePath = this.getFixturePath(RegistrationPhp.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final PsiDirectory projectDir = getProjectDirectory(); + final ModuleRegistrationPhpData moduleRegistrationPhpData = new ModuleRegistrationPhpData( + "Foo", + "Bar", + projectDir, + true + ); + final ModuleRegistrationPhpGenerator moduleRegistrationPhpGenerator + = new ModuleRegistrationPhpGenerator( + moduleRegistrationPhpData, + project + ); + final PsiFile registrationPhp = moduleRegistrationPhpGenerator.generate("test"); + assertGeneratedFileIsCorrect( + expectedFile, + projectDir.getVirtualFile().getPath() + "/Foo/Bar", + registrationPhp + ); + } + + /** + * Test for generation of registration.php file for a module project. + */ + public void testGenerateRegistrationPhpFileInRoot() { + final String filePath = this.getFixturePath(RegistrationPhp.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final PsiDirectory projectDir = getProjectDirectory(); + final ModuleRegistrationPhpData moduleRegistrationPhpData = new ModuleRegistrationPhpData( + "Foo", + "Bar", + projectDir, + false + ); + final ModuleRegistrationPhpGenerator moduleRegistrationPhpGenerator + = new ModuleRegistrationPhpGenerator( + moduleRegistrationPhpData, + project + ); + final PsiFile registrationPhp = moduleRegistrationPhpGenerator.generate("test"); + assertGeneratedFileIsCorrect( + expectedFile, + projectDir.getVirtualFile().getPath(), + registrationPhp + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java new file mode 100644 index 000000000..d73fce143 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleResourceModelGeneratorTest.java @@ -0,0 +1,81 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; +import com.magento.idea.magento2plugin.actions.generation.data.ResourceModelData; +import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; + +public class ModuleResourceModelGeneratorTest extends BaseGeneratorTestCase { + + private static final String EXPECTED_DIR = "src/app/code/Foo/Bar/Model/ResourceModel"; + private static final String ENTITY_ID_COLUMN = "entity_id"; + private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\EntityData"; + + @Override + public void setUp() throws Exception { + super.setUp(); + final EntityCreatorContext context = new EntityCreatorContext(); + context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); + context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID_COLUMN); + GenerationContextRegistry.getInstance().setContext(context); + } + + /** + * Test generation of resource model file. + */ + public void testGenerateFile() { + GenerationContextRegistry.getInstance().setContext(null); + final Project project = myFixture.getProject(); + final ResourceModelData resourceModelData = new ResourceModelData( + "Foo_Bar", + "my_table", + "TestResourceModel", + ENTITY_ID_COLUMN + ); + final ModuleResourceModelGenerator generator = new ModuleResourceModelGenerator( + resourceModelData, + project + ); + final PsiFile resourceModelFile = generator.generate("test"); + final String filePath = this.getFixturePath("TestResourceModel.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIR, + resourceModelFile + ); + } + + /** + * Test generation of resource model file with reference to entity id column. + */ + public void testGenerateFileWithDtoReference() { + final Project project = myFixture.getProject(); + final ResourceModelData resourceModelData = new ResourceModelData( + "Foo_Bar", + "my_table", + "TestResourceModel", + ENTITY_ID_COLUMN + ); + final ModuleResourceModelGenerator generator = new ModuleResourceModelGenerator( + resourceModelData, + project + ); + final PsiFile resourceModelFile = generator.generate("test"); + final String filePath = this.getFixturePath("TestResourceModel.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIR, + resourceModelFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleSetupDataPatchGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleSetupDataPatchGeneratorTest.java new file mode 100644 index 000000000..956f1ebf2 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleSetupDataPatchGeneratorTest.java @@ -0,0 +1,40 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.ModuleSetupDataPatchData; +import com.magento.idea.magento2plugin.magento.files.ModuleSetupDataPatchFile; + +public final class ModuleSetupDataPatchGeneratorTest extends BaseGeneratorTestCase { + + private static final String CLASS_NAME = "TestClassPatch"; + + /** + * Test module README.md file generation. + */ + public void testGenerateModuleSetupDataPatchFile() { + final PsiFile expectedFile = myFixture.configureByFile( + getFixturePath(CLASS_NAME + ModuleSetupDataPatchFile.EXTENSION) + ); + final ModuleSetupDataPatchGenerator generator = new ModuleSetupDataPatchGenerator( + new ModuleSetupDataPatchData( + "Foo", + "Bar", + getProjectDirectory(), + CLASS_NAME + + ), + myFixture.getProject() + ); + final PsiFile generatedFile = generator.generate("test"); + + assertGeneratedFileIsCorrect( + expectedFile, + generatedFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleViewModelClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleViewModelClassGeneratorTest.java new file mode 100644 index 000000000..ab8b38b0f --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleViewModelClassGeneratorTest.java @@ -0,0 +1,37 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ViewModelFileData; + +public class ModuleViewModelClassGeneratorTest extends BaseGeneratorTestCase { + + public void testGenerateViewModelFile() { + Project project = myFixture.getProject(); + + ViewModelFileData viewModelData = new ViewModelFileData( + "ViewModel", + "TestViewModel", + "Foo_Bar", + "Foo\\Bar\\ViewModel" + ); + ModuleViewModelClassGenerator moduleViewModelClassGenerator = new ModuleViewModelClassGenerator( + viewModelData, + project + ); + PsiFile viewModelFile = moduleViewModelClassGenerator.generate("test"); + + String filePath = this.getFixturePath("TestViewModel.php"); + PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/ViewModel", + viewModelFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorHaveSetupVersionTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorHaveSetupVersionTest.java new file mode 100644 index 000000000..4a0fc2498 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorHaveSetupVersionTest.java @@ -0,0 +1,44 @@ +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ModuleXmlData; +import com.magento.idea.magento2plugin.magento.files.ModuleXml; +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.magento.packages.Package; +import java.util.Arrays; + +public class ModuleXmlGeneratorHaveSetupVersionTest extends BaseGeneratorTestCase { + + /** + * Test checks whether module.xml is generated correctly. + */ + public void testGenerateModuleFile() { + final String filePath = this.getFixturePath(ModuleXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiDirectory projectDir = getProjectDirectory(); + + final Project project = myFixture.getProject(); + final ModuleXmlData moduleXmlData = new ModuleXmlData( + "Test", + "Module1", + "1.0.0", + projectDir, + Arrays.asList("Magento_Catalog", "Magento_InventoryApi"), + true + ); + final ModuleXmlGenerator moduleXmlGenerator = new ModuleXmlGenerator( + moduleXmlData, + project + ); + final PsiFile moduleXml = moduleXmlGenerator.generate("test"); + + assertGeneratedFileIsCorrect( + expectedFile, + projectDir.getVirtualFile().getPath() + + "/Test/Module1" + File.separator + Package.moduleBaseAreaDir, + moduleXml + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorTest.java new file mode 100644 index 000000000..bd81f169a --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ModuleXmlGeneratorTest.java @@ -0,0 +1,80 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ModuleXmlData; +import com.magento.idea.magento2plugin.magento.files.ModuleXml; +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.magento.packages.Package; +import java.util.Arrays; + +public class ModuleXmlGeneratorTest extends BaseGeneratorTestCase { + + /** + * Test checks whether module.xml is generated correctly. + */ + public void testGenerateModuleFile() { + final String filePath = this.getFixturePath(ModuleXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiDirectory projectDir = getProjectDirectory(); + + final Project project = myFixture.getProject(); + final ModuleXmlData moduleXmlData = new ModuleXmlData( + "Test", + "Module", + null, + projectDir, + Arrays.asList("Magento_Catalog", "Magento_InventoryApi"), + true + ); + final ModuleXmlGenerator moduleXmlGenerator = new ModuleXmlGenerator( + moduleXmlData, + project + ); + final PsiFile moduleXml = moduleXmlGenerator.generate("test"); + + assertGeneratedFileIsCorrect( + expectedFile, + projectDir.getVirtualFile().getPath() + + "/Test/Module" + File.separator + Package.moduleBaseAreaDir, + moduleXml + ); + } + + /** + * Test checks whether module.xml is generated + * correctly for module as a separate project. + */ + public void testGenerateFileInRoot() { + final String filePath = this.getFixturePath(ModuleXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final PsiDirectory projectDir = getProjectDirectory(); + + final Project project = myFixture.getProject(); + final ModuleXmlData moduleXmlData = new ModuleXmlData( + "Test", + "Module", + null, + projectDir, + Arrays.asList("Magento_Catalog", "Magento_InventoryApi"), + false + ); + final ModuleXmlGenerator moduleXmlGenerator = new ModuleXmlGenerator( + moduleXmlData, + project + ); + final PsiFile moduleXml = moduleXmlGenerator.generate("test"); + + assertGeneratedFileIsCorrect( + expectedFile, + projectDir.getVirtualFile().getPath() + File.separator + Package.moduleBaseAreaDir, + moduleXml + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewActionEntityGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewActionEntityGeneratorTest.java new file mode 100644 index 000000000..ee518d05a --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewActionEntityGeneratorTest.java @@ -0,0 +1,53 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.NewActionEntityControllerFileData; +import com.magento.idea.magento2plugin.magento.files.actions.NewActionFile; + +public class NewActionEntityGeneratorTest extends BaseGeneratorTestCase { + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Company"; + private static final String EXPECTED_DIRECTORY = + "/src/app/code/Foo/Bar/Controller/Adminhtml/" + ENTITY_NAME; + private static final String NAMESPACE = + "Foo\\Bar\\Controller\\Adminhtml\\" + ENTITY_NAME; + private static final String ACL = "Foo_Bar::company_id"; + private static final String MENU = "Foo_Bar::menu_id"; + + + /** + * Test generation of NewAction controller. + */ + public void testGenerateNewActionEntityFile() { + final NewActionEntityControllerFileData newActionEntityControllerFileData = + new NewActionEntityControllerFileData( + ENTITY_NAME, + MODULE_NAME, + NAMESPACE, + ACL, + MENU + ); + final NewActionEntityControllerFileGenerator newActionEntityControllerFileGenerator = + new NewActionEntityControllerFileGenerator( + newActionEntityControllerFileData, + myFixture.getProject() + ); + final PsiFile newActionEntityActionFile = + newActionEntityControllerFileGenerator.generate("test"); + final String filePath = this.getFixturePath( + new NewActionFile(MODULE_NAME, ENTITY_NAME).getFileName() + ); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIRECTORY, + newActionEntityActionFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewEntityLayoutGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewEntityLayoutGeneratorTest.java new file mode 100644 index 000000000..a7f637c95 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/NewEntityLayoutGeneratorTest.java @@ -0,0 +1,46 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.NewEntityLayoutData; +import com.magento.idea.magento2plugin.magento.files.NewEntityLayoutFile; +import com.magento.idea.magento2plugin.magento.packages.File; + +public class NewEntityLayoutGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EDIT_ACTION = "book/book/edit"; + private static final String NEW_ACTION = "book/book/new"; + + /** + * Test new entity layout file generation. + */ + public void testGenerateNewEntityLayoutFile() { + final NewEntityLayoutData data = new NewEntityLayoutData( + MODULE_NAME, + NEW_ACTION, + EDIT_ACTION + ); + final NewEntityLayoutFile file = + new NewEntityLayoutFile(data.getNewActionPath().replace(File.separator, "_")); + + final NewEntityLayoutGenerator generator = new NewEntityLayoutGenerator( + data, + myFixture.getProject(), + false + ); + final PsiFile newActionLayoutFile = generator.generate("test"); + final String filePath = this.getFixturePath(file.getFileName()); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + file.getDirectory(), + newActionLayoutFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverClassGeneratorTest.java new file mode 100644 index 000000000..6e5f87dc5 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverClassGeneratorTest.java @@ -0,0 +1,39 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ObserverFileData; + +public class ObserverClassGeneratorTest extends BaseGeneratorTestCase { + + public void testGenerateObserverClass() + { + Project project = myFixture.getProject(); + ObserverFileData observerData = new ObserverFileData( + "Observer", + "TestObserver", + "Foo_Bar", + "test_event", + "Foo\\Bar\\Observer\\TestObserver", + "Foo\\Bar\\Observer" + ); + ObserverClassGenerator observerClassGenerator = new ObserverClassGenerator( + observerData, + project + ); + PsiFile observerClassFile = observerClassGenerator.generate("test"); + + String filePath = this.getFixturePath("TestObserver.php"); + PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Observer", + observerClassFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverEventsXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverEventsXmlGeneratorTest.java new file mode 100644 index 000000000..b330d8d97 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ObserverEventsXmlGeneratorTest.java @@ -0,0 +1,117 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ObserverEventsXmlData; +import com.magento.idea.magento2plugin.magento.files.ModuleEventsXml; +import com.magento.idea.magento2plugin.magento.packages.Areas; +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.magento.packages.Package; + +public class ObserverEventsXmlGeneratorTest extends BaseGeneratorTestCase { + private static final String MODULE_NAME = "Foo_Bar"; + private static final String MODULE_DIR = "src/app/code/Foo/Bar/"; + + /** + * Test checks whether 2 events.xml is generated correctly for the base area. + */ + public void testGenerateEventsXmlInBaseAreaFile() { + final String filePath = this.getFixturePath(ModuleEventsXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final String area = Areas.base.toString(); + final PsiFile eventsXml = addEventToEventsXml( + project, + area, + "test_event", + "test_observer", + "Foo\\Bar\\Observer\\Test\\TestEventObserver" + ); + + assertGeneratedFileIsCorrect( + expectedFile, + MODULE_DIR + Package.moduleBaseAreaDir, + eventsXml + ); + } + + /** + * Test checks whether 2 events.xml is generated correctly for the adminhtml area. + */ + public void testGenerateEventsXmlInAdminhtmlAreaFile() { + final String filePath = this.getFixturePath(ModuleEventsXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final String area = Areas.adminhtml.toString(); + final PsiFile eventsXml = addEventToEventsXml( + project, + area, + "test_event", + "test_observer", + "Foo\\Bar\\Observer\\Test\\TestEventObserver" + ); + + assertGeneratedFileIsCorrect( + expectedFile, + MODULE_DIR + Package.moduleBaseAreaDir + File.separator + area, + eventsXml + ); + } + + /** + * Test checks whether 2 events.xml is generated correctly with 2 observers. + */ + public void testAddTwoObserversToOneEventsXml() { + final String filePath = this.getFixturePath(ModuleEventsXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + addEventToEventsXml( + project, + Areas.frontend.toString(), + "test_event", + "test_observer", + "Foo\\Bar\\Observer\\Test\\TestEventObserver" + ); + final PsiFile eventsXml = addEventToEventsXml( + project, + Areas.frontend.toString(), + "test_event_2", + "test_observer_2", + "Foo\\Bar\\Observer\\Test\\TestEventObserverTwo" + ); + + assertGeneratedFileIsCorrect( + expectedFile, + MODULE_DIR + Package.moduleBaseAreaDir + File.separator + Areas.frontend.toString(), + eventsXml + ); + } + + private PsiFile addEventToEventsXml( + final Project project, + final String area, + final String eventName, + final String observerName, + final String observerClassFqn + ) { + final ObserverEventsXmlData observerEventsXmlData = new ObserverEventsXmlData( + area, + MODULE_NAME, + eventName, + observerName, + observerClassFqn + ); + final ObserverEventsXmlGenerator observerEventsXmlGenerator = + new ObserverEventsXmlGenerator( + observerEventsXmlData, + project + ); + + return observerEventsXmlGenerator.generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginClassGeneratorTest.java new file mode 100644 index 000000000..f3e0e98b8 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginClassGeneratorTest.java @@ -0,0 +1,76 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.jetbrains.php.lang.psi.elements.Method; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import com.magento.idea.magento2plugin.actions.generation.data.PluginFileData; +import com.magento.idea.magento2plugin.magento.files.Plugin; +import com.magento.idea.magento2plugin.util.GetPhpClassByFQN; +import org.jetbrains.annotations.NotNull; + +public class PluginClassGeneratorTest extends BaseGeneratorTestCase { + + private static final String TARGET_CLASS_FQN = "Foo\\Bar\\Service\\SimpleService"; + private static final String TARGET_METHOD_NAME = "execute"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String PLUGIN_NAMESPACE = "Foo\\Bar\\Plugin"; + private static final String PLUGIN_FQN = "Foo\\Bar\\Plugin\\TestPlugin"; + private static final String PLUGIN_CLASS_NAME = "TestPlugin"; + private static final String PLUGIN_DIR = "Plugin"; + + /** + * Test of plugin generation. + */ + public void testGeneratePluginClassFile() { + PsiFile pluginClassFile; + addPluginToTargetClass(Plugin.PluginType.before.toString()); + addPluginToTargetClass(Plugin.PluginType.around.toString()); + pluginClassFile = addPluginToTargetClass(Plugin.PluginType.after.toString()); + + final String filePath = this.getFixturePath(PLUGIN_CLASS_NAME.concat(".php")); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Plugin", + pluginClassFile + ); + } + + /** + * Add plugins for the target class. + * + * @param pluginType String + * + * @return PsiFile + */ + private PsiFile addPluginToTargetClass(final @NotNull String pluginType) { + final Project project = myFixture.getProject(); + final PhpClass targetClass = + GetPhpClassByFQN.getInstance(project).execute(TARGET_CLASS_FQN); + final Method targetMethod = targetClass.findMethodByName(TARGET_METHOD_NAME); + + final PluginFileData pluginClass = new PluginFileData( + PLUGIN_DIR, + PLUGIN_CLASS_NAME, + pluginType, + MODULE_NAME, + targetClass, + targetMethod, + PLUGIN_FQN, + PLUGIN_NAMESPACE + ); + final PluginClassGenerator pluginClassGenerator = new PluginClassGenerator( + pluginClass, + project + ); + + return pluginClassGenerator.generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginDiXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginDiXmlGeneratorTest.java new file mode 100644 index 000000000..9358295c6 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PluginDiXmlGeneratorTest.java @@ -0,0 +1,189 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import com.magento.idea.magento2plugin.actions.generation.data.PluginDiXmlData; +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; +import com.magento.idea.magento2plugin.magento.packages.Areas; +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.magento.packages.Package; +import com.magento.idea.magento2plugin.util.GetPhpClassByFQN; + +public class PluginDiXmlGeneratorTest extends BaseGeneratorTestCase { + private static final String PLUGIN_TARGET_CLASS_ONE_FNQ + = "Foo\\Bar\\Model\\PluginTargetClassOne"; + private static final String PLUGIN_TARGET_CLASS_TWO_FNQ + = "Foo\\Bar\\Model\\PluginTargetClassTwo"; + private static final String PLUGIN_CLASS_ONE_FNQ = "Foo\\Bar\\Plugin\\TestOnePlugin"; + private static final String PLUGIN_CLASS_TWO_FNQ = "Foo\\Bar\\Plugin\\TestTwoPlugin"; + private static final String MODULE = "Foo_Bar"; + private static final String MODULE_DIR = "src/app/code/Foo/Bar/"; + private static final String TEST_PLUGIN_NAME = "test_plugin_name_1"; + + /** + * Test checks whether di.xml is generated correctly for the base area + */ + public void testGeneratePluginDiXmlFileWithoutSortOrder() { + final PsiFile expectedFile = myFixture.configureByFile( + this.getFixturePath(ModuleDiXml.FILE_NAME) + ); + final String area = Areas.base.toString(); + + final PsiFile diXml = addPluginDiXml( + PLUGIN_TARGET_CLASS_ONE_FNQ, + area, + "", + TEST_PLUGIN_NAME, + PLUGIN_CLASS_ONE_FNQ + ); + + assertGeneratedFileIsCorrect( + expectedFile, + getExpectedDirectory(area), + diXml + ); + } + + /** + * Test checks whether di.xml is generated correctly for the base area + */ + public void testGeneratePluginDiXmlFileForBaseArea() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final String area = Areas.base.toString(); + + final PsiFile diXml = addPluginDiXml( + PLUGIN_TARGET_CLASS_ONE_FNQ, + area, + "10", + TEST_PLUGIN_NAME, + PLUGIN_CLASS_ONE_FNQ + ); + + assertGeneratedFileIsCorrect( + expectedFile, + getExpectedDirectory(area), + diXml + ); + } + + /** + * Test checks whether di.xml is generated correctly for the adminhtml area + */ + public void testGeneratePluginDiXmlFileForAdminhtmlArea() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final String area = Areas.adminhtml.toString(); + + final PsiFile diXml = addPluginDiXml( + PLUGIN_TARGET_CLASS_TWO_FNQ, + area, + "20", + "test_plugin_name_2", + PLUGIN_CLASS_TWO_FNQ + ); + + assertGeneratedFileIsCorrect( + expectedFile, + getExpectedDirectory(area), + diXml + ); + } + + /** + * Test checks whether 2 di.xml is generated correctly + */ + public void testAddTwoPluginsToOneDiXml() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final String area = Areas.frontend.toString(); + addPluginDiXml( + PLUGIN_TARGET_CLASS_ONE_FNQ, + area, + "10", + TEST_PLUGIN_NAME, + PLUGIN_CLASS_ONE_FNQ + ); + final PsiFile diXml = addPluginDiXml( + PLUGIN_TARGET_CLASS_TWO_FNQ, + area, + "20", + "test_plugin_name_2", + PLUGIN_CLASS_TWO_FNQ + ); + + assertGeneratedFileIsCorrect( + expectedFile, + getExpectedDirectory(area), + diXml + ); + } + + /** + * Test checks whether 2 di.xml is generated correctly for one target clas + */ + public void testAddTwoPluginsToOneTargetClass() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final String area = Areas.frontend.toString(); + addPluginDiXml( + PLUGIN_TARGET_CLASS_ONE_FNQ, + area, + "10", + TEST_PLUGIN_NAME, + PLUGIN_CLASS_ONE_FNQ + ); + final PsiFile diXml = addPluginDiXml( + PLUGIN_TARGET_CLASS_ONE_FNQ, + area, + "20", + "test_plugin_name_2", + PLUGIN_CLASS_TWO_FNQ + ); + + assertGeneratedFileIsCorrect( + expectedFile, + getExpectedDirectory(area), + diXml + ); + } + + private PsiFile addPluginDiXml( + final String targetClassFnq, + final String area, + final String sortOrder, + final String pluginName, + final String pluginClassFnq + ) { + final Project project = myFixture.getProject(); + final PhpClass targetClass = GetPhpClassByFQN.getInstance(project).execute(targetClassFnq); + final PluginDiXmlData pluginDiXmlData = new PluginDiXmlData( + area, + MODULE, + targetClass, + sortOrder, + pluginName, + pluginClassFnq + ); + final PluginDiXmlGenerator moduleXmlGenerator = new PluginDiXmlGenerator( + pluginDiXmlData, + project + ); + + return moduleXmlGenerator.generate("test"); + } + + private String getExpectedDirectory(final String area) { + if (area.equals(Areas.base.toString())) { + return MODULE_DIR + Package.moduleBaseAreaDir; + } + + return MODULE_DIR + Package.moduleBaseAreaDir + File.separator + area; + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceClassGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceClassGeneratorTest.java new file mode 100644 index 000000000..a960d2549 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceClassGeneratorTest.java @@ -0,0 +1,127 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import com.magento.idea.magento2plugin.actions.generation.data.PreferenceFileData; +import com.magento.idea.magento2plugin.util.GetPhpClassByFQN; + +public class PreferenceClassGeneratorTest extends BaseGeneratorTestCase { + private static final String MODULE = "Foo_Bar"; + private static final String TARGET_MODEL_ONE_CLASS_FQN = "Foo\\Bar\\Model\\SimpleModelOne"; + private static final String TARGET_MODEL_TWO_CLASS_FQN = "Foo\\Bar\\Model\\SimpleModelTwo"; + + /** + * Test preference class file generation. + */ + public void testGeneratePreferenceClassFile() { + final PsiFile preferenceClassFile = createPreferenceClassFile( + TARGET_MODEL_ONE_CLASS_FQN, + "Model/Override", + "SimpleModelOneOverride", + "Foo\\Bar\\Model\\Override\\SimpleModelOneOverride", + "Foo\\Bar\\Model\\Override", + false, + false + ); + final String filePath = this.getFixturePath("SimpleModelOneOverride.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Model/Override", + preferenceClassFile + ); + } + + /** + * Test preference class file generation. + */ + public void testGeneratePreferenceInterfaceFile() { + final PsiFile preferenceClassFile = createPreferenceClassFile( + TARGET_MODEL_ONE_CLASS_FQN, + "Model", + "InterfaceOverride", + "Foo\\Bar\\Model\\InterfaceOverride", + "Foo\\Bar\\Model", + false, + true + ); + final String filePath = this.getFixturePath("InterfaceOverride.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Model", + preferenceClassFile + ); + } + + /** + * Test preference class file generation with inheritance. + */ + public void testGeneratePreferenceClassFileWithInheritance() { + final PsiFile preferenceClassFile = createPreferenceClassFile( + TARGET_MODEL_TWO_CLASS_FQN, + "Model/Override", + "SimpleModelTwoOverride", + "Foo\\Bar\\Model\\Override\\SimpleModelTwoOverride", + "Foo\\Bar\\Model\\Override", + true, + false + ); + final String filePath = this.getFixturePath("SimpleModelTwoOverride.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Model/Override", + preferenceClassFile + ); + } + + /** + * Create preference class file. + * + * @param targetClassFnq Target Class FQN + * @param preferenceDirectory Preference Directory + * @param preferenceClassName Preference Class Name + * @param preferenceFqn Preference FQN + * @param namespace Namespace + * @param inheritClass Inherit target class + * @return PsiFile + */ + private PsiFile createPreferenceClassFile( + final String targetClassFnq, + final String preferenceDirectory, + final String preferenceClassName, + final String preferenceFqn, + final String namespace, + final Boolean inheritClass, + final Boolean isInterface + ) { + final Project project = myFixture.getProject(); + final PhpClass targetClass = GetPhpClassByFQN.getInstance(project).execute(targetClassFnq); + final PreferenceFileData preferenceFileData = new PreferenceFileData( + preferenceDirectory, + preferenceClassName, + MODULE, + targetClass, + preferenceFqn, + namespace, + inheritClass, + isInterface + ); + final PreferenceClassGenerator preferenceClassGenerator = new PreferenceClassGenerator( + preferenceFileData, + project + ); + + return preferenceClassGenerator.generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceDiXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceDiXmlGeneratorTest.java new file mode 100644 index 000000000..ef04e5ec9 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/PreferenceDiXmlGeneratorTest.java @@ -0,0 +1,138 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.PreferenceDiXmFileData; +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; +import com.magento.idea.magento2plugin.magento.packages.Areas; +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.magento.packages.Package; + +public class PreferenceDiXmlGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE = "Foo_Bar"; + private static final String MODULE_DIR = "src/app/code/Foo/Bar/"; + private static final String TARGET_MODEL_ONE_CLASS_FQN = "Foo\\Bar\\Model\\SimpleModelOne"; + private static final String TARGET_MODEL_TWO_CLASS_FQN = "Foo\\Bar\\Model\\SimpleModelTwo"; + + /** + * Test preference DI XML file generation. + */ + public void testGeneratePreferenceDiXml() { + final String area = Areas.base.toString(); + final PsiFile preferenceDiXmlFile = addPreferenceDiXml( + TARGET_MODEL_ONE_CLASS_FQN, + "Foo\\Bar\\Model\\Override\\SimpleModelOne", + area + ); + + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + getExpectedDirectory(area), + preferenceDiXmlFile + ); + } + + /** + * Test preference DI XML file generation for adminhtml area. + */ + public void testGeneratePreferenceDiXmlForAdminhtmlArea() { + final String area = Areas.adminhtml.toString(); + final PsiFile preferenceDiXmlFile = addPreferenceDiXml( + TARGET_MODEL_TWO_CLASS_FQN, + "Foo\\Bar\\Model\\Override\\SimpleModelTwo", + area + ); + + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + getExpectedDirectory(area), + preferenceDiXmlFile + ); + } + + /** + * Test the adding of two preferences to one DI XML file. + */ + public void testAddTwoPreferencesToOneDiXmlFile() { + final String area = Areas.frontend.toString(); + addPreferenceDiXml( + TARGET_MODEL_ONE_CLASS_FQN, + "Foo\\Bar\\Model\\Override\\SimpleModelOne", + area + ); + final PsiFile preferenceDiXmlFile = addPreferenceDiXml( + TARGET_MODEL_TWO_CLASS_FQN, + "Foo\\Bar\\Model\\Override\\SimpleModelTwo", + area + ); + + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + getExpectedDirectory(area), + preferenceDiXmlFile + ); + } + + /** + * Add preference to XML file. + * + * @param targetClassFnq Target class FQN + * @param preferenceFqn Preference FQN + * @param area Area + * + * @return PsiFile + */ + private PsiFile addPreferenceDiXml( + final String targetClassFnq, + final String preferenceFqn, + final String area + ) { + final Project project = myFixture.getProject(); + final PreferenceDiXmFileData preferenceDiXmlFileData = new PreferenceDiXmFileData( + MODULE, + targetClassFnq, + preferenceFqn, + area + ); + final PreferenceDiXmlGenerator moduleXmlGenerator = new PreferenceDiXmlGenerator( + preferenceDiXmlFileData, + project + ); + + return moduleXmlGenerator.generate("test"); + } + + /** + * Get expected directory based on provided area. + * + * @param area Area name + * + * @return String + */ + private String getExpectedDirectory(final String area) { + String expectedDirectory; + + if (area.equals(Areas.base.toString())) { + expectedDirectory = MODULE_DIR + Package.moduleBaseAreaDir; + } else { + expectedDirectory = MODULE_DIR + Package.moduleBaseAreaDir + File.separator + area; + } + + return expectedDirectory; + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ProductAttributePropertySetupPatchGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ProductAttributePropertySetupPatchGeneratorTest.java new file mode 100644 index 000000000..8e05991c2 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/ProductAttributePropertySetupPatchGeneratorTest.java @@ -0,0 +1,215 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.ProductEntityData; +import com.magento.idea.magento2plugin.magento.packages.eav.AttributeScope; +import com.magento.idea.magento2plugin.magento.packages.eav.AttributeSourceModel; +import java.util.HashMap; +import java.util.Map; + +public class ProductAttributePropertySetupPatchGeneratorTest extends BaseGeneratorTestCase { + private static final String MODULE_NAME = "Foo_Bar"; + private static final String LABEL = "Test Label"; + private static final String TYPE = "static"; + private static final int SORT_ORDER = 10; + private static final String GROUP = "General"; + private static final String FILE_PATH = "src/app/code/Foo/Bar/Setup/Patch/Data"; + + /** + * Test Data patch for product's eav attribute generator. + */ + public void testGenerateFile() { + final Project project = myFixture.getProject(); + + final ProductEntityData productEntityData = new ProductEntityData(); + productEntityData.setCode("test"); + productEntityData.setVisibleInGrid(false); + productEntityData.setHtmlAllowedOnFront(false); + productEntityData.setVisibleOnFront(false); + productEntityData.setVisible(true); + productEntityData.setScope(AttributeScope.GLOBAL.getScope()); + productEntityData.setLabel(LABEL); + productEntityData.setType(TYPE); + productEntityData.setUsedInGrid(false); + productEntityData.setRequired(false); + productEntityData.setInput("text"); + productEntityData.setFilterableInGrid(false); + productEntityData.setSortOrder(SORT_ORDER); + productEntityData.setGroup(GROUP); + + productEntityData.setDataPatchName("AddTestAttribute"); + productEntityData.setModuleName(MODULE_NAME); + + final EavAttributeSetupPatchGenerator setupPatchGenerator = + new EavAttributeSetupPatchGenerator(productEntityData, project); + final PsiFile dataPatchFile = setupPatchGenerator.generate("testGenerateFile"); + + final String filePatch = this.getFixturePath("AddTestAttribute.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePatch); + + assertGeneratedFileIsCorrect(expectedFile, FILE_PATH, dataPatchFile); + } + + /** + * Tests the generated file with the boolean source model. + */ + public void testGenerateFileWithBooleanSourceModel() { + final Project project = myFixture.getProject(); + + final ProductEntityData productEntityData = new ProductEntityData(); + productEntityData.setCode("boolean_input_attribute"); + productEntityData.setVisibleInGrid(false); + productEntityData.setHtmlAllowedOnFront(false); + productEntityData.setVisibleOnFront(false); + productEntityData.setVisible(true); + productEntityData.setScope(AttributeScope.GLOBAL.getScope()); + productEntityData.setLabel(LABEL); + productEntityData.setType(TYPE); + productEntityData.setUsedInGrid(false); + productEntityData.setRequired(false); + productEntityData.setInput("boolean"); + productEntityData.setSource(AttributeSourceModel.BOOLEAN.getSource()); + productEntityData.setFilterableInGrid(false); + productEntityData.setSortOrder(SORT_ORDER); + productEntityData.setGroup(GROUP); + + productEntityData.setDataPatchName("AddBooleanInputAttributeAttribute"); + productEntityData.setModuleName(MODULE_NAME); + + final EavAttributeSetupPatchGenerator setupPatchGenerator = + new EavAttributeSetupPatchGenerator(productEntityData, project); + final PsiFile dataPatchFile = setupPatchGenerator.generate( + "testGenerateFileWithBooleanSourceModel" + ); + + final String filePatch = this.getFixturePath("AddBooleanInputAttributeAttribute.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePatch); + + assertGeneratedFileIsCorrect(expectedFile, FILE_PATH, dataPatchFile); + } + + /** + * Tests the generated file with the source model. + */ + public void testGenerateFileWithGeneratedSourceModel() { + final Project project = myFixture.getProject(); + + final ProductEntityData productEntityData = new ProductEntityData(); + productEntityData.setCode("attribute_with_custom_source"); + productEntityData.setVisibleInGrid(false); + productEntityData.setHtmlAllowedOnFront(false); + productEntityData.setVisibleOnFront(false); + productEntityData.setVisible(true); + productEntityData.setScope(AttributeScope.GLOBAL.getScope()); + productEntityData.setLabel("Test Label"); + productEntityData.setType("static"); + productEntityData.setUsedInGrid(false); + productEntityData.setRequired(false); + productEntityData.setInput("text"); + productEntityData.setSource("\\Foo\\Bar\\Model\\Source\\AttributeWithCustomSource"); + productEntityData.setFilterableInGrid(false); + productEntityData.setSortOrder(10); + productEntityData.setGroup(GROUP); + + productEntityData.setDataPatchName("AddAttributeWithCustomSourceAttribute"); + productEntityData.setModuleName(MODULE_NAME); + + final EavAttributeSetupPatchGenerator setupPatchGenerator = + new EavAttributeSetupPatchGenerator(productEntityData, project); + final PsiFile dataPatchFile = setupPatchGenerator.generate( + "testGenerateFileWithBooleanSourceModel" + ); + + final String filePatch = this.getFixturePath("AddAttributeWithCustomSourceAttribute.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePatch); + + assertGeneratedFileIsCorrect(expectedFile, FILE_PATH, dataPatchFile); + } + + /** + * Tests file with the `apply to` attribute. + */ + public void testGenerateFileWithApplyToAttribute() { + final Project project = myFixture.getProject(); + + final ProductEntityData productEntityData = new ProductEntityData(); + productEntityData.setCode("applied_to_attribute"); + productEntityData.setVisibleInGrid(false); + productEntityData.setHtmlAllowedOnFront(false); + productEntityData.setVisibleOnFront(false); + productEntityData.setVisible(true); + productEntityData.setScope(AttributeScope.GLOBAL.getScope()); + productEntityData.setLabel("Test Label"); + productEntityData.setType("static"); + productEntityData.setUsedInGrid(false); + productEntityData.setRequired(false); + productEntityData.setInput("text"); + productEntityData.setFilterableInGrid(false); + productEntityData.setSortOrder(10); + productEntityData.setGroup(GROUP); + productEntityData.setApplyTo("configurable,simple"); + + productEntityData.setDataPatchName("AddAppliedToAttribute"); + productEntityData.setModuleName(MODULE_NAME); + + final EavAttributeSetupPatchGenerator setupPatchGenerator = + new EavAttributeSetupPatchGenerator(productEntityData, project); + final PsiFile dataPatchFile = setupPatchGenerator.generate( + "testGenerateFileWithApplyToAttribute" + ); + + final String filePatch = this.getFixturePath("AddAppliedToAttribute.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePatch); + + assertGeneratedFileIsCorrect(expectedFile, FILE_PATH, dataPatchFile); + } + + /** + * Tests file with options. + */ + public void testGenerateFileWithOptions() { + final Project project = myFixture.getProject(); + + final ProductEntityData productEntityData = new ProductEntityData(); + productEntityData.setVisibleInGrid(false); + productEntityData.setHtmlAllowedOnFront(false); + productEntityData.setVisibleOnFront(false); + productEntityData.setVisible(true); + productEntityData.setScope(AttributeScope.GLOBAL.getScope()); + productEntityData.setCode("attribute_with_options"); + productEntityData.setLabel("Attribute With Options"); + productEntityData.setType("varchar"); + productEntityData.setUsedInGrid(false); + productEntityData.setRequired(false); + productEntityData.setInput("multiselect"); + productEntityData.setSource(AttributeSourceModel.NULLABLE_SOURCE.getSource()); + productEntityData.setFilterableInGrid(false); + productEntityData.setSortOrder(10); + productEntityData.setGroup(GROUP); + + final Map options = new HashMap<>(); + options.put(0, "option1"); + options.put(1, "option2"); + options.put(2, "option3"); + + productEntityData.setOptions(options); + + productEntityData.setDataPatchName("AddAttributeWithOptionsAttribute"); + productEntityData.setModuleName(MODULE_NAME); + + final EavAttributeSetupPatchGenerator setupPatchGenerator = + new EavAttributeSetupPatchGenerator(productEntityData, project); + final PsiFile dataPatchFile = setupPatchGenerator.generate("testGenerateFileWithOptions"); + + final String filePatch = this.getFixturePath("AddAttributeWithOptionsAttribute.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePatch); + + assertGeneratedFileIsCorrect(expectedFile, FILE_PATH, dataPatchFile); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueryModelGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueryModelGeneratorTest.java new file mode 100644 index 000000000..c13c49efc --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueryModelGeneratorTest.java @@ -0,0 +1,46 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.magento.idea.magento2plugin.actions.generation.data.GetListQueryModelData; +import com.magento.idea.magento2plugin.magento.files.queries.GetListQueryFile; + +public class QueryModelGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Book"; + private static final String MODEL_NAME = "Book"; + private static final String COLLECTION_NAME = "Collection"; + private static final String ACL = "Foo_Bar::book_management"; + + /** + * Test generation of GetListQuery model for entity. + */ + public void testGenerateGetListQueryModelFile() { + final GetListQueryFile file = new GetListQueryFile(MODULE_NAME, ENTITY_NAME); + final GetListQueryModelData getListQueryModelData = new GetListQueryModelData( + MODULE_NAME, + ENTITY_NAME, + MODEL_NAME, + COLLECTION_NAME, + ACL, + false + ); + final GetListQueryModelGenerator getListQueryModelGenerator = + new GetListQueryModelGenerator( + getListQueryModelData, + myFixture.getProject(), + false + ); + final String filePath = this.getFixturePath(file.getFileName()); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + file.getDirectory(), + getListQueryModelGenerator.generate("test") + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueCommunicationGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueCommunicationGeneratorTest.java new file mode 100644 index 000000000..72b53a621 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueCommunicationGeneratorTest.java @@ -0,0 +1,44 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.NewMessageQueueAction; +import com.magento.idea.magento2plugin.actions.generation.data.QueueCommunicationData; +import com.magento.idea.magento2plugin.magento.files.QueueCommunicationXml; + +public class QueueCommunicationGeneratorTest extends BaseGeneratorTestCase { + private static final String TOPIC_NAME = "topic.name"; + private static final String HANDLER_NAME = "handlerName"; + private static final String HANDLER_TYPE = "Foo\\Bar\\Model\\Handler"; + private static final String HANDLER_METHOD = "execute"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + + /** + * Tests for generation of communication.xml file. + */ + public void testGenerateCommunicationXmlFile() { + final String filePath = this.getFixturePath(QueueCommunicationXml.fileName); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final QueueCommunicationGenerator communicationGenerator = new QueueCommunicationGenerator( + project, + new QueueCommunicationData( + TOPIC_NAME, + HANDLER_NAME, + HANDLER_TYPE, + HANDLER_METHOD, + MODULE_NAME + ) + ); + + final PsiFile file = communicationGenerator.generate(NewMessageQueueAction.ACTION_NAME); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueConsumerGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueConsumerGeneratorTest.java new file mode 100644 index 000000000..7b2813ed2 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueConsumerGeneratorTest.java @@ -0,0 +1,74 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.NewMessageQueueAction; +import com.magento.idea.magento2plugin.actions.generation.data.QueueConsumerData; +import com.magento.idea.magento2plugin.magento.files.QueueConsumerXml; + +public class QueueConsumerGeneratorTest extends BaseGeneratorTestCase { + private static final String CONSUMER_NAME = "consumer.name"; + private static final String QUEUE_NAME = "queue.name"; + private static final String CONSUMER_TYPE = "Foo\\Bar\\Model\\Consumer"; + private static final String MAX_MESSAGES = "100"; + private static final String CONNECTION_AMPQ = "amqp"; + private static final String CONNECTION_DB = "db"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + private static final String HANDLER = "Foo/Bar/Handler.php::execute"; + + /** + * Tests for generation of queue_consumer.xml file for the DB connection type. + */ + public void testGenerateConsumerDbXmlFile() { + final String filePath = this.getFixturePath(QueueConsumerXml.fileName); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final QueueConsumerGenerator consumerGenerator = new QueueConsumerGenerator( + project, + new QueueConsumerData( + CONSUMER_NAME, + QUEUE_NAME, + CONSUMER_TYPE, + MAX_MESSAGES, + CONNECTION_DB, + MODULE_NAME, + HANDLER + ) + ); + + final PsiFile file = consumerGenerator.generate(NewMessageQueueAction.ACTION_NAME); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } + + /** + * Tests for generation of queue_consumer.xml file for the AMPQ connection type. + */ + public void testGenerateConsumerAmpqXmlFile() { + final String filePath = this.getFixturePath(QueueConsumerXml.fileName); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final QueueConsumerGenerator consumerGenerator = new QueueConsumerGenerator( + project, + new QueueConsumerData( + CONSUMER_NAME, + QUEUE_NAME, + CONSUMER_TYPE, + MAX_MESSAGES, + CONNECTION_AMPQ, + MODULE_NAME, + HANDLER + ) + ); + + final PsiFile file = consumerGenerator.generate(NewMessageQueueAction.ACTION_NAME); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueuePublisherGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueuePublisherGeneratorTest.java new file mode 100644 index 000000000..f761c65e2 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueuePublisherGeneratorTest.java @@ -0,0 +1,42 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.NewMessageQueueAction; +import com.magento.idea.magento2plugin.actions.generation.data.QueuePublisherData; +import com.magento.idea.magento2plugin.magento.files.QueuePublisherXml; + +public class QueuePublisherGeneratorTest extends BaseGeneratorTestCase { + private static final String EXCHANGE_NAME = "exchange-name"; + private static final String TOPIC_NAME = "topic.name"; + private static final String CONNECTION_NAME = "amqp"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + + /** + * Tests for generation of queue_publisher.xml file. + */ + public void testGeneratePublisherXmlFile() { + final String filePath = this.getFixturePath(QueuePublisherXml.fileName); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final QueuePublisherGenerator publisherGenerator = new QueuePublisherGenerator( + project, + new QueuePublisherData( + TOPIC_NAME, + CONNECTION_NAME, + EXCHANGE_NAME, + MODULE_NAME + ) + ); + + final PsiFile file = publisherGenerator.generate(NewMessageQueueAction.ACTION_NAME); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueTopologyGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueTopologyGeneratorTest.java new file mode 100644 index 000000000..df01ec4f4 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/QueueTopologyGeneratorTest.java @@ -0,0 +1,46 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.NewMessageQueueAction; +import com.magento.idea.magento2plugin.actions.generation.data.QueueTopologyData; +import com.magento.idea.magento2plugin.magento.files.QueueTopologyXml; + +public class QueueTopologyGeneratorTest extends BaseGeneratorTestCase { + private static final String EXCHANGE_NAME = "exchange-name"; + private static final String BINDING_ID = "bindingId"; + private static final String BINDING_TOPIC = "topic.name"; + private static final String BINDING_QUEUE = "queue.name"; + private static final String CONNECTION_NAME = "amqp"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + + /** + * Tests for generation of queue_topology.xml file. + */ + public void testGenerateTopologyXmlFile() { + final String filePath = this.getFixturePath(QueueTopologyXml.fileName); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final QueueTopologyGenerator topologyGenerator = new QueueTopologyGenerator( + project, + new QueueTopologyData( + EXCHANGE_NAME, + CONNECTION_NAME, + BINDING_ID, + BINDING_TOPIC, + BINDING_QUEUE, + MODULE_NAME + ) + ); + + final PsiFile file = topologyGenerator.generate(NewMessageQueueAction.ACTION_NAME); + + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/RoutesXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/RoutesXmlGeneratorTest.java new file mode 100644 index 000000000..4cae3306d --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/RoutesXmlGeneratorTest.java @@ -0,0 +1,40 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.RoutesXmlData; +import com.magento.idea.magento2plugin.magento.files.RoutesXml; +import com.magento.idea.magento2plugin.magento.packages.Areas; + +public class RoutesXmlGeneratorTest extends BaseGeneratorTestCase { + + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc/adminhtml"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ROUTE = "customroute"; + + /** + * Test generating routes XML file. + */ + public void testGenerateRoutesXmlFile() { + final String filePath = this.getFixturePath(RoutesXml.FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + final RoutesXmlData routesXmlData = new RoutesXmlData( + Areas.adminhtml.toString(), + ROUTE, + MODULE_NAME + ); + final RoutesXmlGenerator routesXmlGenerator = new RoutesXmlGenerator( + routesXmlData, + project + ); + + final PsiFile file = routesXmlGenerator.generate("test"); + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityActionGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityActionGeneratorTest.java new file mode 100644 index 000000000..9df4db4b0 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityActionGeneratorTest.java @@ -0,0 +1,90 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.SaveEntityControllerFileData; +import com.magento.idea.magento2plugin.magento.files.actions.SaveActionFile; + +public class SaveEntityActionGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Company"; + private static final String DTO_NAME = "CompanyData"; + private static final String DTO_TYPE_INTERFACE = "CompanyInterface"; + private static final String EXPECTED_DIRECTORY = + "/src/app/code/Foo/Bar/Controller/Adminhtml/" + ENTITY_NAME; + private static final String ACL = "Foo_Bar::company_id"; + private static final String ENTITY_ID = "company_id"; + + /** + * Test generation of Save controller for entity without interface. + */ + public void testGenerateSaveEntityActionWithoutInterfaceFile() { + final SaveEntityControllerFileData saveEntityControllerFileData = + new SaveEntityControllerFileData( + ENTITY_NAME, + MODULE_NAME, + ACL, + ENTITY_ID, + DTO_NAME, + "", + false, + false + ); + final SaveEntityControllerFileGenerator saveEntityControllerFileGenerator = + new SaveEntityControllerFileGenerator( + saveEntityControllerFileData, + myFixture.getProject(), + false + ); + final PsiFile saveEntityActionFile = saveEntityControllerFileGenerator.generate("test"); + final String filePath = this.getFixturePath( + new SaveActionFile(MODULE_NAME, ENTITY_NAME).getFileName() + ); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIRECTORY, + saveEntityActionFile + ); + } + + /** + * Test generation of Save controller for entity with interface. + */ + public void testGenerateSaveEntityActionWithInterfaceFile() { + final SaveEntityControllerFileData saveEntityControllerFileData = + new SaveEntityControllerFileData( + ENTITY_NAME, + MODULE_NAME, + ACL, + ENTITY_ID, + DTO_NAME, + DTO_TYPE_INTERFACE, + true, + false + ); + final SaveEntityControllerFileGenerator saveEntityControllerFileGenerator = + new SaveEntityControllerFileGenerator( + saveEntityControllerFileData, + myFixture.getProject(), + false + ); + final PsiFile saveEntityActionFile = saveEntityControllerFileGenerator.generate("test"); + final String filePath = this.getFixturePath( + new SaveActionFile(MODULE_NAME, ENTITY_NAME).getFileName() + ); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIRECTORY, + saveEntityActionFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityCommandGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityCommandGeneratorTest.java new file mode 100644 index 000000000..abc1c1eb2 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SaveEntityCommandGeneratorTest.java @@ -0,0 +1,54 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.magento.idea.magento2plugin.actions.generation.data.SaveEntityCommandData; +import com.magento.idea.magento2plugin.magento.files.commands.SaveEntityCommandFile; + +public class SaveEntityCommandGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Book"; + private static final String ENTITY_ID = "book_id"; + private static final String MODEL_NAME = ENTITY_NAME + "Model"; + private static final String RESOURCE_MODEL_NAME = ENTITY_NAME + "Resource"; + private static final String DTO_NAME = ENTITY_NAME + "Data"; + private static final boolean IS_DTO_HAS_INTERFACE = false; + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Command/" + ENTITY_NAME; + private static final String ACL = "Foo_Bar::book_management"; + + /** + * Test generation of SaveCommand model for entity. + */ + public void testGenerateSaveEntityCommandFile() { + final SaveEntityCommandData saveEntityCommandData = new SaveEntityCommandData( + MODULE_NAME, + ENTITY_NAME, + ENTITY_ID, + MODEL_NAME, + RESOURCE_MODEL_NAME, + DTO_NAME, + "", + IS_DTO_HAS_INTERFACE, + ACL + ); + final SaveEntityCommandGenerator saveEntityCommandGenerator = + new SaveEntityCommandGenerator( + saveEntityCommandData, + myFixture.getProject(), + false + ); + final String filePath = this.getFixturePath( + new SaveEntityCommandFile(MODULE_NAME, ENTITY_NAME).getFileName() + ); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + EXPECTED_DIRECTORY, + saveEntityCommandGenerator.generate("test") + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SearchResultsFilesGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SearchResultsFilesGeneratorTest.java new file mode 100644 index 000000000..6dbd48525 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SearchResultsFilesGeneratorTest.java @@ -0,0 +1,102 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.php.SearchResultsData; +import com.magento.idea.magento2plugin.actions.generation.generator.php.SearchResultsGenerator; +import com.magento.idea.magento2plugin.actions.generation.generator.php.SearchResultsInterfaceGenerator; +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; +import com.magento.idea.magento2plugin.magento.files.SearchResultsFile; +import com.magento.idea.magento2plugin.magento.files.SearchResultsInterfaceFile; +import com.magento.idea.magento2plugin.magento.packages.Package; +import java.util.Objects; + +public class SearchResultsFilesGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String MODULE_ROOT_DIR = "src/app/code/Foo/Bar/"; + private static final String ENTITY_NAME = "Book"; + private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; + private static final String INTERFACE_EXPECTED_DIRECTORY = MODULE_ROOT_DIR + "Api/Data"; + private static final String IMPL_EXPECTED_DIRECTORY = MODULE_ROOT_DIR + "Model"; + private PsiFile interfaceFile; + private PsiFile classFile; + private PsiFile preferenceFile; + + @Override + public void setUp() throws Exception { + super.setUp(); + + final SearchResultsData searchResultsData = new SearchResultsData( + MODULE_NAME, + ENTITY_NAME, + ENTITY_DTO_TYPE + ); + classFile = new SearchResultsGenerator( + searchResultsData, + myFixture.getProject(), + false + ).generate("test"); + + final SearchResultsInterfaceGenerator interfaceGenerator = + new SearchResultsInterfaceGenerator( + searchResultsData, + myFixture.getProject(), + false + ); + interfaceFile = interfaceGenerator.generate("test"); + preferenceFile = interfaceGenerator.getPreferenceFile(); + } + + /** + * Test generation of search results interface for entity. + */ + public void testGenerateSearchResultsInterfaceFile() { + Objects.requireNonNull(interfaceFile); + + final String filePath = this.getFixturePath( + new SearchResultsInterfaceFile(MODULE_NAME, ENTITY_NAME).getFileName() + ); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + INTERFACE_EXPECTED_DIRECTORY, + interfaceFile + ); + } + + /** + * Test generation of search results class for entity. + */ + public void testGenerateSearchResultsFile() { + Objects.requireNonNull(classFile); + + final String filePath = this.getFixturePath( + new SearchResultsFile(MODULE_NAME, ENTITY_NAME).getFileName() + ); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(filePath), + IMPL_EXPECTED_DIRECTORY, + classFile + ); + } + + /** + * Test generation of search results preference for entity. + */ + public void testGenerateSearchResultsDiPreference() { + Objects.requireNonNull(interfaceFile); + Objects.requireNonNull(preferenceFile); + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(this.getFixturePath(ModuleDiXml.FILE_NAME)), + Package.moduleBaseAreaDir, + preferenceFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SourceModelGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SourceModelGeneratorTest.java new file mode 100644 index 000000000..76c059190 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/SourceModelGeneratorTest.java @@ -0,0 +1,61 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.SourceModelData; + +public class SourceModelGeneratorTest extends BaseGeneratorTestCase { + private static final String MODULE_NAME = "Foo_Bar"; + + /** + * Test source model generation. + */ + public void testGenerateFile() { + final Project project = myFixture.getProject(); + + final SourceModelData sourceModelData = new SourceModelData(); + sourceModelData.setClassName("CustomSourceModel"); + sourceModelData.setModuleName(MODULE_NAME); + + final SourceModelGenerator sourceModelGeneratorGenerator = + new SourceModelGenerator(sourceModelData, project); + final PsiFile dataPatchFile = sourceModelGeneratorGenerator.generate("test"); + final String filePatch = this.getFixturePath("CustomSourceModel.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePatch); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Model/Source", + dataPatchFile + ); + } + + /** + * Test source model in custom directory generation. + */ + public void testGenerateFileInCustomDirectory() { + final Project project = myFixture.getProject(); + + final SourceModelData sourceModelData = new SourceModelData(); + sourceModelData.setClassName("CustomSourceModel"); + sourceModelData.setModuleName(MODULE_NAME); + sourceModelData.setDirectory("Custom/Source/Directory"); + + final SourceModelGenerator sourceModelGeneratorGenerator = + new SourceModelGenerator(sourceModelData, project); + final PsiFile dataPatchFile = sourceModelGeneratorGenerator.generate("test custom dir"); + final String filePatch = this.getFixturePath("CustomSourceModel.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePatch); + + assertGeneratedFileIsCorrect( + expectedFile, + "src/app/code/Foo/Bar/Custom/Source/Directory", + dataPatchFile + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentFormGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentFormGeneratorTest.java new file mode 100644 index 000000000..5aaf11a31 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentFormGeneratorTest.java @@ -0,0 +1,173 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormButtonData; +import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormFieldData; +import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormFieldsetData; +import com.magento.idea.magento2plugin.actions.generation.data.UiComponentFormFileData; +import com.magento.idea.magento2plugin.magento.packages.Areas; +import java.util.ArrayList; +import java.util.List; +import org.jetbrains.annotations.NotNull; + +public class UiComponentFormGeneratorTest extends BaseGeneratorTestCase { + + private static final String EXPECTED_DIRECTORY = + "src/app/code/Foo/Bar/view/adminhtml/ui_component"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ROUTE = "customroute"; + private static final String FORM_NAME = "my_form"; + private static final String FILE_NAME = "my_form.xml"; + private static final String LABEL = "My Form"; + + /** + * Test generating layout XML file. + */ + public void testGenerateFormXmlFile() { + final String filePath = this.getFixturePath(FILE_NAME); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + final Project project = myFixture.getProject(); + + final List buttons = getButtons(); + final List fieldsets = getFieldsets(); + final List fields = getFields(); + + final UiComponentFormFileData uiComponentFormData = new UiComponentFormFileData( + FORM_NAME, + Areas.adminhtml.toString(), + MODULE_NAME, + LABEL, + buttons, + fieldsets, + fields, + ROUTE, + "MyEntity", + "Save", + "DataProvider", + "Ui/MyEntity" + ); + final UiComponentFormGenerator uiComponentFormGenerator = new UiComponentFormGenerator( + uiComponentFormData, + project + ); + + final PsiFile file = uiComponentFormGenerator.generate("test"); + assertGeneratedFileIsCorrect(expectedFile, EXPECTED_DIRECTORY, file); + } + + /** + * Get fields data. + * + * @return List + */ + protected @NotNull List getFields() { + final List fields = new ArrayList<>(); + + fields.add(new UiComponentFormFieldData( + "my_field", + "My Field", + "10", + "General", + "input", + "text", + "entity" + )); + fields.add(new UiComponentFormFieldData( + "my_field_2", + "My Field 2", + "10", + "Test Fieldset", + "input", + "text", + "entity" + )); + + return fields; + } + + /** + * Get fieldSets data. + * + * @return List + */ + protected @NotNull List getFieldsets() { + final List fieldsets = new ArrayList<>(); + + fieldsets.add(new UiComponentFormFieldsetData( + "general", + "General", + "10" + )); + fieldsets.add(new UiComponentFormFieldsetData( + "test_fieldset", + "Test Fieldset", + "20" + )); + + return fieldsets; + } + + /** + * Get buttons data. + * + * @return List + */ + protected @NotNull List getButtons() { + final List buttons = new ArrayList<>(); + final String namespace = "Foo/Bar/Block/Form"; + final String directory = "Block/Form"; + + buttons.add(new UiComponentFormButtonData( + directory, + "SaveEntity", + MODULE_NAME, + "Save", + namespace, + "Save Entity", + "10", + FORM_NAME, + "Foo\\Bar\\Block\\Form\\Save" + )); + buttons.add(new UiComponentFormButtonData( + directory, + "BackToEntity", + MODULE_NAME, + "Back", + namespace, + "Back To Grid", + "20", + FORM_NAME, + "Foo\\Bar\\Block\\Form\\Back" + )); + buttons.add(new UiComponentFormButtonData( + directory, + "DeleteEntity", + MODULE_NAME, + "Save", + namespace, + "Delete Entity", + "30", + FORM_NAME, + "Foo\\Bar\\Block\\Form\\Delete" + )); + buttons.add(new UiComponentFormButtonData( + directory, + "CustomController", + MODULE_NAME, + "Custom", + namespace, + "Custom Button", + "40", + FORM_NAME, + "Foo\\Bar\\Block\\Form\\Custom" + )); + + return buttons; + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridDataProviderGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridDataProviderGeneratorTest.java new file mode 100644 index 000000000..0d240599b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridDataProviderGeneratorTest.java @@ -0,0 +1,107 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.context.EntityCreatorContext; +import com.magento.idea.magento2plugin.actions.generation.data.GetListQueryModelData; +import com.magento.idea.magento2plugin.actions.generation.data.UiComponentDataProviderData; +import com.magento.idea.magento2plugin.actions.generation.util.GenerationContextRegistry; + +public class UiComponentGridDataProviderGeneratorTest extends BaseGeneratorTestCase { + + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Ui/Component/Listing"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ENTITY_NAME = "Book"; + private static final String ENTITY_ID_FIELD_NAME = "book_id"; + private static final String MODEL_NAME = "Book"; + private static final String PROVIDER_CLASS_NAME = "GridDataProvider"; + private static final String PROVIDER_PATH = "Ui/Component/Listing"; + private static final String ENTITY_DTO_TYPE = "Foo\\Bar\\Model\\Data\\BookData"; + private static final String COLLECTION_NAME = "Collection"; + private static final String ACL = "Foo_Bar::book_management"; + + @Override + public void setUp() throws Exception { + super.setUp(); + final EntityCreatorContext context = new EntityCreatorContext(); + context.putUserData(EntityCreatorContext.DTO_TYPE, ENTITY_DTO_TYPE); + context.putUserData(EntityCreatorContext.ENTITY_ID, ENTITY_ID_FIELD_NAME); + GenerationContextRegistry.getInstance().setContext(context); + } + + /** + * Test data provider class file generation with custom type. + */ + public void testGenerateCustomDataProvider() { + final PsiFile dataProviderFile = generateDataProvider(new UiComponentDataProviderData( + PROVIDER_CLASS_NAME, + PROVIDER_PATH + )); + final String filePath = this.getFixturePath("GridDataProvider.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIRECTORY, + dataProviderFile + ); + } + + /** + * Test data provider class file generation when get list query model exists. + */ + public void testGenerateDataProviderWithInjectedGetListQuery() { + generateGetListQuery(); + final PsiFile dataProviderFile = generateDataProvider(new UiComponentDataProviderData( + PROVIDER_CLASS_NAME, + PROVIDER_PATH, + ENTITY_NAME, + ENTITY_ID_FIELD_NAME, + false + )); + final String filePath = this.getFixturePath("GridDataProvider.php"); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect( + expectedFile, + EXPECTED_DIRECTORY, + dataProviderFile + ); + } + + /** + * Generate data provider file. + * + * @return PsiFile + */ + private PsiFile generateDataProvider(final UiComponentDataProviderData data) { + final Project project = myFixture.getProject(); + + return new UiComponentDataProviderGenerator( + data, + MODULE_NAME, + project + ).generate("test"); + } + + /** + * Generate get list query model file. + */ + private void generateGetListQuery() { + final Project project = myFixture.getProject(); + final GetListQueryModelData getListData = new GetListQueryModelData( + MODULE_NAME, + ENTITY_NAME, + MODEL_NAME, + COLLECTION_NAME, + ACL, + false + ); + new GetListQueryModelGenerator(getListData, project, false).generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridXmlGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridXmlGeneratorTest.java new file mode 100644 index 000000000..99403088f --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/UiComponentGridXmlGeneratorTest.java @@ -0,0 +1,163 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.UiComponentGridData; +import com.magento.idea.magento2plugin.actions.generation.data.UiComponentGridToolbarData; +import com.magento.idea.magento2plugin.magento.packages.Areas; +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.magento.packages.Package; +import java.util.ArrayList; + +public class UiComponentGridXmlGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_DIRECTORY = "src/app/code/Foo/Bar/"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String COMPONENT_NAME = "custom_entity_grid"; + private static final String ENTITY_NAME = "Book"; + private static final String ID_FIELD_NAME = "entity_id"; + private static final String ACL = "Foo_Bar::custom_entity"; + private static final String DATA_PROVIDER_NAME = "DataProvider"; + private static final String DATA_PROVIDER_PATH = "Ui/Listing"; + + /** + * Test UI component listing file generation for specific area. + */ + public void testGenerateUiGridForBaseArea() { + final String area = Areas.base.toString(); + final PsiFile cronGroupsXmlFile = generateComponentGridXml( + area, + false + ); + final String filePath = this.getFixturePath(String.format("%s.%s", COMPONENT_NAME, "xml")); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect(expectedFile, getExpectedDirectory(area), cronGroupsXmlFile); + } + + /** + * Test UI component listing file generation without toolbar. + */ + public void testGenerateUiGridWithoutToolbar() { + final String area = Areas.adminhtml.toString(); + final PsiFile cronGroupsXmlFile = generateComponentGridXml( + area, + true + ); + final String filePath = this.getFixturePath(String.format("%s.%s", COMPONENT_NAME, "xml")); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect(expectedFile, getExpectedDirectory(area), cronGroupsXmlFile); + } + + /** + * Test UI component listing file generation with actions column. + */ + public void testGenerateUiGridForBaseAreaWithActionsColumnColumn() { + final String area = Areas.base.toString(); + final PsiFile cronGroupsXmlFile = generateComponentGridXmlWithActionsColumn(area); + final String filePath = this.getFixturePath(String.format("%s.%s", COMPONENT_NAME, "xml")); + final PsiFile expectedFile = myFixture.configureByFile(filePath); + + assertGeneratedFileIsCorrect(expectedFile, getExpectedDirectory(area), cronGroupsXmlFile); + } + + /** + * Generate UI Component Grid Xml file. + * + * @param area String + * @param addToolbar boolean + * + * @return PsiFile + */ + private PsiFile generateComponentGridXml( + final String area, + final boolean addToolbar + ) { + final Project project = myFixture.getProject(); + final UiComponentGridToolbarData uiGridToolbarData = new UiComponentGridToolbarData( + addToolbar, + true, + true, + true, + true + ); + final UiComponentGridData uiGridData = new UiComponentGridData( + MODULE_NAME, + area, + COMPONENT_NAME, + ID_FIELD_NAME, + ACL, + DATA_PROVIDER_NAME, + DATA_PROVIDER_PATH, + uiGridToolbarData + ); + final UiComponentGridXmlGenerator uiGridXmlGenerator = new UiComponentGridXmlGenerator( + uiGridData, + project + ); + + return uiGridXmlGenerator.generate("test"); + } + + /** + * Generate UI Component Grid Xml file with actions column. + * + * @param area String + * + * @return PsiFile + */ + private PsiFile generateComponentGridXmlWithActionsColumn( + final String area + ) { + final Project project = myFixture.getProject(); + final UiComponentGridToolbarData uiGridToolbarData = new UiComponentGridToolbarData( + false, + true, + true, + true, + true + ); + final UiComponentGridData uiGridData = new UiComponentGridData( + MODULE_NAME, + area, + COMPONENT_NAME, + ID_FIELD_NAME, + ACL, + DATA_PROVIDER_NAME, + DATA_PROVIDER_PATH, + ENTITY_NAME, + uiGridToolbarData, + new ArrayList<>() + ); + final UiComponentGridXmlGenerator uiGridXmlGenerator = new UiComponentGridXmlGenerator( + uiGridData, + project + ); + + return uiGridXmlGenerator.generate("test"); + } + + /** + * Get expected directory. + * + * @param area Area code + * @return String + */ + private String getExpectedDirectory(final String area) { + return String.format( + "%s%s%s%s%s%s", + MODULE_DIRECTORY, + Package.moduleViewDir, + File.separator, + area, + File.separator, + Package.moduleViewUiComponentDir + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiInterfaceGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiInterfaceGeneratorTest.java new file mode 100644 index 000000000..67373c302 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiInterfaceGeneratorTest.java @@ -0,0 +1,265 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.jetbrains.php.codeInsight.PhpCodeInsightUtil; +import com.jetbrains.php.config.PhpLanguageLevel; +import com.jetbrains.php.config.PhpProjectConfigurationFacade; +import com.jetbrains.php.lang.documentation.phpdoc.PhpDocUtil; +import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment; +import com.jetbrains.php.lang.psi.elements.ClassReference; +import com.jetbrains.php.lang.psi.elements.Method; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import com.jetbrains.php.lang.psi.elements.PhpPsiElement; +import com.jetbrains.php.lang.psi.elements.PhpUse; +import com.jetbrains.php.lang.psi.elements.PhpUseList; +import com.magento.idea.magento2plugin.actions.generation.data.php.WebApiInterfaceData; +import com.magento.idea.magento2plugin.actions.generation.generator.php.WebApiInterfaceGenerator; +import com.magento.idea.magento2plugin.magento.files.WebApiInterfaceFile; +import com.magento.idea.magento2plugin.util.GetPhpClassByFQN; +import com.magento.idea.magento2plugin.util.php.PhpTypeMetadataParserUtil; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import org.jetbrains.annotations.NotNull; + +public class WebApiInterfaceGeneratorTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/Api"; + + private static final String COULD_NOT_GENERATE_MESSAGE = + WebApiInterfaceFile.TEMPLATE + " could not be generated!"; + private static final String COULD_NOT_FIND_SERVICE_MESSAGE = + "A service for the test could not be found!"; + private static final String METHOD_DOES_NOT_HAVE_INHERIT_DOC = + "Service method does not have @inheritDoc block"; + private static final String SERVICE_SHOULD_HAVE_INTERFACE_IMPORTED = + "Service should have generated interface in the use block"; + private static final String SERVICE_SHOULD_IMPLEMENT_INTERFACE = + "Service should implement generated interface"; + + private static final String FIRST_SERVICE_FQN = "Foo\\Bar\\Service\\SimpleService"; + private static final String FIRST_SERVICE_METHODS = "execute"; + private static final String FIRST_INTERFACE_NAME = "SimpleServiceInterface"; + private static final String FIRST_INTERFACE_DESCRIPTION = "Simple service description."; + + private static final String SECOND_SERVICE_FQN = "Foo\\Bar\\Service\\SimpleServiceTwo"; + private static final String SECOND_SERVICE_METHODS = "execute,fetch"; + private static final String SECOND_INTERFACE_NAME = "SimpleServiceTwoInterface"; + private static final String SECOND_INTERFACE_DESCRIPTION = "Simple service two description."; + + @Override + public void setUp() throws Exception { + super.setUp(); + PhpProjectConfigurationFacade.getInstance(myFixture.getProject()) + .setLanguageLevel(PhpLanguageLevel.PHP720); + } + + /** + * Test generation of Web API interface for a service with primitive types. + */ + @SuppressWarnings({"PMD.JUnitTestContainsTooManyAsserts"}) + public void testWithPrimitiveTypes() { + final PhpClass service = extractServiceByFqn(FIRST_SERVICE_FQN); + final List publicMethods = PhpTypeMetadataParserUtil.getPublicMethods(service); + + final PsiFile result = generateInterfaceForService( + FIRST_SERVICE_FQN, + FIRST_INTERFACE_NAME, + FIRST_INTERFACE_DESCRIPTION, + publicMethods.stream() + .filter( + method -> Arrays.asList(FIRST_SERVICE_METHODS.split(",")) + .contains(method.getName()) + ) + .collect(Collectors.toList()) + ); + + if (result == null) { + fail(COULD_NOT_GENERATE_MESSAGE); + } + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(this.getFixturePath(FIRST_INTERFACE_NAME.concat(".php"))), + EXPECTED_DIRECTORY, + result + ); + + assertServiceMethodsHaveInheritDoc( + service, + Arrays.asList(FIRST_SERVICE_METHODS.split(",")) + ); + + assertServiceHasInterfaceReference( + service, + FIRST_INTERFACE_NAME + ); + } + + /** + * Test generation of Web API interface for a service with Object types. + */ + @SuppressWarnings({"PMD.JUnitTestContainsTooManyAsserts"}) + public void testWithObjectTypesAndPhpDocComments() { + final PhpClass service = extractServiceByFqn(SECOND_SERVICE_FQN); + final List publicMethods = PhpTypeMetadataParserUtil.getPublicMethods(service); + + final PsiFile result = generateInterfaceForService( + SECOND_SERVICE_FQN, + SECOND_INTERFACE_NAME, + SECOND_INTERFACE_DESCRIPTION, + publicMethods.stream() + .filter( + method -> Arrays.asList(SECOND_SERVICE_METHODS.split(",")) + .contains(method.getName()) + ) + .collect(Collectors.toList()) + ); + + if (result == null) { + fail(COULD_NOT_GENERATE_MESSAGE); + } + + assertGeneratedFileIsCorrect( + myFixture.configureByFile( + this.getFixturePath(SECOND_INTERFACE_NAME.concat(".php")) + ), + EXPECTED_DIRECTORY, + result + ); + + assertServiceMethodsHaveInheritDoc( + service, + Arrays.asList(SECOND_SERVICE_METHODS.split(",")) + ); + + assertServiceHasInterfaceReference( + service, + SECOND_INTERFACE_NAME + ); + } + + /** + * Asset that service methods have inherit doc after Web API interface generation. + * + * @param service PhpClass + * @param checkingMethods List[String] + */ + private void assertServiceMethodsHaveInheritDoc( + final @NotNull PhpClass service, + final @NotNull List checkingMethods + ) { + for (final Method method : service.getMethods()) { + if (checkingMethods.contains(method.getName())) { + final PhpDocComment methodDoc = method.getDocComment(); + + if (methodDoc == null || !methodDoc.getText().contains(PhpDocUtil.INHERITDOC_TAG)) { + fail(METHOD_DOES_NOT_HAVE_INHERIT_DOC); + } + } + } + } + + /** + * Assert that service has interface imported in use block and in implements part. + * + * @param service PhpClass + * @param generatedInterfaceName String + */ + @SuppressWarnings({"PMD.CyclomaticComplexity"}) + private void assertServiceHasInterfaceReference( + final @NotNull PhpClass service, + final @NotNull String generatedInterfaceName + ) { + boolean implementFound = false; + + for (final ClassReference reference : service.getImplementsList().getReferenceElements()) { + if (reference.getName() != null && reference.getName().equals(generatedInterfaceName)) { + implementFound = true; + break; + } + } + + if (!implementFound) { + fail(SERVICE_SHOULD_IMPLEMENT_INTERFACE); + } + + final PhpPsiElement scopeForUseOperator = + PhpCodeInsightUtil.findScopeForUseOperator(service); + + if (scopeForUseOperator == null) { + fail(SERVICE_SHOULD_IMPLEMENT_INTERFACE); + } + final List imports = PhpCodeInsightUtil.collectImports(scopeForUseOperator); + boolean importFound = false; + + for (final PhpUseList useList : imports) { + final PhpUse[] uses = useList.getDeclarations(); + + for (final PhpUse use : uses) { + if (use.getName().equals(generatedInterfaceName)) { + importFound = true; + break; + } + } + } + + if (!importFound) { + fail(SERVICE_SHOULD_HAVE_INTERFACE_IMPORTED); + } + } + + /** + * Extract service by FQN. + * + * @param classFqn String + * + * @return PhpClass + */ + private PhpClass extractServiceByFqn(final @NotNull String classFqn) { + final PhpClass service = GetPhpClassByFQN + .getInstance(myFixture.getProject()).execute(classFqn); + + if (service == null) { + fail(COULD_NOT_FIND_SERVICE_MESSAGE); + } + + return service; + } + + /** + * Generate interface for specified service. + * + * @param serviceFqn String + * @param interfaceName String + * @param interfaceDescription String + * @param methodList List[Method] + * + * @return PsiFile + */ + private PsiFile generateInterfaceForService( + final @NotNull String serviceFqn, + final @NotNull String interfaceName, + final @NotNull String interfaceDescription, + final @NotNull List methodList + ) { + final WebApiInterfaceData data = new WebApiInterfaceData( + MODULE_NAME, + serviceFqn, + interfaceName, + interfaceDescription, + methodList + ); + final WebApiInterfaceGenerator generator = new WebApiInterfaceGenerator( + data, + myFixture.getProject() + ); + + return generator.generate("test"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiXmlDeclarationGeneratorTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiXmlDeclarationGeneratorTest.java new file mode 100644 index 000000000..f6702a32f --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/WebApiXmlDeclarationGeneratorTest.java @@ -0,0 +1,53 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator; + +import com.intellij.psi.PsiFile; +import com.magento.idea.magento2plugin.actions.generation.data.xml.WebApiXmlRouteData; +import com.magento.idea.magento2plugin.actions.generation.generator.xml.WebApiDeclarationGenerator; +import com.magento.idea.magento2plugin.magento.files.ModuleWebApiXmlFile; + +public class WebApiXmlDeclarationGeneratorTest extends BaseGeneratorTestCase { + + private static final String EXPECTED_DIRECTORY = "src/app/code/Foo/Bar/etc"; + private static final String COULD_NOT_GENERATE_MESSAGE = + ModuleWebApiXmlFile.DECLARATION_TEMPLATE + " could not be generated!"; + private static final String MODULE_NAME = "Foo_Bar"; + private static final String URL = "test/foo/save"; + private static final String HTTP_METHOD = "POST"; + private static final String SERVICE_CLASS = "Foo\\Bar\\Api\\SaveFoo"; + private static final String SERVICE_METHOD = "execute"; + private static final String RESOURCE = "self"; + + /** + * Test generation of Web API xml declaration for a service. + */ + public void testGenerateWebApiXmlDeclarationForService() { + final WebApiXmlRouteData data = new WebApiXmlRouteData( + MODULE_NAME, + URL, + HTTP_METHOD, + SERVICE_CLASS, + SERVICE_METHOD, + RESOURCE + ); + final WebApiDeclarationGenerator generator = new WebApiDeclarationGenerator( + data, + myFixture.getProject() + ); + final PsiFile result = generator.generate("test"); + + if (result == null) { + fail(COULD_NOT_GENERATE_MESSAGE); + } + + assertGeneratedFileIsCorrect( + myFixture.configureByFile(this.getFixturePath(ModuleWebApiXmlFile.FILE_NAME)), + EXPECTED_DIRECTORY, + result + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/pool/NewEntityGeneratorPoolTest.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/pool/NewEntityGeneratorPoolTest.java new file mode 100644 index 000000000..f6a7c2773 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/pool/NewEntityGeneratorPoolTest.java @@ -0,0 +1,133 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator.pool; + +import com.magento.idea.magento2plugin.actions.generation.data.dialog.EntityCreatorContextData; +import com.magento.idea.magento2plugin.actions.generation.data.dialog.NewEntityDialogData; +import com.magento.idea.magento2plugin.actions.generation.generator.BaseGeneratorTestCase; +import com.magento.idea.magento2plugin.actions.generation.generator.pool.provider.NewEntityGeneratorsProviderUtil; +import com.magento.idea.magento2plugin.actions.generation.generator.util.NamespaceBuilder; +import java.util.ArrayList; + +public class NewEntityGeneratorPoolTest extends BaseGeneratorTestCase { + + private static final String MODULE_NAME = "Foo_Bar"; + private static final String ACTION_NAME = "Test"; + private static final String INDEX_PATH = "index"; + private static final String EDIT_PATH = "edit"; + private static final String NEW_PATH = "new"; + private static final String DELETE_PATH = "delete"; + + /** + * Test if generator pool handler instantiated without any error. + */ + public void testGeneratorsInPoolInstantiating() { + final NewEntityDialogData dialogData = getMockNewEntityDialogData(); + final EntityCreatorContextData contextData = getMockContext(); + final GeneratorPoolHandler generatorPoolHandler = new GeneratorPoolHandler(contextData); + + NewEntityGeneratorsProviderUtil.initializeGenerators( + generatorPoolHandler, + contextData, + dialogData + ); + + assertFalse( + "There are errors during generators instantiating.", + generatorPoolHandler.hasErrorMessages() + ); + } + + /** + * Test if generators handlers doesn't have any DTO converter type errors. + */ + public void testGeneratorsInPoolOnCorrectDtoConverterTypes() { + final NewEntityDialogData dialogData = getMockNewEntityDialogData(); + final EntityCreatorContextData contextData = getMockContext(); + final GeneratorPoolHandler generatorPoolHandler = new GeneratorPoolHandler(contextData); + + NewEntityGeneratorsProviderUtil.initializeGenerators( + generatorPoolHandler, + contextData, + dialogData + ); + + try { + generatorPoolHandler.instantiateAllGenerators(); + } catch (ClassCastException exception) { + fail("Wrong type provided for generator: " + exception.getMessage()); + } + } + + /** + * Get mocked new entity dialog data. + * + * @return NewEntityDialogData + */ + @SuppressWarnings("PMD.AvoidDuplicateLiterals") + private NewEntityDialogData getMockNewEntityDialogData() { + return new NewEntityDialogData( + "test", + "test", + "test", + "test", + "test", + true, + true, + false, + "test", + "test", + "test", + "test", + true, + true, + true, + true, + true, + "test", + "test", + "test", + "test", + 10, + "test", + "test", + "test" + ); + } + + /** + * Get mocked entity creator context data. + * + * @return EntityCreatorContextData + */ + private EntityCreatorContextData getMockContext() { + final NamespaceBuilder mockNamespace = new NamespaceBuilder( + MODULE_NAME, + "MockClass", + "Mock/Directory" + ); + + return new EntityCreatorContextData( + this.myFixture.getProject(), + MODULE_NAME, + ACTION_NAME, + false, + false, + INDEX_PATH, + EDIT_PATH, + NEW_PATH, + DELETE_PATH, + mockNamespace, + mockNamespace, + mockNamespace, + mockNamespace, + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>(), + new ArrayList<>() + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DbSchemaGeneratorDataProviderUtil.java b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DbSchemaGeneratorDataProviderUtil.java new file mode 100644 index 000000000..99a058ea2 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/actions/generation/generator/util/DbSchemaGeneratorDataProviderUtil.java @@ -0,0 +1,51 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.actions.generation.generator.util; + +import com.magento.idea.magento2plugin.magento.packages.PropertiesTypes; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +public final class DbSchemaGeneratorDataProviderUtil { + + private static final String PROPERTY_NAME = "Name"; + private static final String PROPERTY_TYPE = "Type"; + + private DbSchemaGeneratorDataProviderUtil() {} + + /** + * Generate properties for testcases. + * + * @return List of prepared properties. + */ + public static List> generateEntityPropertiesForTest() { + final List> propertyList = new LinkedList<>(); + + final Map nameProperty = new HashMap<>(); + nameProperty.put(PROPERTY_NAME, "name"); + nameProperty.put(PROPERTY_TYPE, PropertiesTypes.STRING.getPropertyType()); + propertyList.add(nameProperty); + + final Map ageProperty = new HashMap<>(); + ageProperty.put(PROPERTY_NAME, "age"); + ageProperty.put(PROPERTY_TYPE, PropertiesTypes.INT.getPropertyType()); + propertyList.add(ageProperty); + + final Map salaryProperty = new HashMap<>(); + salaryProperty.put(PROPERTY_NAME, "salary"); + salaryProperty.put(PROPERTY_TYPE, PropertiesTypes.FLOAT.getPropertyType()); + propertyList.add(salaryProperty); + + final Map singleProperty = new HashMap<>(); + singleProperty.put(PROPERTY_NAME, "is_single"); + singleProperty.put(PROPERTY_TYPE, PropertiesTypes.BOOL.getPropertyType()); + propertyList.add(singleProperty); + + return propertyList; + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/BaseCompletionTestCase.java b/src/test/java/com/magento/idea/magento2plugin/completion/BaseCompletionTestCase.java new file mode 100644 index 000000000..ca7dccdf5 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/BaseCompletionTestCase.java @@ -0,0 +1,128 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion; + +import com.magento.idea.magento2plugin.BaseProjectTestCase; +import com.magento.idea.magento2plugin.magento.packages.File; +import java.util.Arrays; +import java.util.List; + +public abstract class BaseCompletionTestCase extends BaseProjectTestCase { + private static final String MESSAGE_NO_LOOKUP = "No lookup element was provided"; + private final String testDataFolderPath + = "testData" + File.separator + "completion" + File.separator; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.setTestDataPath(testDataFolderPath); + } + + private void configureFixture(final String filePath) { + myFixture.configureByFile(filePath); + myFixture.completeBasic(); + } + + /** + * Assert that completion suggestions contains the given lookup strings. + */ + public void assertCompletionContains(final String filePath, final String... lookupStrings) { + configureFixture(filePath); + + final String messageEmptyLookup = "Failed that completion contains `%s`"; + final String messageComplationContains = "Failed that completion contains `%s` in `%s`"; + + checkContainsCompletion(lookupStrings, messageEmptyLookup, messageComplationContains); + } + + protected void assertFileContainsCompletions( + final String filePath, + final String... lookupStrings + ) { + configureFixture(filePath); + + final String messageEmptyLookup + = "Failed that completion contains `%s` for file " + filePath; + final String messageCompletionContains + = "Failed that completion contains `%s` in `%s` for file " + filePath; + + checkContainsCompletion(lookupStrings, messageEmptyLookup, messageCompletionContains); + } + + protected void assertFileNotContainsCompletions( + final String filePath, + final String... lookupStrings + ) { + configureFixture(filePath); + + final String messageCompletionNotContains + = "Failed that completion does not contain `%s` in `%s` for file " + filePath; + + checkDoesNotContainCompletion( + lookupStrings, messageCompletionNotContains + ); + } + + protected void assertCompletionNotShowing(final String filePath) { + configureFixture(filePath); + + final List lookupElements = myFixture.getLookupElementStrings(); + + if (lookupElements != null && !lookupElements.isEmpty()) { + final String messageCompletionDoesNotShow + = "Failed asserting that completion does not show up"; + + fail(messageCompletionDoesNotShow); + } + } + + protected void checkContainsCompletion( + final String[] lookupStrings, + final String emptyLookupError, + final String completionContainsError + ) { + if (lookupStrings.length == 0) { + fail(MESSAGE_NO_LOOKUP); + } + + final List lookupElements = myFixture.getLookupElementStrings(); + + if (lookupElements == null || lookupElements.isEmpty()) { + fail(String.format(emptyLookupError, Arrays.toString(lookupStrings))); + } + + for (final String lookupString : lookupStrings) { + if (!lookupElements.contains(lookupString)) { + fail(String.format( + completionContainsError, lookupString, lookupElements.toString()) + ); + } + } + } + + protected void checkDoesNotContainCompletion( + final String[] lookupStrings, + final String completionDoesNotContainError + ) { + if (lookupStrings.length == 0) { + fail(MESSAGE_NO_LOOKUP); + } + + final List lookupElements = myFixture.getLookupElementStrings(); + + if (lookupElements != null) { + for (final String lookupString : lookupStrings) { + if (lookupElements.contains(lookupString)) { + fail(String.format( + completionDoesNotContainError, lookupString, lookupElements.toString()) + ); + } + } + } + } + + protected abstract String getFixturePath(String fileName); +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/php/CompletionPhpFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/completion/php/CompletionPhpFixtureTestCase.java new file mode 100644 index 000000000..1198f39f0 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/php/CompletionPhpFixtureTestCase.java @@ -0,0 +1,18 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.php; + +import com.magento.idea.magento2plugin.completion.BaseCompletionTestCase; +import com.magento.idea.magento2plugin.magento.packages.File; + +public abstract class CompletionPhpFixtureTestCase extends BaseCompletionTestCase { + private static final String FIXTURES_FOLDER_PATH = "php" + File.separator; + + @Override + protected String getFixturePath(final String fileName) { + return prepareFixturePath(fileName, FIXTURES_FOLDER_PATH); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/php/ConfigPhpModuleCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/php/ConfigPhpModuleCompletionRegistrarTest.java new file mode 100644 index 000000000..d6650cabb --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/php/ConfigPhpModuleCompletionRegistrarTest.java @@ -0,0 +1,33 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.php; + +public class ConfigPhpModuleCompletionRegistrarTest extends CompletionPhpFixtureTestCase { + private static final String[] LOOKUP_MODULE_NAMES = { + "Magento_Catalog", + "Magento_Config" + }; + + /** + * Tests for module name completion under array key 'modules' in config.php + */ + public void testModuleNameMustHaveCompletion() { + final String filePath = this.getFixturePath("config.php"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, LOOKUP_MODULE_NAMES); + } + + /** + * Tests for no module name completion under a different array key in config.php + */ + public void testModuleNameMustNotHaveCompletion() { + final String filePath = this.getFixturePath("config.php"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/BackendModelXmlCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/BackendModelXmlCompletionRegistrarTest.java new file mode 100644 index 000000000..0a5a14b63 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/BackendModelXmlCompletionRegistrarTest.java @@ -0,0 +1,115 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleConfigXml; +import com.magento.idea.magento2plugin.magento.files.ModuleSystemXmlFile; + +public class BackendModelXmlCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + private static final String[] SYSTEM_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK = { + "Magento\\Backend\\Model\\Source\\Roles" + }; + private static final String[] CONFIG_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK = { + "Magento\\Backend\\Model\\Source\\YesNo" + }; + + /** + * Test system.xml file element completion. + */ + public void testSystemXmlElementProvideCompletion() { + final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); + myFixture.configureByFile(filePath); + + assertCompletionContains(filePath, SYSTEM_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK); + } + + /** + * Test system.xml file element completion won't show. + */ + public void testSystemXmlElementCompletionWontShow() { + final String filePath = this.getFixturePath( + ModuleSystemXmlFile.FILE_NAME + ); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + /** + * Test system.xml backend model attribute match with the file. + */ + public void testSystemXmlBackendModelAttributeMatchWithFile() { + final String filePath = this.getFixturePath( + ModuleSystemXmlFile.FILE_NAME + ); + + assertFileContainsCompletions(filePath, SYSTEM_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK); + } + + /** + * Test system.xml backend model attribute doesn't match with the file. + */ + public void testSystemXmlBackendModelAttributeDontMatchWithFile() { + final String filePath = this.getFixturePath( + "other-file-than-system.xml" + ); + + assertFileNotContainsCompletions( + filePath, + SYSTEM_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK + ); + } + + /** + * Test config.xml file element completion. + */ + public void testConfigXmlElementProvideCompletion() { + final String filePath = this.getFixturePath( + ModuleConfigXml.FILE_NAME + ); + myFixture.copyFileToProject(filePath); + + assertCompletionContains(filePath, CONFIG_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK); + } + + /** + * Test config.xml file element completion won't show. + */ + public void testConfigXmlElementCompletionWontShow() { + final String filePath = this.getFixturePath( + ModuleConfigXml.FILE_NAME + ); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + /** + * Test config.xml backend model attribute match with the file. + */ + public void testConfigXmlBackendModelAttributeMatchWithFile() { + final String filePath = this.getFixturePath( + ModuleConfigXml.FILE_NAME + ); + + assertFileContainsCompletions(filePath, CONFIG_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK); + } + + /** + * Test config.xml backend model attribute doesn't match with the file. + */ + public void testConfigXmlBackendModelAttributeDontMatchWithFile() { + final String filePath = this.getFixturePath( + "other-file-than-config.xml" + ); + + assertFileNotContainsCompletions( + filePath, + CONFIG_XML_BACKEND_MODEL_LOOKUP_STRING_CHECK + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/CompletionXmlFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/CompletionXmlFixtureTestCase.java new file mode 100644 index 000000000..6506be818 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/CompletionXmlFixtureTestCase.java @@ -0,0 +1,18 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.completion.BaseCompletionTestCase; +import com.magento.idea.magento2plugin.magento.packages.File; + +public abstract class CompletionXmlFixtureTestCase extends BaseCompletionTestCase { + private static final String FIXTURES_FOLDER_PATH = "xml" + File.separator; + + @Override + protected String getFixturePath(final String fileName) { + return prepareFixturePath(fileName, FIXTURES_FOLDER_PATH); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConfigurationTypeCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConfigurationTypeCompletionRegistrarTest.java new file mode 100644 index 000000000..912819e0b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConfigurationTypeCompletionRegistrarTest.java @@ -0,0 +1,21 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class ConfigurationTypeCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + private static final String[] lookupStringsTypeName = new String[] { + "Magento\\Backend\\Model\\Source\\YesNo" + }; + + public void testDiXmlTypeNameMustHaveCompletion() { + String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsTypeName); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConstructorArgumentCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConstructorArgumentCompletionRegistrarTest.java new file mode 100644 index 000000000..10dded7f7 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ConstructorArgumentCompletionRegistrarTest.java @@ -0,0 +1,21 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class ConstructorArgumentCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + /** + * Tests for completion of constructor argument in di.xml. + */ + public void testDiXmlMustHaveCompletion() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, "logger"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/CrontabCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/CrontabCompletionRegistrarTest.java new file mode 100644 index 000000000..39f340493 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/CrontabCompletionRegistrarTest.java @@ -0,0 +1,68 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.CrontabXmlTemplate; + +public class CrontabCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + private static final String EXPECTED_INSTANCE = "Magento\\Catalog\\Cron\\RefreshSpecialPrices"; + private static final String EXPECTED_METHOD = "execute"; + private static final String WRONG_FILE_NAME = "wrong_named_crontab.xml"; + + /** + * The `instance` attribute of the `job` tag in crontab.xml must + * have completion based on PHP classes index. + */ + public void testCronJobInstanceMustHaveCompletion() { + final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); + assertCompletionContains(filePath, EXPECTED_INSTANCE); + } + + /** + * The `instance` attribute of the `job` tag in the + * non crontab.xml file must not have completion. + */ + public void testNotCrontabXmlMustHaveNotCompletion() { + final String filePath = this.getFixturePath(WRONG_FILE_NAME); + assertFileNotContainsCompletions(filePath, EXPECTED_INSTANCE); + } + + /** + * The non `instance` attribute of the `job` tag in crontab.xml must + * not have completion. + */ + public void testNotInstanceAttrMustHaveNotCompletion() { + final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); + assertFileNotContainsCompletions(filePath, EXPECTED_INSTANCE); + } + + /** + * The `instance` attribute that isn't in the `job` tag in crontab.xml must + * not have completion. + */ + public void testNotJobTagMustHaveNotCompletion() { + final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); + assertFileNotContainsCompletions(filePath, EXPECTED_INSTANCE); + } + + /** + * The `method` attribute of the `job` tag in crontab.xml must + * have completion based on PHP Job method completion provider. + */ + public void testCronJobMethodMustHaveCompletion() { + final String filePath = this.getFixturePath(CrontabXmlTemplate.FILE_NAME); + assertCompletionContains(filePath, EXPECTED_METHOD); + } + + /** + * The `method` attribute must not have completion + * if it isn`t in the crontab.xml file. + */ + public void testNotCrontabXmlMethodMustHaveNotCompletion() { + final String filePath = this.getFixturePath(WRONG_FILE_NAME); + assertFileNotContainsCompletions(filePath, EXPECTED_METHOD); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutBlockCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutBlockCompletionRegistrarTest.java new file mode 100644 index 000000000..e1f2ff7cf --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutBlockCompletionRegistrarTest.java @@ -0,0 +1,20 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.LayoutXml; + +public class LayoutBlockCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + public void testReferenceBlockMustHaveCompletion() { + String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); + myFixture.configureByFile(filePath); + + assertCompletionContains(filePath, new String[] { + "test_index_index_block", + "test_index_index_block2" + }); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutContainerCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutContainerCompletionRegistrarTest.java new file mode 100644 index 000000000..aa35e1cac --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutContainerCompletionRegistrarTest.java @@ -0,0 +1,26 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.LayoutXml; + +public class LayoutContainerCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + /** + * The `name` attribute of the `referenceContainer` tag in layout XML must + * have completion based on `name` attribute of `container` tags. + */ + public void testReferenceContainerMustHaveCompletion() { + final String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); + myFixture.configureByFile(filePath); + + assertCompletionContains( + filePath, + "test_index_index_container", + "test_index_index_container2" + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUIComponentCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUIComponentCompletionRegistrarTest.java new file mode 100644 index 000000000..30f037419 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUIComponentCompletionRegistrarTest.java @@ -0,0 +1,24 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.LayoutXml; + +public class LayoutUIComponentCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + /** + * Test ui component must have completion. + */ + public void testUIComponentMustHaveCompletion() { + final String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); + myFixture.configureByFile(filePath); + + assertCompletionContains(filePath, + "recently_viewed", + "recently_viewed_2" + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUpdateHandleCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUpdateHandleCompletionRegistrarTest.java new file mode 100644 index 000000000..dd8fa44f4 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/LayoutUpdateHandleCompletionRegistrarTest.java @@ -0,0 +1,24 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +public class LayoutUpdateHandleCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + /** + * The `handle` attribute of the `update` tag in the layout XML must + * have completion based on layout index. + */ + public void testUpdateHandleMustHaveCompletion() { + final String filePath = this.getFixturePath("test_test_test.xml"); + myFixture.configureByFile(filePath); + + assertCompletionContains( + filePath, + "test_index_index", + "test_index_index2" + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MenuCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MenuCompletionRegistrarTest.java new file mode 100644 index 000000000..7f4cd302e --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MenuCompletionRegistrarTest.java @@ -0,0 +1,26 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleMenuXml; + +public class MenuCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + /** + * The `parent` attribute of the `add` tag in the men XML must + * have completion based on the index. + */ + public void testAddTagMustHaveCompletion() { + final String filePath = this.getFixturePath(ModuleMenuXml.fileName); + myFixture.configureByFile(filePath); + + assertCompletionContains( + filePath, + "Magento_Catalog::catalog", + "Magento_Catalog::inventory" + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfEntityNameCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfEntityNameCompletionRegistrarTest.java new file mode 100644 index 000000000..f6ce4c58a --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfEntityNameCompletionRegistrarTest.java @@ -0,0 +1,106 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.completion.xml; + +public class MftfEntityNameCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + private static final String[] lookupStringsEntities = new String[] { + "TestAdminMenuCatalog", + "TestAdminMenuCatalog.pageTitle", + "TestDefaultAttributeSet", + "TestDefaultAttributeSet.attribute_set_id" + }; + + public void testCreateDataActionGroupMustProvideCompletion() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testCreateDataInTestMustProvideCompletion () { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testCreateDataInTestWithSectionMustBeEmpty () { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testUpdateDataActionGroupMustProvideCompletion () { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testUpdateDataActionGroupMustBeEmpty () { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testUpdateDataInTestMustProvideCompletion () { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testUpdateDataInTestMustBeEmpty () { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testUserInputInActionGroupMustProvideCompletion () { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testUserInputInActionGroupMustBeEmpty () { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testUserInputInTestMustProvideCompletion () { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testUserInputInTestMustBeEmpty () { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testEntityExtendsInDataMustProvideCompletion () { + String filePath = this.getFixturePath("TestData.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testEntityExtendsInDataMustBeEmpty () { + String filePath = this.getFixturePath("TestData.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfNameCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfNameCompletionRegistrarTest.java new file mode 100644 index 000000000..97cec91cc --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfNameCompletionRegistrarTest.java @@ -0,0 +1,41 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.completion.xml; + +public class MftfNameCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + private static final String[] lookupStringsEntities = new String[] { + "TestAddOutOfStockProductToCompareListTest", + "TestVerifyTinyMCEv4IsNativeWYSIWYGOnProductTest" + }; + + public void testExtendsMustProvideCompletion() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testExtendsInActionGroupMustBeEmpty() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testExtendsSameNameMustBeEmpty() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testExtendsSameNameMustBeEmptyForActionGroup() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfPageUrlCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfPageUrlCompletionRegistrarTest.java new file mode 100644 index 000000000..4df71b769 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfPageUrlCompletionRegistrarTest.java @@ -0,0 +1,68 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.completion.xml; + +public class MftfPageUrlCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + private static final String[] lookupStrings = new String[] { + "TestPage.url", + "TestPage2.url" + }; + + public void testPageUrlInActionGroupMustProvideCompletion() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStrings); + } + public void testPageUrlInActionGroupMustBeEmptyForSection() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testPageUrlInActionGroupMustBeEmptyForTestDocument() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testPageUrlInActionGroupMustBeEmptyForEntity() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testPageUrlInTestMustProvideCompletion() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStrings); + } + + public void testPageUrlBeforeInTestMustProvideCompletion() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStrings); + } + + public void testPageUrlInTestMustBeEmptyForSection() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testPageUrlInTestMustBeEmptyForActionGroup() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfSelectorCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfSelectorCompletionRegistrarTest.java new file mode 100644 index 000000000..99aa6f722 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/MftfSelectorCompletionRegistrarTest.java @@ -0,0 +1,52 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.completion.xml; + +public class MftfSelectorCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + private static final String[] lookupStringsEntities = new String[] { + "TestAdminAddProductsToOptionPanelSection", + "TestAdminProductsPanelSection", + "TestAdminProductsSection", + "TestAdminAddProductsToOptionPanelSection.testaddSelectedProducts", + "TestAdminAddProductsToOptionPanelSection.testapplyFilters", + "TestAdminAddProductsToOptionPanelSection.testfilters", + "TestAdminAddProductsToOptionPanelSection.testfirstCheckbox", + "TestAdminAddProductsToOptionPanelSection.testnameFilter", + "TestAdminAddProductsToOptionPanelSection.testnthCheckbox", + "TestAdminProductsPanelSection.testaddSelectedProducts", + "TestAdminProductsSection.testaddSelectedProducts", + "TestAdminProductsSection.testapplyFilters", + "TestAdminProductsSection.testfilters" + }; + + public void testSelectorInActionGroupMustProvideCompletion() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testSelectorInTestMustProvideCompletion() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testSelectorInActionGroupMustBeEmpty() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testSelectorInTestMustBeEmpty() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ModuleNameCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ModuleNameCompletionRegistrarTest.java new file mode 100644 index 000000000..f9cc87dcc --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ModuleNameCompletionRegistrarTest.java @@ -0,0 +1,33 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +public class ModuleNameCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + private static final String[] LOOKUP_MODULE_NAMES = { + "Magento_Catalog", + "Magento_Config" + }; + + /** + * Tests for module name completion in module.xml + */ + public void testModuleNameMustHaveCompletion() { + final String filePath = this.getFixturePath("module.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, LOOKUP_MODULE_NAMES); + } + + /** + * Tests for module name completion under the sequence node in module.xml + */ + public void testSequenceModuleNameMustHaveCompletion() { + final String filePath = this.getFixturePath("module.xml"); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, LOOKUP_MODULE_NAMES); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/ObserverCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ObserverCompletionRegistrarTest.java new file mode 100644 index 000000000..3e45a006b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/ObserverCompletionRegistrarTest.java @@ -0,0 +1,38 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleEventsXml; + +public class ObserverCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + private static final String[] lookupStringsEntities = new String[] { + "Magento\\Catalog\\Observer\\TestObserver" + }; + private static final String[] lookupStringsEvents = new String[] { + "test_event_in_block" + }; + + public void testEventsXmlMustHaveCompletion() { + String filePath = this.getFixturePath(ModuleEventsXml.FILE_NAME); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEntities); + } + + public void testNotEventsXmlMustBeEmpty() { + String filePath = this.getFixturePath("notevents.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionNotShowing(filePath); + } + + public void testEventsXmlEventNameMustHaveCompletion() { + String filePath = this.getFixturePath(ModuleEventsXml.FILE_NAME); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, lookupStringsEvents); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpClassMemberCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpClassMemberCompletionRegistrarTest.java new file mode 100644 index 000000000..ede692a5b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpClassMemberCompletionRegistrarTest.java @@ -0,0 +1,21 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class PhpClassMemberCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + /** + * Tests for completion of init_parameter argument value in di.xml. + */ + public void testDiXmlMustHaveCompletion() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + myFixture.configureByFile(filePath); + + assertCompletionContains(filePath, "Magento\\Backend\\Model\\Source\\YesNo::TEST_STRING"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpServiceMethodCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpServiceMethodCompletionRegistrarTest.java new file mode 100644 index 000000000..7cbab9509 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/PhpServiceMethodCompletionRegistrarTest.java @@ -0,0 +1,19 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +public class PhpServiceMethodCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + /** + * Tests for the completion in `method` attribute of the `service` tag in webapi.xml. + */ + public void testWebApiXmlMustHaveCompletion() { + final String filePath = this.getFixturePath("webapi.xml"); + myFixture.configureByFile(filePath); + + assertCompletionContains(filePath, "save"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/PluginTypeCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/PluginTypeCompletionRegistrarTest.java new file mode 100644 index 000000000..2932d0e68 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/PluginTypeCompletionRegistrarTest.java @@ -0,0 +1,22 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class PluginTypeCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + /** + * The `type` attribute of the `plugin` tag in di.xml must + * have completion based on PHP classes index + */ + public void testPluginTypeMustHaveCompletion() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + myFixture.configureByFile(filePath); + + assertCompletionContains(filePath, "Magento\\Backend\\Model\\Source\\YesNo"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/RequireJsCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/RequireJsCompletionRegistrarTest.java new file mode 100644 index 000000000..91bfc89fd --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/RequireJsCompletionRegistrarTest.java @@ -0,0 +1,46 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.completion.xml; + +public class RequireJsCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + public void testMappedComponentAttributeMustHaveCompletion() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionContains(filePath, new String[] { + "testFile", + "testFile2" + }); + } + + public void testMappedComponentItemAttributeMustHaveCompletion() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionContains(filePath, new String[] { + "testFile", + "testFile2" + }); + } + + public void testFileComponentAttributeMustHaveCompletion() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionContains(filePath, new String[] { + "Foo_Bar/js/file" + }); + } + + public void testFileComponentItemAttributeMustHaveCompletion() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.copyFileToProject(filePath); + + assertCompletionContains(filePath, new String[] { + "Foo_Bar/js/file" + }); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/SourceModelXmlCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/SourceModelXmlCompletionRegistrarTest.java new file mode 100644 index 000000000..939380523 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/SourceModelXmlCompletionRegistrarTest.java @@ -0,0 +1,82 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleSystemXmlFile; +import com.magento.idea.magento2plugin.magento.files.ModuleWidgetXml; + +public class SourceModelXmlCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + private static final String[] LOOKUP_STRINGS_CHECK = { + "Magento\\Backend\\Model\\Source\\YesNo" + }; + + /** + * Test source model xml element completion. + */ + public void testSourceModelXmlElementMustProvideCompletion() { + final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); + myFixture.copyFileToProject(filePath); + + assertCompletionContains(filePath, LOOKUP_STRINGS_CHECK); + } + + /** + * Test source model xml element completion match with the file false positive. + */ + public void testSourceModelXmlElementMatchWithFilePositiveCase() { + final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, LOOKUP_STRINGS_CHECK); + } + + /** + * Test source model xml element completion match with the file negative case. + */ + public void testSourceModelXmlElementMatchWithFileNegativeCase() { + final String filePath = this.getFixturePath("not-system.xml"); + myFixture.copyFileToProject(filePath); + + assertFileNotContainsCompletions( + filePath, + LOOKUP_STRINGS_CHECK + ); + } + + /** + * Test source model attribute must provide completion. + */ + public void testSourceModelXmlAttributeMustProvideCompletion() { + final String filePath = this.getFixturePath(ModuleWidgetXml.FILE_NAME); + myFixture.copyFileToProject(filePath); + + assertCompletionContains(filePath, LOOKUP_STRINGS_CHECK); + } + + /** + * Test source model attribute match with the file positive case. + */ + public void testSourceModelXmlAttributeMatchWithFilePositiveCase() { + final String filePath = this.getFixturePath(ModuleWidgetXml.FILE_NAME); + myFixture.copyFileToProject(filePath); + + assertFileContainsCompletions(filePath, LOOKUP_STRINGS_CHECK); + } + + /** + * Test source model attribute match with the file negative case. + */ + public void testSourceModelXmlAttributeMatchWithFileNegativeCase() { + final String filePath = this.getFixturePath("not-widget.xml"); + myFixture.copyFileToProject(filePath); + + assertFileNotContainsCompletions( + filePath, + LOOKUP_STRINGS_CHECK + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/SystemConfigurationPathsCompletionTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/SystemConfigurationPathsCompletionTest.java new file mode 100644 index 000000000..935a4179b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/SystemConfigurationPathsCompletionTest.java @@ -0,0 +1,66 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleConfigXmlFile; +import com.magento.idea.magento2plugin.magento.files.ModuleSystemXmlFile; + +public class SystemConfigurationPathsCompletionTest extends CompletionXmlFixtureTestCase { + + /** + * Test system xml section element completion. + */ + public void testSystemXmlSectionMustProvideCompletion() { + final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); + myFixture.copyFileToProject(filePath); + assertCompletionContains(filePath, "catalog"); + } + + /** + * Test system xml group element completion. + */ + public void testSystemXmlGroupMustProvideCompletion() { + final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); + myFixture.copyFileToProject(filePath); + assertCompletionContains(filePath, "frontend"); + } + + /** + * Test system xml field element completion. + */ + public void testSystemXmlFieldMustProvideCompletion() { + final String filePath = this.getFixturePath(ModuleSystemXmlFile.FILE_NAME); + myFixture.copyFileToProject(filePath); + assertCompletionContains(filePath, "list_allow_all"); + } + + /** + * Test config xml section element completion. + */ + public void testConfigXmlSectionMustProvideCompletion() { + final String filePath = this.getFixturePath(ModuleConfigXmlFile.FILE_NAME); + myFixture.copyFileToProject(filePath); + assertCompletionContains(filePath, "catalog"); + } + + /** + * Test config xml group element completion. + */ + public void testConfigXmlGroupMustProvideCompletion() { + final String filePath = this.getFixturePath(ModuleConfigXmlFile.FILE_NAME); + myFixture.copyFileToProject(filePath); + assertCompletionContains(filePath, "frontend"); + } + + /** + * Test config xml field element completion. + */ + public void testConfigXmlFieldMustProvideCompletion() { + final String filePath = this.getFixturePath(ModuleConfigXmlFile.FILE_NAME); + myFixture.copyFileToProject(filePath); + assertCompletionContains(filePath, "list_allow_all"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/TableAndColumnNameCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/TableAndColumnNameCompletionRegistrarTest.java new file mode 100644 index 000000000..0156b97ee --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/TableAndColumnNameCompletionRegistrarTest.java @@ -0,0 +1,60 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.completion.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDbSchemaXml; + +/** + * Test table and column names completion in the db_schema.xml file. + */ +public class TableAndColumnNameCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + private static final String CATALOG_PRODUCT_ENTITY_TABLE_NAME = "catalog_product_entity"; + + /** + * The `name` attribute of the `table` tag in `db_schema.xml` file must + * have completion based on table and column names index. + */ + public void testTableNameMustHaveCompletion() { + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + assertCompletionContains(filePath, "catalog_category_entity"); + } + + /** + * The `table` attribute of the `constraint` tag in `db_schema.xml` file must + * have completion based on table and column names index. + */ + public void testConstraintTagTableMustHaveCompletion() { + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + assertCompletionContains(filePath, CATALOG_PRODUCT_ENTITY_TABLE_NAME); + } + + /** + * The `referenceTable` attribute of the `constraint` tag in `db_schema.xml` file must + * have completion based on table and column names index. + */ + public void testConstraintTagReferenceTableMustHaveCompletion() { + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + assertCompletionContains(filePath, CATALOG_PRODUCT_ENTITY_TABLE_NAME); + } + + /** + * The `column` attribute of the `constraint` tag in `db_schema.xml` file must + * have completion based on table and column names index. + */ + public void testConstraintColumnNameMustHaveCompletion() { + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + assertCompletionContains(filePath, "children_count"); + } + + /** + * The `referenceColumn` attribute of the `constraint` tag in `db_schema.xml` file must + * have completion based on table and column names index. + */ + public void testConstraintReferenceColumnNameMustHaveCompletion() { + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + assertCompletionContains(filePath, "attribute_set_id"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/completion/xml/UiComponentTemplateCompletionRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/completion/xml/UiComponentTemplateCompletionRegistrarTest.java new file mode 100644 index 000000000..08c2048e1 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/completion/xml/UiComponentTemplateCompletionRegistrarTest.java @@ -0,0 +1,28 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.completion.xml; + +public class UiComponentTemplateCompletionRegistrarTest extends CompletionXmlFixtureTestCase { + + public void testFileTemplateAttributeMustHaveCompletion() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.configureByFile(filePath); + + assertCompletionContains(filePath, new String[] { + "Foo_Bar/template", + "Foo_Bar/template2" + }); + } + + public void testFileTemplateItemAttributeMustHaveCompletion() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.configureByFile(filePath); + + assertCompletionContains(filePath, new String[] { + "Foo_Bar/template", + "Foo_Bar/template2" + }); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/BaseInspectionsTestCase.java b/src/test/java/com/magento/idea/magento2plugin/inspections/BaseInspectionsTestCase.java new file mode 100644 index 000000000..65f932ed7 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/BaseInspectionsTestCase.java @@ -0,0 +1,52 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.inspections; + +import com.intellij.codeInsight.daemon.impl.HighlightInfo; +import com.magento.idea.magento2plugin.BaseProjectTestCase; +import com.magento.idea.magento2plugin.bundles.InspectionBundle; +import java.util.List; + +/** + * Configure test environment with Magento 2 project + */ +abstract public class BaseInspectionsTestCase extends BaseProjectTestCase { + protected final InspectionBundle inspectionBundle = new InspectionBundle(); + + protected void assertHasHighlighting(String message) { + String highlightingNotFound = "Failed that documents contains highlighting with the description `%s`"; + + List highlightingList = myFixture.doHighlighting(); + if (highlightingList.isEmpty()) { + fail(String.format(highlightingNotFound, message)); + } + + for (HighlightInfo highlighting : + highlightingList) { + if (highlighting.getDescription() == null) continue; + if (highlighting.getDescription().equals(message)) { + return; + } + } + fail(String.format(highlightingNotFound, message)); + } + + protected void assertHasNoHighlighting(String message) { + String highlightingNotFound = "Failed that documents not contains highlighting with the description `%s`"; + + List highlightingList = myFixture.doHighlighting(); + if (highlightingList.isEmpty()) { + return; + } + + for (HighlightInfo highlighting : + highlightingList) { + if (highlighting.getDescription() == null) continue; + if (highlighting.getDescription().equals(message)) { + fail(String.format(highlightingNotFound, message)); + } + } + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/InspectionGraphqlsFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/InspectionGraphqlsFixtureTestCase.java new file mode 100644 index 000000000..d92ca85ee --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/InspectionGraphqlsFixtureTestCase.java @@ -0,0 +1,35 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.graphqls; + +import com.magento.idea.magento2plugin.inspections.BaseInspectionsTestCase; +import com.magento.idea.magento2plugin.magento.packages.File; + +public abstract class InspectionGraphqlsFixtureTestCase extends BaseInspectionsTestCase { + + private static final String testDataFolderPath = "testData" //NOPMD + + File.separator + + "inspections" + + File.separator; + + private static final String fixturesFolderPath = "graphqls" //NOPMD + + File.separator; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.setTestDataPath(testDataFolderPath); + } + + @Override + protected boolean isWriteActionRequired() { + return false; + } + + protected String getFixturePath(final String fileName) { + return prepareFixturePath(fileName, fixturesFolderPath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/SchemaResolverInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/SchemaResolverInspectionTest.java new file mode 100644 index 000000000..a73a008ed --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/graphqls/SchemaResolverInspectionTest.java @@ -0,0 +1,59 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.graphqls; + +import com.magento.idea.magento2plugin.magento.files.SchemaGraphQLsFile; + +public class SchemaResolverInspectionTest extends InspectionGraphqlsFixtureTestCase { + + private final String errorMessage = inspectionBundle.message( + "inspection.graphql.resolver.mustImplement" + ); + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(SchemaResolverInspection.class); + } + + protected boolean isWriteActionRequired() { + return false; + } + + /** + * Inspection with valid schema resolver. + */ + public void testWithValidSchemaResolverInterface() throws Exception { + myFixture.configureByFile(getFixturePath(SchemaGraphQLsFile.FILE_NAME)); + assertHasNoHighlighting(errorMessage); + } + + /** + * Inspection with invalid schema resolver. + */ + public void testWithInvalidSchemaResolverInterface() throws Exception { + myFixture.configureByFile(getFixturePath(SchemaGraphQLsFile.FILE_NAME)); + assertHasHighlighting(errorMessage); + } + + /** + * Inspection with valid batch resolver. + */ + public void testWithValidBatchResolverInterface() throws Exception { + myFixture.configureByFile(getFixturePath(SchemaGraphQLsFile.FILE_NAME)); + + assertHasNoHighlighting(errorMessage); + } + + /** + * Inspection with valid batch service contract resolver. + */ + public void testWithValidBatchServiceContractResolverInterface() throws Exception { + myFixture.configureByFile(getFixturePath(SchemaGraphQLsFile.FILE_NAME)); + + assertHasNoHighlighting(errorMessage); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/php/GraphQlResolverInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/php/GraphQlResolverInspectionTest.java new file mode 100644 index 000000000..be9a6fe65 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/php/GraphQlResolverInspectionTest.java @@ -0,0 +1,47 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.inspections.php; + +public class GraphQlResolverInspectionTest extends InspectionPhpFixtureTestCase { + + private final String errorMessage = inspectionBundle.message( + "inspection.graphql.resolver.mustImplement" + ); + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(GraphQlResolverInspection.class); + } + + @Override + protected boolean isWriteActionRequired() { + return false; + } + + public void testWithInvalidResolverInterface() throws Exception { + myFixture.configureByFile(getFixturePath("ResolverTest.php")); + + assertHasHighlighting(errorMessage); + } + + public void testWithValidResolverInterface() throws Exception { + myFixture.configureByFile(getFixturePath("ResolverTest.php")); + + assertHasNoHighlighting(errorMessage); + } + + public void testWithValidBatchResolverInterface() throws Exception { + myFixture.configureByFile(getFixturePath("ResolverTest.php")); + + assertHasNoHighlighting(errorMessage); + } + + public void testWithValidBatchServiceContractResolverInterface() throws Exception { + myFixture.configureByFile(getFixturePath("ResolverTest.php")); + + assertHasNoHighlighting(errorMessage); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/php/InspectionPhpFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/inspections/php/InspectionPhpFixtureTestCase.java new file mode 100644 index 000000000..46c6d93cb --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/php/InspectionPhpFixtureTestCase.java @@ -0,0 +1,35 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.php; + +import com.magento.idea.magento2plugin.inspections.BaseInspectionsTestCase; +import com.magento.idea.magento2plugin.magento.packages.File; + +public abstract class InspectionPhpFixtureTestCase extends BaseInspectionsTestCase { + + private static final String testDataFolderPath = "testData" //NOPMD + + File.separator + + "inspections" + + File.separator; + + private static final String fixturesFolderPath //NOPMD + = "php" + File.separator; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.setTestDataPath(testDataFolderPath); + } + + @Override + protected boolean isWriteActionRequired() { + return false; + } + + protected String getFixturePath(final String fileName) { + return prepareFixturePath(fileName, fixturesFolderPath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/php/ModuleDeclarationInRegistrationPhpInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/php/ModuleDeclarationInRegistrationPhpInspectionTest.java new file mode 100644 index 000000000..40ef93acf --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/php/ModuleDeclarationInRegistrationPhpInspectionTest.java @@ -0,0 +1,85 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.php; + +import com.magento.idea.magento2plugin.magento.files.RegistrationPhp; +import com.magento.idea.magento2plugin.project.Settings; + +public class ModuleDeclarationInRegistrationPhpInspectionTest + extends InspectionPhpFixtureTestCase { + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(ModuleDeclarationInRegistrationPhpInspection.class); + } + + @Override + protected boolean isWriteActionRequired() { + return false; + } + + /** + * Inspection highlights warning in editable module. + */ + public void testWrongDeclarationInEditableModule() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.magentoPath = + "/src/php/ModuleDeclarationInRegistrationPhpInspection/" + + "wrongDeclarationInEditableModule"; + myFixture.configureByFile( + getFixturePath("app/code/Test/TestModule/" + RegistrationPhp.FILE_NAME) + ); + + final String errorMessage = inspectionBundle.message( + "inspection.moduleDeclaration.warning.wrongModuleName", + "Wrong_ModuleName", + "Test_TestModule" + ); + + assertHasHighlighting(errorMessage); + } + + /** + * Inspection skips warning in root. + */ + public void testWrongDeclarationInRoot() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.magentoPath = + "/src/php/ModuleDeclarationInRegistrationPhpInspection/wrongDeclarationInRoot"; + myFixture.configureByFile( + getFixturePath(RegistrationPhp.FILE_NAME) + ); + + final String errorMessage = inspectionBundle.message( + "inspection.moduleDeclaration.warning.wrongModuleName", + "Wrong_ModuleName", + "ModuleDeclarationInRegistrationPhpInspection_WrongDeclarationInRoot" + ); + + assertHasNoHighlighting(errorMessage); + } + + /** + * Inspection skips warning in vendor. + */ + public void testWrongDeclarationInVendor() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.magentoPath = + "/src/php/ModuleDeclarationInRegistrationPhpInspection/wrongDeclarationInVendor"; + myFixture.configureByFile( + getFixturePath("vendor/magento/module-catalog/" + RegistrationPhp.FILE_NAME) + ); + + final String errorMessage = inspectionBundle.message( + "inspection.moduleDeclaration.warning.wrongModuleName", + "Wrong_ModuleName", + "magento_module-catalog" + ); + + assertHasNoHighlighting(errorMessage); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/php/PluginInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/php/PluginInspectionTest.java new file mode 100644 index 000000000..d4a03ebf2 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/php/PluginInspectionTest.java @@ -0,0 +1,64 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.php; + +import com.jetbrains.php.PhpBundle; +import com.magento.idea.magento2plugin.bundles.InspectionBundle; + +public class PluginInspectionTest extends InspectionPhpFixtureTestCase { + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(PluginInspection.class); + } + + @Override + protected boolean isWriteActionRequired() { + return false; + } + + /** + * Inspection highlights error in parameter type. + */ + public void testWithWrongParameterType() { + myFixture.configureByFile(getFixturePath("Plugin.php")); + + final String wrongParameterError = PhpBundle.message( + "inspection.wrong_param_type", + "\\Magento\\Catalog\\Block\\Navigation", + "\\Magento\\Theme\\Block\\Html\\Topmenu" + ); + + assertHasHighlighting(wrongParameterError); + } + + /** + * Inspection highlights error in callable parameter type. + */ + public void testWithWrongCallableType() { + myFixture.configureByFile(getFixturePath("Plugin.php")); + + final String wrongParameterError = PhpBundle.message( + "inspection.wrong_param_type", + "\\Magento\\Theme\\Block\\Html\\Topmenu", + "callable" + ); + + assertHasHighlighting(wrongParameterError); + } + + /** + * Inspection highlights error in callable parameter type. + */ + public void testWithNoninterceptableTargetClass() { + myFixture.configureByFile(getFixturePath("Plugin.php")); + + assertHasHighlighting(new InspectionBundle().message( + "inspection.plugin.error.noninterceptableInterface" + )); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/AclResourceXmlInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/AclResourceXmlInspectionTest.java new file mode 100644 index 000000000..c48f3b958 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/AclResourceXmlInspectionTest.java @@ -0,0 +1,64 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleAclXml; + +public class AclResourceXmlInspectionTest extends InspectionXmlFixtureTestCase { + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(AclResourceXmlInspection.class); + } + + @Override + protected boolean isWriteActionRequired() { + return false; + } + + /** + * ACL resource should have a title. + */ + public void testAclResourceWithNoTitleShouldHaveWarning() { + myFixture.configureByFile(getFixturePath(ModuleAclXml.FILE_NAME)); + + final String errorMessage = inspectionBundle.message( + "inspection.error.missingAttribute", + "title" + ); + + assertHasHighlighting(errorMessage); + } + + /** + * Override/Reference for ACL resource may not have a title. + */ + public void testOverrideAclResourceWithNoTitleShouldNotHaveWarning() { + myFixture.configureByFile(getFixturePath(ModuleAclXml.FILE_NAME)); + + final String errorMessage = inspectionBundle.message( + "inspection.error.missingAttribute", + "title" + ); + + assertHasNoHighlighting(errorMessage); + } + + /** + * ID attribute of ACL resource should have a value. + */ + public void testAclResourceWithEmptyIdShouldHaveWarning() { + myFixture.configureByFile(getFixturePath(ModuleAclXml.FILE_NAME)); + + final String errorMessage = inspectionBundle.message( + "inspection.error.idAttributeCanNotBeEmpty", + "id" + ); + + assertHasHighlighting(errorMessage); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/CacheableFalseInDefaultLayoutInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/CacheableFalseInDefaultLayoutInspectionTest.java new file mode 100644 index 000000000..cf2a6079b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/CacheableFalseInDefaultLayoutInspectionTest.java @@ -0,0 +1,33 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.inspections.xml; + +import com.magento.idea.magento2plugin.magento.files.LayoutXml; + +//tested referenceBlock only as block tag is Special markup for the tests +//@see https://www.jetbrains.org/intellij/sdk/docs/basics/testing_plugins/test_project_and_testdata_directories.html +public class CacheableFalseInDefaultLayoutInspectionTest extends InspectionXmlFixtureTestCase { + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(CacheableFalseInDefaultLayoutInspection.class); + } + + public void testWithCacheableFalseBlock() throws Exception { + myFixture.configureByFile(getFixturePath(LayoutXml.DEFAULT_FILENAME)); + myFixture.testHighlighting(true, false, false); + } + + public void testWithoutCacheableFalseBlock() throws Exception { + myFixture.configureByFile(getFixturePath(LayoutXml.DEFAULT_FILENAME)); + myFixture.testHighlighting(true, true, true); + } + + public void testWithCacheableFalseBlockNotDefaultLayout() throws Exception { + myFixture.configureByFile(getFixturePath("some_layout_index.xml")); + myFixture.testHighlighting(true, true, true); + } +} \ No newline at end of file diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/InspectionXmlFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/InspectionXmlFixtureTestCase.java new file mode 100644 index 000000000..7ead170af --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/InspectionXmlFixtureTestCase.java @@ -0,0 +1,34 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.xml; + +import com.magento.idea.magento2plugin.inspections.BaseInspectionsTestCase; +import com.magento.idea.magento2plugin.magento.packages.File; + +public abstract class InspectionXmlFixtureTestCase extends BaseInspectionsTestCase { + + private static final String testDataFolderPath = "testData" //NOPMD + + File.separator + + "inspections" + + File.separator; + + private static final String fixturesFolderPath = "xml" + File.separator; //NOPMD + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.setTestDataPath(testDataFolderPath); + } + + @Override + protected boolean isWriteActionRequired() { + return false; + } + + protected String getFixturePath(final String fileName) { + return prepareFixturePath(fileName, fixturesFolderPath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleDeclarationInModuleXmlInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleDeclarationInModuleXmlInspectionTest.java new file mode 100644 index 000000000..089d8fcbb --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleDeclarationInModuleXmlInspectionTest.java @@ -0,0 +1,131 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleXml; +import com.magento.idea.magento2plugin.project.Settings; + +public class ModuleDeclarationInModuleXmlInspectionTest + extends InspectionXmlFixtureTestCase { + private static final String MESSAGE_ID = + "inspection.moduleDeclaration.warning.wrongModuleName"; + private static final String WRONG_MODULE_NAME = "Wrong_ModuleName"; + private static final String SETUP_VERSION_ATTRIBUTE_VALUE = "1.0.0"; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(ModuleDeclarationInModuleXmlInspection.class); + } + + @Override + protected boolean isWriteActionRequired() { + return false; + } + + /** + * Inspection highlights warning in editable module. + */ + public void testWrongDeclarationInEditableModule() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.magentoPath = + "/src/xml/ModuleDeclarationInModuleXmlInspection/" + + "wrongDeclarationInEditableModule"; + myFixture.configureByFile( + getFixturePath("app/code/Test/TestModule/etc/" + ModuleXml.FILE_NAME) + ); + + final String errorMessage = inspectionBundle.message( + MESSAGE_ID, + WRONG_MODULE_NAME, + "Test_TestModule" + ); + + assertHasHighlighting(errorMessage); + } + + /** + * Inspection do not highlight wrong module name warning for setup version attribute. + */ + public void testSetupVersionNotErrorMessageInEditableModule() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.magentoPath = + "/src/xml/ModuleDeclarationInModuleXmlInspection/" + + "setupVersionNotErrorMessageInEditableModule"; + myFixture.configureByFile( + getFixturePath("app/code/Test/TestModule/etc/" + ModuleXml.FILE_NAME) + ); + + final String errorMessage = inspectionBundle.message( + MESSAGE_ID, + SETUP_VERSION_ATTRIBUTE_VALUE, + "Test_TestModule" + ); + + assertHasNoHighlighting(errorMessage); + } + + /** + * Inspection skips sub tags. + */ + public void testSubTagShouldNotBeHighlightedInEditableModule() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.magentoPath = + "/src/xml/ModuleDeclarationInModuleXmlInspection/" + + "wrongDeclarationInEditableModule"; + myFixture.configureByFile( + getFixturePath("app/code/Test/TestModule/etc/" + ModuleXml.FILE_NAME) + ); + + final String errorMessage = inspectionBundle.message( + MESSAGE_ID, + WRONG_MODULE_NAME, + "Test_TestModule" + ); + + assertHasNoHighlighting(errorMessage); + } + + /** + * Inspection skips warning in root. + */ + public void testWrongDeclarationInRoot() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.magentoPath = + "/src/xml/ModuleDeclarationInModuleXmlInspection/wrongDeclarationInRoot"; + myFixture.configureByFile( + getFixturePath("etc/" + ModuleXml.FILE_NAME) + ); + + final String errorMessage = inspectionBundle.message( + MESSAGE_ID, + WRONG_MODULE_NAME, + "WrongDeclarationInRoot_etc" + ); + + assertHasNoHighlighting(errorMessage); + } + + /** + * Inspection skips warning in vendor. + */ + public void testWrongDeclarationInVendor() { + final Settings settings = Settings.getInstance(myFixture.getProject()); + settings.magentoPath = + "/src/xml/ModuleDeclarationInModuleXmlInspection/wrongDeclarationInVendor"; + myFixture.configureByFile( + getFixturePath("vendor/magento/module-catalog/etc/" + ModuleXml.FILE_NAME) + ); + + final String errorMessage = inspectionBundle.message( + MESSAGE_ID, + WRONG_MODULE_NAME, + "module-catalog_etc" + ); + + assertHasNoHighlighting(errorMessage); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleScopeInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleScopeInspectionTest.java new file mode 100644 index 000000000..cf3674ffe --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ModuleScopeInspectionTest.java @@ -0,0 +1,50 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.xml; + +public class ModuleScopeInspectionTest extends InspectionXmlFixtureTestCase { + + private static final String WRONG_AREA = + "inspection.config.wrong.area"; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(ModuleScopeInspection.class); + } + + /** + * Inspection highlights warning if the area of a config file is wrong. + */ + public void testIncorrectArea() { + configureFixture("app/code/Test/TestModule/etc/adminhtmltypo/di.xml"); + + final String errorMessage = inspectionBundle.message( + WRONG_AREA + ); + + assertHasHighlighting(errorMessage); + } + + /** + * Inspection skips warning if the area is correct. + */ + public void testCorrectArea() { + configureFixture("app/code/Test/TestModule/etc/adminhtml/di.xml"); + + final String errorMessage = inspectionBundle.message( + WRONG_AREA + + ); + + assertHasNoHighlighting(errorMessage); + } + + private void configureFixture(final String fixturePath) { + myFixture.copyFileToProject(getFixturePath("app/code/Test/TestModule/registration.php")); + myFixture.configureByFile(getFixturePath(fixturePath)); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ObserverDeclarationInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ObserverDeclarationInspectionTest.java new file mode 100644 index 000000000..48e30fa17 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/ObserverDeclarationInspectionTest.java @@ -0,0 +1,42 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleEventsXml; + +@SuppressWarnings({"PMD.JUnitTestsShouldIncludeAssert"}) +public class ObserverDeclarationInspectionTest extends InspectionXmlFixtureTestCase { + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(ObserverDeclarationInspection.class); + } + + /** + * Tests for duplicate observer name inspection warning in the same events.xml + */ + public void testObserverNameUsedInSameFile() { + myFixture.configureByFile(getFixturePath(ModuleEventsXml.FILE_NAME)); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests for duplicate observer name inspection warning in a different events.xml + */ + public void testObserverNameUsedInDifferentFile() { + myFixture.configureByFile(getFixturePath(ModuleEventsXml.FILE_NAME)); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests warning for disabling of non-existing observer. + */ + public void testDisablingNonExistingObserver() { + myFixture.configureByFile(getFixturePath(ModuleEventsXml.FILE_NAME)); + myFixture.testHighlighting(true, false, false); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginAttributeTypeInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginAttributeTypeInspectionTest.java new file mode 100644 index 000000000..712c69233 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginAttributeTypeInspectionTest.java @@ -0,0 +1,89 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class PluginAttributeTypeInspectionTest extends InspectionXmlFixtureTestCase { + + private static final String ARGUMENT_VALUE_IS_EMPTY = + "inspection.error.idAttributeCanNotBeEmpty"; + private static final String CLASS_DOES_NOT_EXIST = + "inspection.warning.class.does.not.exist"; + private static final String EXISTENT_CLASS = + "Magento\\Catalog\\Plugin\\PluginClass"; + private static final String NOT_EXISTENT_CLASS = + "Not\\Existent\\Class"; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(PluginAttributeTypeInspection.class); + } + + /** + * Test for an error for the "type" attribute because it is empty. + * + */ + public void testAttrArgTypeValueIsEmpty() { + configureFixture(); + + final String forAttrIsEmptyMessage = inspectionBundle.message( + ARGUMENT_VALUE_IS_EMPTY, + ModuleDiXml.TYPE_ATTR + ); + + assertHasHighlighting(forAttrIsEmptyMessage); + } + + /** + * Test for no error for the "type" attribute because this class exists. + * + */ + public void testAttrTypeClassExists() { + configureFixture(); + + final String typeAttrIsEmptyMessage = inspectionBundle.message( + ARGUMENT_VALUE_IS_EMPTY, + ModuleDiXml.TYPE_ATTR + ); + + assertHasNoHighlighting(typeAttrIsEmptyMessage); + } + + /** + * Test for throwing an error for a class that does not exist for the "type" attribute. + */ + public void testClassAttrTypeDoesNotExists() { + configureFixture(); + + final String forClassDoesNotExists = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + NOT_EXISTENT_CLASS + ); + + assertHasHighlighting(forClassDoesNotExists); + } + + /** + * Test for the absence of an error in the presence of + * classes or interfaces specified for plugins. + */ + public void testClassAttrTypeIsExist() { + configureFixture(); + + final String classOneExists = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + EXISTENT_CLASS + ); + + assertHasNoHighlighting(classOneExists); + } + + private void configureFixture() { + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginDeclarationInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginDeclarationInspectionTest.java new file mode 100644 index 000000000..52ba9d8c8 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PluginDeclarationInspectionTest.java @@ -0,0 +1,129 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; +import com.magento.idea.magento2plugin.magento.packages.Areas; +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.magento.packages.Package; + +@SuppressWarnings({"PMD.JUnitTestsShouldIncludeAssert"}) +public class PluginDeclarationInspectionTest extends InspectionXmlFixtureTestCase { + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(PluginDeclarationInspection.class); + } + + private String getAreaPath(final String area) { + return Package.moduleBaseAreaDir + + File.separator + + Areas.getAreaByString(area) + + File.separator + + ModuleDiXml.FILE_NAME; + } + + /** + * Tests the plugin name duplication warning won't show in the di.xml file + */ + public void testPluginNameDuplicationWarningWontShow() { + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests warning for disabling of non-existing plugin. + */ + public void testDisabledNonExistingPlugin() { + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests whenever the duplication warning shows when the plugin name already + * defined in the same di.xml file + */ + public void testPluginNameUsedInSameFile() { + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests whenever the duplication warning occurs for a + * plugin name declared in the frontend area + * that is already defined in the frontend module + * area (Vendor/Module/etc/frontend/di.xml) + */ + public void testPluginNameAlreadyUsedInFrontendArea() { + myFixture.configureByFile(getFixturePath(getAreaPath("frontend"))); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests whenever the duplication warning occurs for + * a plugin name declared in the adminhtml area + * that is already defined in the adminhtml module area + * (Vendor/Module/etc/adminhtml/di.xml) + */ + public void testPluginNameAlreadyUsedInAdminhtmlArea() { + myFixture.configureByFile(getFixturePath(getAreaPath("adminhtml"))); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests whenever the duplication warning occurs for a plugin name + * that is already defined in the global module area (Vendor/Module/etc/di.xml) + */ + public void testPluginNameAlreadyUsedInGlobalArea() { + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests whenever the duplication warning occurs for + * a plugin name declared in the webapi_rest area + * that is already defined in the webapi_rest module + * area (Vendor/Module/etc/webapi_rest/di.xml) + */ + public void testPluginNameAlreadyUsedInWebApiRestArea() { + myFixture.configureByFile(getFixturePath(this.getAreaPath("webapi_rest"))); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests whenever the duplication warning occurs for + * a plugin name declared in the webapi_soap area + * that is already defined in the webapi_soap + * module area (Vendor/Module/etc/webapi_soap/di.xml) + */ + public void testPluginNameAlreadyUsedInWebApiSoapArea() { + myFixture.configureByFile(getFixturePath(getAreaPath("webapi_soap"))); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests whenever the duplication warning occurs for + * a plugin name declared in the graphql area + * that is already defined in the graphql module + * area (Vendor/Module/etc/graphql/di.xml) + */ + public void testPluginNameAlreadyUsedInGraphqlArea() { + myFixture.configureByFile(getFixturePath(getAreaPath("graphql"))); + myFixture.testHighlighting(true, false, false); + } + + /** + * Tests whenever the duplication warning occurs for + * a plugin name declared in the crontab area + * that is already defined in the crontab module + * area (Vendor/Module/etc/crontab/di.xml) + */ + public void testPluginNameAlreadyUsedInCrontabArea() { + myFixture.configureByFile(getFixturePath(getAreaPath("crontab"))); + myFixture.testHighlighting(true, false, false); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PreferenceDeclarationInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PreferenceDeclarationInspectionTest.java new file mode 100644 index 000000000..f3696b394 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/PreferenceDeclarationInspectionTest.java @@ -0,0 +1,150 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class PreferenceDeclarationInspectionTest extends InspectionXmlFixtureTestCase { + + private static final String ARGUMENT_VALUE_IS_EMPTY = + "inspection.error.idAttributeCanNotBeEmpty"; + private static final String CLASS_DOES_NOT_EXIST = + "inspection.warning.class.does.not.exist"; + private static final String EXISTENT_CLASS_ONE = + "Magento\\Catalog\\Api\\ProductRepositoryInterface"; + private static final String EXISTENT_CLASS_TWO = + "Foo\\Bar\\Model\\Logger"; + private static final String NOT_EXISTENT_CLASS = + "Not\\Existent\\Class"; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(PreferenceDeclarationInspection.class); + } + + /** + * Test for an error for the "for" attribute because it is empty. + * + */ + public void testAttrArgForValueIsEmpty() { + configureFixture(); + + final String forAttrIsEmptyMessage = inspectionBundle.message( + ARGUMENT_VALUE_IS_EMPTY, + ModuleDiXml.PREFERENCE_ATTR_FOR + ); + + assertHasHighlighting(forAttrIsEmptyMessage); + } + + /** + * Test for an error for the "type" attribute because it is empty. + * + */ + public void testAttrArgTypeValueIsEmpty() { + configureFixture(); + + final String forAttrIsEmptyMessage = inspectionBundle.message( + ARGUMENT_VALUE_IS_EMPTY, + ModuleDiXml.TYPE_ATTR + ); + + assertHasHighlighting(forAttrIsEmptyMessage); + } + + /** + * Test for an no error for the "for" attribute because this class exists. + * + */ + public void testAttrForClassExists() { + configureFixture(); + + final String typeAttrIsEmptyMessage = inspectionBundle.message( + ARGUMENT_VALUE_IS_EMPTY, + ModuleDiXml.PREFERENCE_ATTR_FOR + ); + + assertHasNoHighlighting(typeAttrIsEmptyMessage); + } + + /** + * Test for an no error for the "type" attribute because this class exists. + * + */ + public void testAttrTypeClassExists() { + configureFixture(); + + final String typeAttrIsEmptyMessage = inspectionBundle.message( + ARGUMENT_VALUE_IS_EMPTY, + ModuleDiXml.TYPE_ATTR + ); + + assertHasNoHighlighting(typeAttrIsEmptyMessage); + } + + /** + * Test for throwing an error for a class that does not exist for the "for" attribute. + */ + public void testClassAttrForDoesNotExists() { + configureFixture(); + + final String forClassDoesNotExists = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + NOT_EXISTENT_CLASS + ); + + assertHasHighlighting(forClassDoesNotExists); + } + + /** + * Test for the absence of an error in the presence of + * classes or interfaces specified for preferences. + */ + public void testClassAttrForIsExist() { + configureFixture(); + + final String classOneExists = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + EXISTENT_CLASS_ONE + ); + + assertHasNoHighlighting(classOneExists); + } + + /** + * Test for throwing an error for a class that does not exist for the "type" attribute. + */ + public void testClassAttrTypeDoesNotExists() { + configureFixture(); + + final String forClassDoesNotExists = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + NOT_EXISTENT_CLASS + ); + + assertHasHighlighting(forClassDoesNotExists); + } + + /** + * Test for the absence of an error in the presence of + * classes or interfaces specified for preferences. + */ + public void testClassAttrTypeIsExist() { + configureFixture(); + + final String classOneExists = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + EXISTENT_CLASS_TWO + ); + + assertHasNoHighlighting(classOneExists); + } + + private void configureFixture() { + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/TypeConfigurationTagTypesInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/TypeConfigurationTagTypesInspectionTest.java new file mode 100644 index 000000000..c88f4417b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/TypeConfigurationTagTypesInspectionTest.java @@ -0,0 +1,130 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class TypeConfigurationTagTypesInspectionTest extends InspectionXmlFixtureTestCase { + + private static final String CLASS_DOES_NOT_EXIST = "inspection.warning.class.does.not.exist"; + private static final String NOT_EXISTENT_CLASS = "Not\\Existent\\Class"; + private static final String NOT_EXISTENT_VIRTUAL_TYPE = "NotExistentVirtualType"; + // This virtual type is created in the scope of this inspection and + // it is in the ./testData/project/magento2/app/code/Foo/Bar/etc/di.xml file. + private static final String EXISTENT_VIRTUAL_TYPE = "VirtualProductRepository"; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(InvalidDependencyInjectionTypeInspection.class); + } + + /** + * Test type doesn't exists highlighting: . + */ + public void testNameAttributeValueTypeDoesNotExist() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + NOT_EXISTENT_CLASS + ); + + assertHasHighlighting(errorMessage); + } + + /** + * Test type exists: . + */ + public void testNameAttributeValueTypeExists() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + "Magento\\Catalog\\Api\\ProductRepositoryInterface" + ); + + assertHasNoHighlighting(errorMessage); + } + + /** + * Test argument factory type exists: TestingTypeFactory. + */ + public void testArgumentFactoryTypeExists() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + "Magento\\Catalog\\Api\\ProductRepositoryInterfaceFactory" + ); + + assertHasNoHighlighting(errorMessage); + } + + /** + * Test proxy type doesn't exist highlighting: + * TestType\Proxy. + */ + public void testRecursivelyArgumentProxyTypeDoesNotExist() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + NOT_EXISTENT_CLASS.concat("\\Proxy") + ); + + assertHasHighlighting(errorMessage); + } + + /** + * Test proxy type exists. + * TestType\Proxy + */ + public void testRecursivelyArgumentProxyTypeExists() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + "Magento\\Catalog\\Api\\ProductRepositoryInterfaceFactory\\Proxy" + ); + + assertHasNoHighlighting(errorMessage); + } + + /** + * Test proxy type doesn't exist highlighting: + * TestType\Proxy. + */ + public void testRecursivelyArgumentVirtualTypeDoesNotExist() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + NOT_EXISTENT_VIRTUAL_TYPE + ); + + assertHasHighlighting(errorMessage); + } + + /** + * Test virtual type exists. + * TestVirtualType + */ + public void testRecursivelyArgumentVirtualTypeExists() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + EXISTENT_VIRTUAL_TYPE + ); + + assertHasNoHighlighting(errorMessage); + } + + private void configureFixture() { + myFixture.configureByFile(getFixturePath(ModuleDiXml.FILE_NAME)); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/inspections/xml/WebApiServiceInspectionTest.java b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/WebApiServiceInspectionTest.java new file mode 100644 index 000000000..81f496bb3 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/inspections/xml/WebApiServiceInspectionTest.java @@ -0,0 +1,126 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.inspections.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleWebApiXmlFile; + +public class WebApiServiceInspectionTest extends InspectionXmlFixtureTestCase { + + private static final String CLASS_DOES_NOT_EXIST = + "inspection.warning.class.does.not.exist"; + + private static final String METHOD_DOES_NOT_EXIST = + "inspection.warning.method.does.not.exist"; + + private static final String METHOD_SHOULD_HAVE_PUBLIC_ACCESS = + "inspection.warning.method.should.have.public.access"; + + private static final String NOT_EXISTENT_CLASS = + "Not\\Existent\\Class"; + + private static final String NOT_EXISTENT_METHOD = + "notExistent"; + + private static final String NOT_PUBLIC_METHOD = + "myProtected"; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(WebApiServiceInspection.class); + } + + /** + * Inspection highlights warning if the class attribute in the service tag contains + * name of the not existent class. + */ + public void testNotExistentClass() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + NOT_EXISTENT_CLASS + ); + + assertHasHighlighting(errorMessage); + } + + /** + * Inspection skips warning if the service class exists. + */ + public void testExistentClass() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + CLASS_DOES_NOT_EXIST, + NOT_EXISTENT_CLASS + ); + + assertHasNoHighlighting(errorMessage); + } + + /** + * Inspection highlights warning if the method attribute in the service tag contains + * name of the not existent method. + */ + public void testNotExistentMethod() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + METHOD_DOES_NOT_EXIST, + NOT_EXISTENT_METHOD + ); + + assertHasHighlighting(errorMessage); + } + + /** + * Inspection skips warning if the service method exists. + */ + public void testExistentMethod() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + METHOD_DOES_NOT_EXIST, + NOT_EXISTENT_METHOD + ); + + assertHasNoHighlighting(errorMessage); + } + + /** + * Inspection highlights warning if the method attribute in the service tag contains + * name of the method with not public access. + */ + public void testNotPublicMethod() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + METHOD_SHOULD_HAVE_PUBLIC_ACCESS, + NOT_PUBLIC_METHOD + ); + + assertHasHighlighting(errorMessage); + } + + /** + * Inspection skips warning if the service method has public access. + */ + public void testPublicMethod() { + configureFixture(); + + final String errorMessage = inspectionBundle.message( + METHOD_SHOULD_HAVE_PUBLIC_ACCESS, + NOT_PUBLIC_METHOD + ); + + assertHasNoHighlighting(errorMessage); + } + + private void configureFixture() { + myFixture.configureByFile(getFixturePath(ModuleWebApiXmlFile.FILE_NAME)); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/LinemarkerFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/LinemarkerFixtureTestCase.java new file mode 100644 index 000000000..e47e486fc --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/linemarker/LinemarkerFixtureTestCase.java @@ -0,0 +1,82 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker; + +import com.intellij.codeInsight.daemon.LineMarkerInfo; +import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl; +import com.magento.idea.magento2plugin.BaseProjectTestCase; +import com.magento.idea.magento2plugin.magento.packages.File; +import java.util.List; +import javax.swing.Icon; +import org.jetbrains.annotations.NotNull; + +public abstract class LinemarkerFixtureTestCase extends BaseProjectTestCase { + + private static final String TEST_DATA_PATH + = "testData" + File.separator + "linemarker" + File.separator; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.setTestDataPath(TEST_DATA_PATH); + } + + protected String getFixturePath(final String fileName, final String folder) { + return prepareFixturePath(fileName, folder + File.separator); + } + + protected void assertHasLinemarkerWithTooltipAndIcon(final String tooltip, final String icon) { + myFixture.doHighlighting(); + + final List> lineMarkers = getDocumentLineMarkers(); + assertNotEmpty(lineMarkers); + for (final LineMarkerInfo lineMarkerInfo: lineMarkers) { + final String lineMarkerTooltip = lineMarkerInfo.getLineMarkerTooltip(); + final Icon lineMarkerIcon = lineMarkerInfo.getIcon(); + if (lineMarkerTooltip == null || lineMarkerIcon == null) { + continue; + } + if (lineMarkerTooltip.equals(tooltip) + && lineMarkerIcon.toString().contains(icon)) { + return; + } + } + + final String lineMarkerNotFound + = "Failed that documents contains linemarker with the tooltip `%s`"; + fail(String.format(lineMarkerNotFound, tooltip)); + } + + protected void assertHasNoLinemarkerWithTooltipAndIcon( + final String tooltip, + final String icon + ) { + myFixture.doHighlighting(); + final String lineMarkerExist + = "Failed that documents not contains linemarker with the tooltip `%s`"; + + final List> lineMarkers = getDocumentLineMarkers(); + for (final LineMarkerInfo lineMarkerInfo: lineMarkers) { + final String lineMarkerTooltip = lineMarkerInfo.getLineMarkerTooltip(); + final Icon lineMarkerIcon = lineMarkerInfo.getIcon(); + if (lineMarkerTooltip == null || lineMarkerIcon == null) { + continue; + } + if (lineMarkerTooltip.equals(tooltip) + && lineMarkerIcon.toString().equals(icon)) { + fail(String.format(lineMarkerExist, tooltip)); + } + } + } + + @NotNull + private List> getDocumentLineMarkers() { + return DaemonCodeAnalyzerImpl.getLineMarkers( + myFixture.getEditor().getDocument(), + getProject() + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/graphqls/GraphQlResolverClassLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/graphqls/GraphQlResolverClassLinemarkerRegistrarTest.java new file mode 100644 index 000000000..ba0bb9048 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/linemarker/graphqls/GraphQlResolverClassLinemarkerRegistrarTest.java @@ -0,0 +1,20 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.graphqls; + +import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; + +public class GraphQlResolverClassLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { + + /** + * Tests linemarkers in the schema.graphqls file for PHP resolver classes. + */ + public void testWithValidSchemaResolver() { + myFixture.configureByFile(this.getFixturePath("schema.graphqls", "graphqls")); + + assertHasLinemarkerWithTooltipAndIcon("Navigate to class", "Class"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ConfigurationTypeClassLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ConfigurationTypeClassLinemarkerRegistrarTest.java new file mode 100644 index 000000000..a9673272a --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ConfigurationTypeClassLinemarkerRegistrarTest.java @@ -0,0 +1,29 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.php; + +import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; + +public class ConfigurationTypeClassLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { + + /** + * Tests linemarkers in the configured class. + */ + public void testTypeNameClassShouldHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("Topmenu.php", "php")); + + assertHasLinemarkerWithTooltipAndIcon("Navigate to configuration", "fileTypes/xml.svg"); + } + + /** + * Tests linemarkers in the non-configured class. + */ + public void testRegularPhpClassShouldNotHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("ClassNotConfiguredInDiXml.php", "php")); + + assertHasNoLinemarkerWithTooltipAndIcon("Navigate to configuration", "fileTypes/xml.svg"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/GraphQlResolverUsageLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/GraphQlResolverUsageLinemarkerRegistrarTest.java new file mode 100644 index 000000000..5b1ddb7c6 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/GraphQlResolverUsageLinemarkerRegistrarTest.java @@ -0,0 +1,29 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.php; + +import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; + +public class GraphQlResolverUsageLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { + + /** + * Tests linemarkers in the resolver class. + */ + public void testResolverClassShouldHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("Resolver.php", "php")); + + assertHasNoLinemarkerWithTooltipAndIcon("Navigate to schema", "icons/graphqlFile.svg"); + } + + /** + * Tests linemarkers in the regular class. + */ + public void testRegularClassShouldNotHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("ClassNotConfiguredInSchema.php", "php")); + + assertHasNoLinemarkerWithTooltipAndIcon("Navigate to schema", "icons/graphqlFile.svg"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ObserverClassLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ObserverClassLinemarkerRegistrarTest.java new file mode 100644 index 000000000..a165c2348 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/ObserverClassLinemarkerRegistrarTest.java @@ -0,0 +1,29 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.php; + +import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; + +public class ObserverClassLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { + + /** + * Tests linemarkers in the Observer class. + */ + public void testObserverClassShouldHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("TestObserver.php", "php")); + + assertHasLinemarkerWithTooltipAndIcon("Navigate to configuration", "fileTypes/xml.svg"); + } + + /** + * Tests linemarkers in the regular class. + */ + public void testRegularPhpClassShouldNotHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("TestNotObserver.php", "php")); + + assertHasNoLinemarkerWithTooltipAndIcon("Navigate to configuration", "fileTypes/xml.svg"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginLinemarkerRegistrarTest.java new file mode 100644 index 000000000..817a4f005 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginLinemarkerRegistrarTest.java @@ -0,0 +1,29 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.php; + +import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; + +public class PluginLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { + + /** + * Tests linemarker in a class which has plugins. + */ + public void testClassWithPluginShouldHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("PluginClass.php", "php")); + + assertHasLinemarkerWithTooltipAndIcon("Navigate to plugins", "nodes/plugin.svg"); + } + + /** + * Tests linemarker in a class which does not have plugins. + */ + public void testClassWithoutPluginShouldNotHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("RegularClass.php", "php")); + + assertHasNoLinemarkerWithTooltipAndIcon("Navigate to plugins", "nodes/plugin.svg"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLinemarkerRegistrarTest.java new file mode 100644 index 000000000..6e9f77647 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/PluginTargetLinemarkerRegistrarTest.java @@ -0,0 +1,42 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.php; + +import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; + +@SuppressWarnings("PMD.JUnitTestContainsTooManyAsserts") +public class PluginTargetLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { + + /** + * Tests linemarkers in a class which plugs in to a class and its method. + */ + public void testPluginToClassShouldHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("Topmenu.php", "php")); + + assertHasLinemarkerWithTooltipAndIcon("Navigate to target method", "nodes/method.svg"); + assertHasLinemarkerWithTooltipAndIcon("Navigate to target class", "nodes/class.svg"); + } + + /** + * Tests linemarkers in a class which plugs in to an interface and its method. + */ + public void testPluginToInterfaceShouldHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("MviewState.php", "php")); + + assertHasLinemarkerWithTooltipAndIcon("Navigate to target method", "nodes/method.svg"); + assertHasLinemarkerWithTooltipAndIcon("Navigate to target class", "nodes/class.svg"); + } + + /** + * Tests linemarkers in a regular class which does not plug in to any class or interface. + */ + public void testRegularClassShouldNotHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("ClassNotConfiguredInDiXml.php", "php")); + + assertHasNoLinemarkerWithTooltipAndIcon("Navigate to target method", "/nodes/method.svg"); + assertHasNoLinemarkerWithTooltipAndIcon("Navigate to target class", "nodes/class.svg"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLinemarkerRegistrarTest.java new file mode 100644 index 000000000..76c712061 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/TestFixtureLinemarkerRegistrarTest.java @@ -0,0 +1,29 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.php; + +import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; + +public class TestFixtureLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { + + /** + * Tests linemarkers for @magentoDataFixture tag. + */ + public void testMagentoDataFixtureHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("Test.php", "php")); + + assertHasLinemarkerWithTooltipAndIcon("Navigate to fixtures", "icons/php-icon.svg"); + } + + /** + * Tests linemarkers for @magentoApiDataFixture tag. + */ + public void testMagentoApiDataFixtureHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("Test.php", "php")); + + assertHasLinemarkerWithTooltipAndIcon("Navigate to fixtures", "icons/php-icon.svg"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/linemarker/php/WebApiLinemarkerRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/WebApiLinemarkerRegistrarTest.java new file mode 100644 index 000000000..59ff4d8e8 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/linemarker/php/WebApiLinemarkerRegistrarTest.java @@ -0,0 +1,82 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.linemarker.php; + +import com.intellij.openapi.application.ex.ApplicationManagerEx; +import com.magento.idea.magento2plugin.MagentoIcons; +import com.magento.idea.magento2plugin.linemarker.LinemarkerFixtureTestCase; + +@SuppressWarnings("PMD.JUnitTestContainsTooManyAsserts") +public class WebApiLinemarkerRegistrarTest extends LinemarkerFixtureTestCase { + + private static final String EXPECTED_CLASS_LINE_MARKER_TOOLTIP + = "Navigate to Web API configuration:
  PUT     /V1/blog/post\n"
+            + "  POST    /V1/blog/update\n"
+            + "
"; + + private static final String EXPECTED_METHOD_CREATE_LINE_MARKER_TOOLTIP + = "Navigate to Web API configuration:
  POST    /V1/blog/update\n"
+            + "
"; + + private static final String EXPECTED_METHOD_UPDATE_LINE_MARKER_TOOLTIP + = "Navigate to Web API configuration:
  PUT     /V1/blog/post\n"
+            + "
"; + + /** + * Class configured as WEB API service in web_api.xml should have WEB API line markers. + */ + public void testWebApiServiceShouldHaveLinemarker() { + // work around for issue caused by + // com.magento.idea.magento2plugin.linemarker.xml.LineMarkerXmlTagDecorator + // in com.intellij.psi.impl.smartPointers.SmartPsiElementPointerImpl.createElementInfo + final boolean isInStressTestCurrent = ApplicationManagerEx.isInStressTest(); + ApplicationManagerEx.setInStressTest(true); + + myFixture.configureByFile(this.getFixturePath("TestService.php", "php")); + + //assert class line marker + assertHasLinemarkerWithTooltipAndIcon( + EXPECTED_CLASS_LINE_MARKER_TOOLTIP, + MagentoIcons.WEB_API.toString() + ); + + //assert methods line markers + assertHasLinemarkerWithTooltipAndIcon( + EXPECTED_METHOD_CREATE_LINE_MARKER_TOOLTIP, + MagentoIcons.WEB_API.toString() + ); + assertHasLinemarkerWithTooltipAndIcon( + EXPECTED_METHOD_UPDATE_LINE_MARKER_TOOLTIP, + MagentoIcons.WEB_API.toString() + ); + + //restore default value + ApplicationManagerEx.setInStressTest(isInStressTestCurrent); + } + + /** + * Regular class should not have WEB API line markers. + */ + public void testRegularPhpClassShouldNotHaveLinemarker() { + myFixture.configureByFile(this.getFixturePath("ClassNotConfiguredInWebApiXml.php", "php")); + + //assert class line marker + assertHasNoLinemarkerWithTooltipAndIcon( + EXPECTED_CLASS_LINE_MARKER_TOOLTIP, + MagentoIcons.WEB_API.toString() + ); + + //assert methods line markers + assertHasNoLinemarkerWithTooltipAndIcon( + EXPECTED_METHOD_CREATE_LINE_MARKER_TOOLTIP, + MagentoIcons.WEB_API.toString() + ); + assertHasNoLinemarkerWithTooltipAndIcon( + EXPECTED_METHOD_UPDATE_LINE_MARKER_TOOLTIP, + MagentoIcons.WEB_API.toString() + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/BaseReferenceTestCase.java b/src/test/java/com/magento/idea/magento2plugin/reference/BaseReferenceTestCase.java new file mode 100644 index 000000000..1a3adae14 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/BaseReferenceTestCase.java @@ -0,0 +1,298 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference; + +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFile; +import com.intellij.psi.PsiReference; +import com.intellij.psi.PsiReferenceProvider; +import com.intellij.psi.ResolveResult; +import com.intellij.psi.impl.file.PsiDirectoryImpl; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.psi.xml.XmlFile; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.ProcessingContext; +import com.jetbrains.php.lang.psi.elements.Method; +import com.jetbrains.php.lang.psi.elements.Parameter; +import com.jetbrains.php.lang.psi.elements.ParameterList; +import com.jetbrains.php.lang.psi.elements.PhpClass; +import com.magento.idea.magento2plugin.inspections.BaseInspectionsTestCase; +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.reference.xml.PolyVariantReferenceBase; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.jetbrains.annotations.Nullable; + +@SuppressWarnings({ + "PMD.TooManyMethods", +}) +public abstract class BaseReferenceTestCase extends BaseInspectionsTestCase { + private static final String testDataFolderPath = "testData" + File.separator//NOPMD + + "reference" + File.separator; + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.setTestDataPath(testDataFolderPath); + } + + @SuppressWarnings("PMD.CognitiveComplexity") + protected void assertHasReferenceToXmlAttributeValue(final String reference) { + final PsiElement element = getElementFromCaret(); + for (final PsiReference psiReference: element.getReferences()) { + if (psiReference instanceof PolyVariantReferenceBase) { + final ResolveResult[] resolveResults + = ((PolyVariantReferenceBase) psiReference).multiResolve(true); + + for (final ResolveResult resolveResult : resolveResults) { + final PsiElement resolved = resolveResult.getElement(); + if (!(resolved instanceof XmlAttributeValue)) { + continue; + } + + if (((XmlAttributeValue) resolved).getValue().equals(reference)) { + return; + } + } + } else { + final PsiElement resolved = psiReference.resolve(); + if (!(resolved instanceof XmlAttributeValue)) { + continue; + } + + if (((XmlAttributeValue) resolved).getValue().equals(reference)) { + return; + } + } + } + final String referenceNotFound = + "Failed that element contains reference to the attribute value `%s`"; + + fail(String.format(referenceNotFound, reference)); + } + + @SuppressWarnings("PMD.CognitiveComplexity") + protected void assertHasReferenceToXmlTag(final String tagName) { + final PsiElement element = getElementFromCaret(); + for (final PsiReference psiReference: element.getReferences()) { + if (psiReference instanceof PolyVariantReferenceBase) { + final ResolveResult[] resolveResults + = ((PolyVariantReferenceBase) psiReference).multiResolve(true); + + for (final ResolveResult resolveResult : resolveResults) { + final PsiElement resolved = resolveResult.getElement(); + if (!(resolved instanceof XmlTag)) { + continue; + } + + if (((XmlTag) resolved).getName().equals(tagName)) { + return; + } + } + } else { + final PsiElement resolved = psiReference.resolve(); + if (!(resolved instanceof XmlTag)) { + continue; + } + + if (((XmlTag) resolved).getName().equals(tagName)) { + return; + } + } + } + final String referenceNotFound + = "Failed that element contains reference to the XML tag `%s`"; + + fail(String.format(referenceNotFound, tagName)); + } + + protected void assertHasReferenceToFile(final String reference) { + final PsiElement element = getElementFromCaret(); + + assertHasReferenceToFile(reference, Arrays.asList(element.getReferences())); + } + + protected void assertHasReferenceToFile( + final String reference, + final Class providerClass + ) { + final PsiElement element = getLeafElementFromCaret(); + final List references = new ArrayList<>(); + + try { + final PsiReferenceProvider provider = providerClass.getConstructor().newInstance(); + references.addAll( + Arrays.asList( + provider.getReferencesByElement(element, new ProcessingContext()) + ) + ); + } catch (NoSuchMethodException + | IllegalAccessException + | InvocationTargetException + | InstantiationException exception + ) { + references.addAll(Arrays.asList(element.getReferences())); + } + + assertHasReferenceToFile(reference, references); + } + + protected void assertHasReferenceToFile( + final String reference, + final List references + ) { + for (final PsiReference psiReference : references) { + final PsiElement resolved = psiReference.resolve(); + if (!(resolved instanceof PsiFile)) { + continue; + } + if (((PsiFile) resolved).getVirtualFile().getPath().endsWith(reference)) { + return; + } + } + final String referenceNotFound = "Failed that element contains reference to the file `%s`"; + + fail(String.format(referenceNotFound, reference)); + } + + protected void assertHasReferenceToXmlFile(final String fileName) { + final PsiElement element = getElementFromCaret(); + for (final PsiReference psiReference : element.getReferences()) { + final PsiElement resolved = psiReference.resolve(); + if (!(resolved instanceof XmlFile)) { + continue; + } + + if (((XmlFile) resolved).getName().equals(fileName)) { + return; + } + } + final String referenceNotFound + = "Failed that element contains reference to the XML tag `%s`"; + + fail(String.format(referenceNotFound, fileName)); + } + + protected void assertHasReferenceToDirectory(final String directoryName) { + for (final PsiReference psiReference : getElementFromCaret().getReferences()) { + final PsiElement resolvedElement = psiReference.resolve(); + if (resolvedElement instanceof PsiDirectoryImpl + && ((PsiDirectoryImpl) resolvedElement).getName().equals(directoryName)) { + return; + } + } + + final String referenceNotFound + = "Failed that element contains reference to the directory `%s`"; + fail(String.format(referenceNotFound, directoryName)); + } + + protected void assertHasNoReferenceToDirectory(final String directoryName) { + for (final PsiReference psiReference : getElementFromCaret().getReferences()) { + final PsiElement resolvedElement = psiReference.resolve(); + if (resolvedElement instanceof PsiDirectoryImpl + && ((PsiDirectoryImpl) resolvedElement).getName().equals(directoryName)) { + final String referenceNotFound + = "Failed that element does not contain reference to the directory `%s`"; + fail(String.format(referenceNotFound, directoryName)); + } + } + } + + @SuppressWarnings("PMD") + protected void assertHasReferencePhpClass(final String phpClassFqn) { + final PsiElement element = getElementFromCaret(); + final PsiReference[] references = element.getReferences(); + String result = ((PhpClass) references[references.length - 1] + .resolve()) + .getPresentableFQN(); + assertEquals( + phpClassFqn, + result + ); + } + + protected void assertHasReferencetoConstructorParameter( + final String argumentClassFqn, + final String argumentName + ) { + final PsiElement element = getElementFromCaret(); + final @Nullable PsiReference reference = element.getReference(); + + if (reference == null) { + final String referenceNotFound + = "Failed that element does not contain and reference"; + fail(referenceNotFound); + } + + final String parameterClassFqn = ((Parameter) reference.resolve()) + .getLocalType().toStringResolved(); + final String parameterName = ((Parameter) reference.resolve()).getName(); + + assertEquals("Class name in argument equals class name in parameter", + parameterClassFqn, + argumentClassFqn); + assertEquals("Variable name in argument equals variable name in parameter", + parameterName, + argumentName); + } + + protected void assertHasReferenceToClassMethod( + final String className, + final String methodName + ) { + final PsiElement element = getElementFromCaret(); + final PsiReference[] references = element.getReferences(); + final String actualClassName = ((PhpClass) references[references.length - 1].resolve() + .getParent()).getPresentableFQN(); + final String actualMethodName = ((Method) references[references.length - 1].resolve()) + .getName(); + + assertEquals( + "Class name", + className, + actualClassName + ); + assertEquals( + "Method name", + methodName, + actualMethodName + ); + } + + protected void assertHasReferenceToMethodArgument(final String argument) { + final PsiReference[] references = getElementFromCaret().getReferences(); + final String actualArgument + = StringUtil.unquoteString(references[references.length - 1].resolve().getText()); + final PsiElement parameterList = references[0].resolve().getParent(); + + if (!(parameterList instanceof ParameterList)) { + fail("Element doesn't have a reference to a method parameter"); + } + + assertEquals( + "Event dispatch argument", + argument, + actualArgument + ); + } + + protected void assertEmptyReference() { + final PsiElement element = getElementFromCaret(); + assertEmpty(element.getReferences()); + } + + private PsiElement getElementFromCaret() { + return myFixture.getFile().findElementAt(myFixture.getCaretOffset()).getParent(); + } + + private PsiElement getLeafElementFromCaret() { + return myFixture.getFile().findElementAt(myFixture.getCaretOffset()); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/js/ReferenceJsFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/reference/js/ReferenceJsFixtureTestCase.java new file mode 100644 index 000000000..f9d42dc54 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/js/ReferenceJsFixtureTestCase.java @@ -0,0 +1,17 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.js; + +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.reference.BaseReferenceTestCase; + +abstract public class ReferenceJsFixtureTestCase extends BaseReferenceTestCase { + + private static final String fixturesFolderPath = "js" + File.separator; + + protected String getFixturePath(String fileName) { + return prepareFixturePath(fileName, fixturesFolderPath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/js/RequireJsReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/js/RequireJsReferenceRegistrarTest.java new file mode 100644 index 000000000..0ecb6f720 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/js/RequireJsReferenceRegistrarTest.java @@ -0,0 +1,62 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.js; + +import com.magento.idea.magento2plugin.reference.provider.FilePathReferenceProvider; + +public class RequireJsReferenceRegistrarTest extends ReferenceJsFixtureTestCase { + + private static final String FIXTURE_PATH = "test.js"; + private static final String MIXIN_FIXTURE_PATH = "requirejs-config.js"; + + /** + * Mapped parameters should have reference to file. + */ + public void testMappedInjectionParameterMustHaveReference() { + myFixture.configureByFile(getFixturePath(FIXTURE_PATH)); + + assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file.js"); + } + + /** + * Path parameters should have reference to file. + */ + public void testPathInjectionParameterMustHaveReference() { + myFixture.configureByFile(getFixturePath(FIXTURE_PATH)); + + assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file2.js"); + } + + /** + * The Magento resource file path parameters should have reference to file. + */ + public void testFileInjectionParameterMustHaveReference() { + myFixture.configureByFile(getFixturePath(FIXTURE_PATH)); + + assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file.js"); + } + + /** + * Lib resource parameters should have reference to file. + */ + public void testLibInjectionParameterMustHaveReference() { + myFixture.configureByFile(getFixturePath(FIXTURE_PATH)); + + assertHasReferenceToFile("/lib/web/testjs.js"); + } + + /** + * Mixin declaration parameters should have reference to file. + */ + public void testFilePathInMixinDeclarationMustHaveReference() { + myFixture.configureByFile(getFixturePath(MIXIN_FIXTURE_PATH)); + + assertHasReferenceToFile( + "app/code/Foo/Bar/view/frontend/web/js/file.js", + FilePathReferenceProvider.class + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/php/ConfigPhpModuleReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/php/ConfigPhpModuleReferenceRegistrarTest.java new file mode 100644 index 000000000..1eeeb3da9 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/php/ConfigPhpModuleReferenceRegistrarTest.java @@ -0,0 +1,27 @@ +/** + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.php; + +public class ConfigPhpModuleReferenceRegistrarTest extends ReferencePhpFixtureTestCase { + + /** + * Tests for module name reference under array key 'modules' in config.php + */ + public void testModuleNameMustHaveReference() { + myFixture.configureByFile(this.getFixturePath("config.php")); + + assertHasReferenceToDirectory("module-catalog"); + } + + /** + * Tests for no module name reference under a different array key in config.php + */ + public void testModuleNameMustNotHaveReference() { + myFixture.configureByFile(this.getFixturePath("config.php")); + + assertHasNoReferenceToDirectory("module-catalog"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/php/ObserverDispatchEventReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/php/ObserverDispatchEventReferenceRegistrarTest.java new file mode 100644 index 000000000..3e9346457 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/php/ObserverDispatchEventReferenceRegistrarTest.java @@ -0,0 +1,15 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.php; + +public class ObserverDispatchEventReferenceRegistrarTest extends ReferencePhpFixtureTestCase { + + public void testDispatchCallParamMustHaveReference() { + String filePath = this.getFixturePath("TestBlock.php"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("test_event_in_test_class"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/php/ReferencePhpFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/reference/php/ReferencePhpFixtureTestCase.java new file mode 100644 index 000000000..47ddefb09 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/php/ReferencePhpFixtureTestCase.java @@ -0,0 +1,17 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.php; + +import com.magento.idea.magento2plugin.reference.BaseReferenceTestCase; +import com.magento.idea.magento2plugin.magento.packages.File; + +abstract public class ReferencePhpFixtureTestCase extends BaseReferenceTestCase { + + private static final String fixturesFolderPath = "php" + File.separator; + + protected String getFixturePath(String fileName) { + return prepareFixturePath(fileName, fixturesFolderPath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConfigurationTypeReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConfigurationTypeReferenceRegistrarTest.java new file mode 100644 index 000000000..ca0b4550f --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConfigurationTypeReferenceRegistrarTest.java @@ -0,0 +1,17 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class ConfigurationTypeReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + public void testDiXmlTypeNameMustHaveReference() { + String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + myFixture.configureByFile(filePath); + + assertHasReferencePhpClass("Magento\\Backend\\Model\\Source\\YesNo"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConstructorArgumentReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConstructorArgumentReferenceRegistrarTest.java new file mode 100644 index 000000000..9bb376e1e --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ConstructorArgumentReferenceRegistrarTest.java @@ -0,0 +1,31 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class ConstructorArgumentReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + /** + * Tests for valid reference in di.xml constructor argument + */ + public void testDiXmlConstructorArgumentMustHaveReference() { + myFixture.configureByFile(this.getFixturePath(ModuleDiXml.FILE_NAME)); + + assertHasReferencetoConstructorParameter( + "\\Magento\\Framework\\Logger\\LoggerInterface", + "logger" + ); + } + + /** + * Tests for no reference in di.xml constructor argument + */ + public void testDiXmlConstructorArgumentMustNotHaveReference() { + myFixture.configureByFile(this.getFixturePath(ModuleDiXml.FILE_NAME)); + + assertEmptyReference(); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/CrontabReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/CrontabReferenceRegistrarTest.java new file mode 100644 index 000000000..bd763fe19 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/CrontabReferenceRegistrarTest.java @@ -0,0 +1,43 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.CrontabXmlTemplate; + +public class CrontabReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + private static final String EXPECTED_CLASS = "Magento\\Catalog\\Cron\\RefreshSpecialPrices"; + private static final String EXPECTED_METHOD = "execute"; + + /** + * Test instance attribute of the crontab.xml file must have reference. + */ + public void testCrontabInstanceMustHaveReference() { + myFixture.configureByFile(this.getFixturePath(CrontabXmlTemplate.FILE_NAME)); + + assertHasReferencePhpClass(EXPECTED_CLASS); + } + + /** + * Tests for reference to valid PHP method in crontab.xml. + */ + public void testCrontabMethodMustHaveReference() { + myFixture.configureByFile(this.getFixturePath(CrontabXmlTemplate.FILE_NAME)); + + assertHasReferenceToClassMethod( + EXPECTED_CLASS, + EXPECTED_METHOD + ); + } + + /** + * Tests for no reference to invalid PHP method in crontab.xml. + */ + public void testCrontabMethodMustNotHaveReference() { + myFixture.configureByFile(this.getFixturePath(CrontabXmlTemplate.FILE_NAME)); + + assertEmptyReference(); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/DisabledPluginReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/DisabledPluginReferenceRegistrarTest.java new file mode 100644 index 000000000..83611c9df --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/DisabledPluginReferenceRegistrarTest.java @@ -0,0 +1,20 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class DisabledPluginReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + /** + * Tests for disabled plugin name reference to original definition. + */ + public void testDisabledPluginNameMustHaveReference() { + myFixture.configureByFile(this.getFixturePath(ModuleDiXml.FILE_NAME)); + + assertHasReferenceToXmlAttributeValue("catalogTopmenu"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutBlockReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutBlockReferenceRegistrarTest.java new file mode 100644 index 000000000..3367afdeb --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutBlockReferenceRegistrarTest.java @@ -0,0 +1,17 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.LayoutXml; + +public class LayoutBlockReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + public void testReferenceBlockMustHaveReference() { + String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlTag("block"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutContainerReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutContainerReferenceRegistrarTest.java new file mode 100644 index 000000000..5c254ec0b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutContainerReferenceRegistrarTest.java @@ -0,0 +1,22 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.LayoutXml; + +public class LayoutContainerReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + /** + * The `name` attribute of the `referenceContainer` tag in layout XML must + * have reference to the `name` attribute of `container` tag. + */ + public void testReferenceContainerMustHaveReference() { + final String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlTag("container"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUIComponentReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUIComponentReferenceRegistrarTest.java new file mode 100644 index 000000000..4eb0c4f92 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUIComponentReferenceRegistrarTest.java @@ -0,0 +1,18 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.LayoutXml; + +public class LayoutUIComponentReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + public void testUIComponentMustHaveReference() { + final String filePath = this.getFixturePath(LayoutXml.DEFAULT_FILENAME); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlFile("recently_viewed_2.xml"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUpdateHandleReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUpdateHandleReferenceRegistrarTest.java new file mode 100644 index 000000000..0c6e684d9 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/LayoutUpdateHandleReferenceRegistrarTest.java @@ -0,0 +1,22 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +public class LayoutUpdateHandleReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + /** + * The `handle` attribute of the `update` tag in the layout XML must + * have reference to the layout. + */ + public void testLayoutUpdateHandleMustHaveReference() { + final String filePath = this.getFixturePath("test_test_test.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToFile( + "magento/module-catalog/view/frontend/layout/test_index_index.xml" + ); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MenuReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MenuReferenceRegistrarTest.java new file mode 100644 index 000000000..1d22614b1 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MenuReferenceRegistrarTest.java @@ -0,0 +1,22 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleMenuXml; + +public class MenuReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + /** + * The `parent` attribute of the `add` tag in a menu XML must + * have reference to the `id` attribute of the another `add` tag. + */ + public void testAddTagMustHaveCompletion() { + final String filePath = this.getFixturePath(ModuleMenuXml.fileName); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlTag(ModuleMenuXml.addTag); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfEntityNameReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfEntityNameReferenceRegistrarTest.java new file mode 100644 index 000000000..58553611a --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfEntityNameReferenceRegistrarTest.java @@ -0,0 +1,101 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.xml; + +public class MftfEntityNameReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + public void testCreateDataActionGroupMustHaveReference() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); + } + + public void testCreateDataInTestMustHaveReference() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); + } + + public void testUpdateDataActionGroupMustHaveReference() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); + } + + public void testUpdateDataInTestMustHaveReference() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); + } + + public void testUserInputInActionGroupMustHaveReference() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); + } + + public void testUserInputInTestMustHaveReference() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); + } + + public void testEntityExtendsInDataMustHaveReference() { + String filePath = this.getFixturePath("TestData.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestAdminMenuCatalog"); + } + + public void testCreateDataActionGroupPluginDisabled() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + disablePluginAndReindex(); + + assertEmptyReference(); + } + + public void testCreateDataActionGroupMftfSupportDisabled() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + disableMftfSupportAndReindex(); + + assertEmptyReference(); + } + + public void testCreateDataInTestWithSectionMustBeEmpty() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } + + public void testUpdateDataInTestWithSectionMustBeEmpty() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } + + public void testUserInputInTestMustBeEmpty() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } + + public void testEntityExtendsInDataMustBeEmpty() { + String filePath = this.getFixturePath("TestData.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfNameReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfNameReferenceRegistrarTest.java new file mode 100644 index 000000000..60f01911c --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfNameReferenceRegistrarTest.java @@ -0,0 +1,22 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.xml; + +public class MftfNameReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + public void testExtendsMustHaveReference() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestVerifyTinyMCEv4IsNativeWYSIWYGOnProductTest"); + } + + public void testExtendsInActionGroupMustBeEmpty() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfPageUrlReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfPageUrlReferenceRegistrarTest.java new file mode 100644 index 000000000..a1784f7d7 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfPageUrlReferenceRegistrarTest.java @@ -0,0 +1,73 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.xml; + +public class MftfPageUrlReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + public void testPageUrlInActionGroupMustHaveReference() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestPage2"); + } + + public void testPageUrlInActionGroupMustBeEmptyForSection() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } + + public void testPageUrlInActionGroupMustBeEmptyForTestDocument() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } + + public void testPageUrlInTestMustHaveReference() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestPage"); + } + + public void testPageUrlBeforeInTestMustHaveReference() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("TestPage"); + } + + public void testPageUrlInTestMustBeEmptyForSection() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } + + public void testPageUrlInTestMustBeEmptyForActionGroup() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } + + public void testPageUrlInActionGroupPluginDisabled() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + disablePluginAndReindex(); + + assertEmptyReference(); + } + + public void testPageUrlInTestMftfSupportDisabled() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + disableMftfSupportAndReindex(); + + assertEmptyReference(); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfSelectorReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfSelectorReferenceRegistrarTest.java new file mode 100644 index 000000000..fd1cdb6f6 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/MftfSelectorReferenceRegistrarTest.java @@ -0,0 +1,36 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.xml; + +public class MftfSelectorReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + public void testSelectorInActionGroupMustHaveReference() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("testaddSelectedProducts"); + } + + public void testSelectorInTestMustHaveReference() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlAttributeValue("testaddSelectedProducts"); + } + + public void testSelectorInActionGroupMustBeEmpty() { + String filePath = this.getFixturePath("TestActionGroup.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } + + public void testSelectorInTestMustBeEmpty() { + String filePath = this.getFixturePath("TestMftfTest.xml"); + myFixture.configureByFile(filePath); + + assertEmptyReference(); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ModuleNameReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ModuleNameReferenceRegistrarTest.java new file mode 100644 index 000000000..f464ccd34 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ModuleNameReferenceRegistrarTest.java @@ -0,0 +1,27 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +public class ModuleNameReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + /** + * Tests for module name reference in module.xml + */ + public void testModuleNameMustHaveReference() { + myFixture.configureByFile(this.getFixturePath("module.xml")); + + assertHasReferenceToDirectory("module-catalog"); + } + + /** + * Tests for module name reference under sequence node in module.xml + */ + public void testSequenceModuleNameMustHaveReference() { + myFixture.configureByFile(this.getFixturePath("module.xml")); + + assertHasReferenceToDirectory("module-config"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ObserverReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ObserverReferenceRegistrarTest.java new file mode 100644 index 000000000..155852a18 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ObserverReferenceRegistrarTest.java @@ -0,0 +1,56 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleEventsXml; + +public class ObserverReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + /** + * Tests for observer instance reference in events.xml. + */ + public void testObserverInstanceMustHaveReference() { + myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME)); + + assertHasReferencePhpClass("Magento\\Catalog\\Observer\\TestObserver"); + } + + /** + * Tests for observer instance with snake case reference in events.xml. + */ + public void testObserverInstanceDirectorySnakeCaseMustHaveReference() { + myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME)); + + assertHasReferencePhpClass("Magento\\Catalog\\test_event\\TestObserver"); + } + + /** + * Tests for observer name reference in events.xml. + */ + public void testObserverNameMustHaveReference() { + myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME)); + + assertHasReferenceToXmlAttributeValue("test_observer"); + } + + /** + * Tests for event name reference in events.xml. + */ + public void testEventNameMustHaveReference() { + myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME)); + + assertHasReferenceToMethodArgument("test_event_in_block"); + } + + /** + * Tests for no event name reference in events.xml. + */ + public void testEventNameMustNotHaveReference() { + myFixture.configureByFile(this.getFixturePath(ModuleEventsXml.FILE_NAME)); + + assertEmptyReference(); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/PluginTypeReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/PluginTypeReferenceRegistrarTest.java new file mode 100644 index 000000000..97fba519a --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/PluginTypeReferenceRegistrarTest.java @@ -0,0 +1,22 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDiXml; + +public class PluginTypeReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + /** + * The `type` attribute of the `plugin` tag in di.xml must + * have reference to the PHP class + */ + public void testPluginTypeMustHaveReference() { + final String filePath = this.getFixturePath(ModuleDiXml.FILE_NAME); + myFixture.configureByFile(filePath); + + assertHasReferencePhpClass("Magento\\Backend\\Model\\Source\\YesNo"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/ReferenceXmlFixtureTestCase.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ReferenceXmlFixtureTestCase.java new file mode 100644 index 000000000..b73bc5d7f --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/ReferenceXmlFixtureTestCase.java @@ -0,0 +1,17 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.packages.File; +import com.magento.idea.magento2plugin.reference.BaseReferenceTestCase; + +abstract public class ReferenceXmlFixtureTestCase extends BaseReferenceTestCase { + + private static final String fixturesFolderPath = "xml" + File.separator; + + protected String getFixturePath(String fileName) { + return prepareFixturePath(fileName, fixturesFolderPath); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/RequireJsReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/RequireJsReferenceRegistrarTest.java new file mode 100644 index 000000000..7d2d76299 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/RequireJsReferenceRegistrarTest.java @@ -0,0 +1,36 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.xml; + +public class RequireJsReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + public void testMappedComponentMustHaveReference() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file.js"); + } + + public void testPathComponentMustHaveReference() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file2.js"); + } + + public void testFileComponentMustHaveReference() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/js/file.js"); + } + + public void testLibComponentMustHaveReference() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToFile("/lib/web/testjs.js"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/TableNameAndColumnReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/TableNameAndColumnReferenceRegistrarTest.java new file mode 100644 index 000000000..97adcd998 --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/TableNameAndColumnReferenceRegistrarTest.java @@ -0,0 +1,69 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +import com.magento.idea.magento2plugin.magento.files.ModuleDbSchemaXml; + +/** + * Test table and columns name references in the db_schema.xml file. + */ +public class TableNameAndColumnReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + /** + * The `name` attribute of the `table` tag in a `db_schema.xml` must + * have reference to the `name` attribute of the another `table` tag. + */ + public void testTableTagMustHaveReference() { + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlTag(ModuleDbSchemaXml.XML_TAG_TABLE); + } + + /** + * The `table` attribute of the `constraint` tag in a `db_schema.xml` must + * have reference to the `name` attribute of the another `table` tag. + */ + public void testConstraintTableTagMustHaveReference() { + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlTag(ModuleDbSchemaXml.XML_TAG_TABLE); + } + + /** + * The `referenceTable` attribute of the `constraint` tag in a `db_schema.xml` must + * have reference to the `name` attribute of the another `table` tag. + */ + public void testConstraintReferenceTableTagMustHaveReference() { + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlTag(ModuleDbSchemaXml.XML_TAG_TABLE); + } + + /** + * The `column` attribute of the `constraint` tag in a `db_schema.xml` must + * have reference to the `name` attribute of the `column` tag. + */ + public void testConstraintColumnTagMustHaveReference() { + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlTag(ModuleDbSchemaXml.XML_TAG_COLUMN); + } + + /** + * The `referenceColumn` attribute of the `constraint` tag in a `db_schema.xml` must + * have reference to the `name` attribute of the `column` tag. + */ + public void testConstraintReferenceColumnTagMustHaveReference() { + final String filePath = this.getFixturePath(ModuleDbSchemaXml.FILE_NAME); + myFixture.configureByFile(filePath); + + assertHasReferenceToXmlTag(ModuleDbSchemaXml.XML_TAG_COLUMN); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/UiComponentTemplateReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/UiComponentTemplateReferenceRegistrarTest.java new file mode 100644 index 000000000..d5310191b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/UiComponentTemplateReferenceRegistrarTest.java @@ -0,0 +1,15 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ +package com.magento.idea.magento2plugin.reference.xml; + +public class UiComponentTemplateReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + public void testFileTemplateAttributeMustHaveReference() { + String filePath = this.getFixturePath("test_form.xml"); + myFixture.configureByFile(filePath); + + assertHasReferenceToFile("app/code/Foo/Bar/view/frontend/web/template/template2.html"); + } +} diff --git a/src/test/java/com/magento/idea/magento2plugin/reference/xml/WebApiMethodReferenceRegistrarTest.java b/src/test/java/com/magento/idea/magento2plugin/reference/xml/WebApiMethodReferenceRegistrarTest.java new file mode 100644 index 000000000..431a0534b --- /dev/null +++ b/src/test/java/com/magento/idea/magento2plugin/reference/xml/WebApiMethodReferenceRegistrarTest.java @@ -0,0 +1,30 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + +package com.magento.idea.magento2plugin.reference.xml; + +public class WebApiMethodReferenceRegistrarTest extends ReferenceXmlFixtureTestCase { + + /** + * Tests for reference to valid PHP method in webapi.xml. + */ + public void testWebApiMethodMustHaveReference() { + myFixture.configureByFile(this.getFixturePath("webapi.xml")); + + assertHasReferenceToClassMethod( + "Magento\\Catalog\\Api\\ProductRepositoryInterface", + "save" + ); + } + + /** + * Tests for no reference to invalid PHP method in webapi.xml. + */ + public void testWebApiMethodMustNotHaveReference() { + myFixture.configureByFile(this.getFixturePath("webapi.xml")); + + assertEmptyReference(); + } +} diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/userInterface/content/MarkDirectoryAsMagentoRootTest.kt similarity index 99% rename from src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt rename to src/test/kotlin/com/magento/idea/magento2plugin/userInterface/content/MarkDirectoryAsMagentoRootTest.kt index f97af54ba..1015515a6 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/userInterface/content/MarkDirectoryAsMagentoRootTest.kt @@ -3,7 +3,7 @@ * See COPYING.txt for license details. */ -package com.magento.idea.magento2plugin.actions.content +package com.magento.idea.magento2plugin.userInterface.content import com.automation.remarks.junit5.Video import com.intellij.openapi.util.io.NioFiles.createDirectories @@ -257,4 +257,4 @@ class MarkDirectoryAsMagentoRootTest { } } } -} \ No newline at end of file +} From d0dd5f4be6199b0d5ad90dddd297a542690a63cd Mon Sep 17 00:00:00 2001 From: Vitaliy Boyrko Date: Sat, 29 Mar 2025 16:26:30 +0200 Subject: [PATCH 30/34] Update Gradle workflows and remove legacy test task Replaced 'legacyTests' with 'test' in GitHub workflows for automation consistency. Removed the 'legacyTests' task from the Gradle configuration and adjusted test settings to exclude user interface tests directly in the main 'test' task. This simplifies the build process and reduces redundancy. --- .github/workflows/gradle.yml | 6 +++--- build.gradle.kts | 5 +---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 4426cb199..bf210056a 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -32,7 +32,7 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run automated tests - run: ./gradlew legacyTests --no-daemon + run: ./gradlew test --no-daemon build-windows: runs-on: windows-latest @@ -58,7 +58,7 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run automated tests - run: ./gradlew legacyTests --no-daemon + run: ./gradlew test --no-daemon build-macos: runs-on: macos-latest @@ -84,7 +84,7 @@ jobs: - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run automated tests - run: ./gradlew legacyTests --no-daemon + run: ./gradlew test --no-daemon static-tests: runs-on: ubuntu-latest diff --git a/build.gradle.kts b/build.gradle.kts index 5adf59301..a626860af 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -137,6 +137,7 @@ tasks { } test { + exclude("**/userInterface/**") useJUnitPlatform() } @@ -247,10 +248,6 @@ kover { } } -tasks.register("legacyTests") { - exclude("**/userInterface/**") -} - tasks.register("uiTests") { exclude("**/reference/**") exclude("**/linemarker/**") From d74e6503792bddd724ad6b9809685208154d17cc Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sat, 29 Mar 2025 21:27:31 +0200 Subject: [PATCH 31/34] Refactor and improve code readability across multiple classes Simplified imports, added Javadoc comments, adjusted annotations, and improved variable usage for clarity and maintainability. Minor structural changes include adding final and transient where applicable and enhancing formatting consistency. --- .../MarkDirectoryAsMagentoContentRot.java | 8 ++++-- .../UnmarkDirectoryAsMagentoContentRot.java | 27 +++++++++---------- .../generation/dialog/NewModuleDialog.java | 14 +++++++--- .../idea/magento2plugin/project/Settings.java | 17 +++++++++--- .../content/MarkDirectoryAsMagentoRootTest.kt | 26 +++++++++++++----- 5 files changed, 63 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java index d42dea893..d2cb40001 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java @@ -7,7 +7,11 @@ import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.projectView.actions.MarkRootActionBase; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.actionSystem.PlatformCoreDataKeys; +import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ContentEntry; @@ -18,9 +22,9 @@ import com.magento.idea.magento2plugin.MagentoIcons; import com.magento.idea.magento2plugin.project.Settings; import com.magento.idea.magento2plugin.util.magento.MagentoPathUrlUtil; -import org.jetbrains.annotations.NotNull; import java.net.MalformedURLException; import java.net.URL; +import org.jetbrains.annotations.NotNull; public class MarkDirectoryAsMagentoContentRot extends MarkRootActionBase { private Project project; diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java index 0d9bcfbaa..e3134d913 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java @@ -7,7 +7,10 @@ import com.intellij.ide.projectView.ProjectView; import com.intellij.ide.projectView.actions.MarkRootActionBase; -import com.intellij.openapi.actionSystem.*; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.openapi.actionSystem.PlatformCoreDataKeys; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ContentEntry; @@ -17,25 +20,21 @@ import com.intellij.psi.PsiElement; import com.magento.idea.magento2plugin.project.Settings; import com.magento.idea.magento2plugin.util.magento.MagentoPathUrlUtil; -import org.jetbrains.annotations.NotNull; import java.net.MalformedURLException; import java.net.URL; +import org.jetbrains.annotations.NotNull; public class UnmarkDirectoryAsMagentoContentRot extends MarkRootActionBase { private Project project; - public UnmarkDirectoryAsMagentoContentRot() { - super(); - } - @Override - protected void modifyRoots(VirtualFile virtualFile, ContentEntry contentEntry) { + protected void modifyRoots(final VirtualFile virtualFile, ContentEntry contentEntry) { if (project != null) { - Settings settings = Settings.getInstance(project); + final Settings settings = Settings.getInstance(project); Settings.getInstance(project).removeMagentoFolder(virtualFile.getUrl()); if (settings.getMagentoFolders() != null) { settings.getMagentoFolders().removeIf(folder -> { - VirtualFile file = null; + final VirtualFile file; try { file = VfsUtil.findFileByURL(new URL(folder)); } catch (MalformedURLException e) { @@ -50,18 +49,18 @@ protected void modifyRoots(VirtualFile virtualFile, ContentEntry contentEntry) { } @Override - public void update(@NotNull AnActionEvent event) { + public void update(@NotNull final AnActionEvent event) { final DataContext context = event.getDataContext(); final PsiElement targetElement = LangDataKeys.PSI_ELEMENT.getData(context); - Module module = event.getData(PlatformCoreDataKeys.MODULE); + final Module module = event.getData(PlatformCoreDataKeys.MODULE); if (module != null) { project = module.getProject(); } if (targetElement instanceof PsiDirectory && project != null) { - Settings settings = Settings.getInstance(project); - String magentoPathUrl = MagentoPathUrlUtil.execute(project); - String directoryUrl = ((PsiDirectory) targetElement).getVirtualFile().getUrl(); + final Settings settings = Settings.getInstance(project); + final String magentoPathUrl = MagentoPathUrlUtil.execute(project); + final String directoryUrl = ((PsiDirectory) targetElement).getVirtualFile().getUrl(); if (magentoPathUrl != null && magentoPathUrl.equals(directoryUrl)) { event.getPresentation().setEnabledAndVisible(false); return; diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java index c4bf662b6..48cb03485 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/generation/dialog/NewModuleDialog.java @@ -51,7 +51,13 @@ import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; -@SuppressWarnings({"PMD.TooManyFields", "PMD.DataClass", "PMD.UnusedPrivateMethod"}) +@SuppressWarnings({ + "PMD.TooManyFields", + "PMD.DataClass", + "PMD.UnusedPrivateMethod", + "PMD.ConstructorCallsOverridableMethod", + "PMD.SingularField" +}) public class NewModuleDialog extends AbstractDialog implements ListSelectionListener { //NOPMD private static final String MODULE_DESCRIPTION = "module description"; private static final String MODULE_VERSION = "module version"; @@ -111,8 +117,8 @@ public class NewModuleDialog extends AbstractDialog implements ListSelectionList @NotNull private final PsiDirectory initialBaseDir; private String detectedPackageName; - private final ModuleIndex moduleIndex; - private final CamelCaseToHyphen camelCaseToHyphen; + private final transient ModuleIndex moduleIndex; + private final transient CamelCaseToHyphen camelCaseToHyphen; /** * Constructor. @@ -178,8 +184,10 @@ private void detectPackageName(final @NotNull PsiDirectory initialBaseDir) { } } + @Override protected void onWriteActionOK() { generateFiles(); + exit(); } private void generateFiles() { diff --git a/src/main/java/com/magento/idea/magento2plugin/project/Settings.java b/src/main/java/com/magento/idea/magento2plugin/project/Settings.java index f5a132746..0ef071b09 100644 --- a/src/main/java/com/magento/idea/magento2plugin/project/Settings.java +++ b/src/main/java/com/magento/idea/magento2plugin/project/Settings.java @@ -202,7 +202,7 @@ public State() {//NOPMD * @param myDoNotAskContentConfigAgain boolean * @param magentoVersion String * @param magentoEdition String - * @param myMagentoFolders List + * @param myMagentoFolders List */ public State( final boolean pluginEnabled, @@ -264,6 +264,11 @@ public List getMagentoFolders() { return this.myMagentoFolders; } + /** + * Adds a Magento folder to the list of tracked Magento folders. + * + * @param magentoFolders the name of the Magento folder to be added + */ @Tag("magentoFolders") public void addMagentoFolder(final String magentoFolders) { if (this.myMagentoFolders == null) { @@ -272,6 +277,11 @@ public void addMagentoFolder(final String magentoFolders) { this.myMagentoFolders.add(magentoFolders); } + /** + * Removes a specified Magento folder from the list of tracked Magento folders. + * + * @param magentoFolders the name of the Magento folder to be removed + */ public void removeMagentoFolder(final String magentoFolders) { if (this.myMagentoFolders != null) { this.myMagentoFolders.remove(magentoFolders); @@ -356,8 +366,9 @@ public int hashCode() { result = 31 * result + (this.isDoNotAskContentConfigAgain() ? 1 : 0); result = 31 * result + ( this.defaultLicenseName != null ? this.defaultLicenseName.hashCode() : 0 - ); - result = 31 * result + (this.myMagentoFolders != null ? this.myMagentoFolders.hashCode() : 0); + ); + result = 31 * result + + (this.myMagentoFolders != null ? this.myMagentoFolders.hashCode() : 0); return result; } } diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt index 511ebff0e..0d1fb2f28 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/actions/content/MarkDirectoryAsMagentoRootTest.kt @@ -7,7 +7,6 @@ package com.magento.idea.magento2plugin.actions.content import com.automation.remarks.junit5.Video import com.intellij.openapi.util.io.NioFiles.createDirectories -import org.assertj.swing.core.MouseButton import com.intellij.remoterobot.RemoteRobot import com.intellij.remoterobot.fixtures.ContainerFixture import com.intellij.remoterobot.search.locators.byXpath @@ -19,15 +18,20 @@ import com.intellij.remoterobot.utils.waitForIgnoringError import com.magento.idea.magento2plugin.pages.* import com.magento.idea.magento2plugin.utils.RemoteRobotExtension import com.magento.idea.magento2plugin.utils.StepsLogger -import org.junit.jupiter.api.AfterEach -import org.junit.jupiter.api.BeforeEach -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.extension.ExtendWith -import java.awt.event.KeyEvent.* +import java.awt.event.KeyEvent.VK_1 +import java.awt.event.KeyEvent.VK_A +import java.awt.event.KeyEvent.VK_ALT +import java.awt.event.KeyEvent.VK_CONTROL +import java.awt.event.KeyEvent.VK_DELETE import java.io.File import java.io.IOException import java.nio.file.Paths import java.time.Duration.ofMinutes +import org.assertj.swing.core.MouseButton +import org.junit.jupiter.api.AfterEach +import org.junit.jupiter.api.BeforeEach +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.extension.ExtendWith @ExtendWith(RemoteRobotExtension::class) class MarkDirectoryAsMagentoRootTest { @@ -201,6 +205,9 @@ class MarkDirectoryAsMagentoRootTest { } } + /** + * Closes the browser by terminating its process based on the operating system. + */ fun closeBrowser() { val os = System.getProperty("os.name").lowercase() @@ -220,7 +227,12 @@ class MarkDirectoryAsMagentoRootTest { } } - + /** + * Creates a new plugin in a project without marking the target module as a Magento code root. + * + * @param ideaFrame + * @param remoteRobot + */ private fun createAPluginWithoutMagentoRootInVendor( ideaFrame: IdeaFrame, remoteRobot1: RemoteRobot From 4228059d0280d3464550ccabbabaef185527aa8a Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sat, 29 Mar 2025 21:31:30 +0200 Subject: [PATCH 32/34] Add documentation for MarkDirectoryAsMagentoContentRot class Added a Javadoc comment explaining the purpose of the MarkDirectoryAsMagentoContentRot class. This provides clarity on its role in marking a selected directory as a Magento content root. --- .../content/root/MarkDirectoryAsMagentoContentRot.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java index d2cb40001..6a04341c1 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java @@ -29,6 +29,10 @@ public class MarkDirectoryAsMagentoContentRot extends MarkRootActionBase { private Project project; + /** + * This action is used to mark a selected directory as + * a Magento content root within the project structure. + */ public MarkDirectoryAsMagentoContentRot() { super(); final Presentation presentation = this.getTemplatePresentation(); From fbee25f546e9fe88bb200bbb5edf2efa4d8b47d9 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sat, 29 Mar 2025 21:45:57 +0200 Subject: [PATCH 33/34] Refactor method signatures and reorder variable declarations. Improve code readability by adjusting method signatures for better formatting and consistency. Reorder certain variable declarations to align with logical execution flow. Add `@SuppressWarnings` annotation in `Settings.java` to suppress PMD warnings about excessive public count. --- .../root/MarkDirectoryAsMagentoContentRot.java | 12 +++++++++--- .../root/UnmarkDirectoryAsMagentoContentRot.java | 12 +++++++++--- .../idea/magento2plugin/project/Settings.java | 3 +++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java index 6a04341c1..a85d064bb 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/MarkDirectoryAsMagentoContentRot.java @@ -40,7 +40,10 @@ public MarkDirectoryAsMagentoContentRot() { } @Override - protected void modifyRoots(final VirtualFile virtualFile, ContentEntry contentEntry) { + protected void modifyRoots( + final VirtualFile virtualFile, + final ContentEntry contentEntry + ) { if (project != null) { final Settings settings = Settings.getInstance(project); Settings.getInstance(project).addMagentoFolder(virtualFile.getUrl()); @@ -70,13 +73,13 @@ public void update(@NotNull final AnActionEvent event) { } if (targetElement instanceof PsiDirectory && project != null) { - final Settings settings = Settings.getInstance(project); final String magentoPathUrl = MagentoPathUrlUtil.execute(project); final String directoryUrl = ((PsiDirectory) targetElement).getVirtualFile().getUrl(); if (magentoPathUrl != null && magentoPathUrl.equals(directoryUrl)) { event.getPresentation().setEnabledAndVisible(false); return; } + final Settings settings = Settings.getInstance(project); if (!settings.containsMagentoFolder(directoryUrl)) { event.getPresentation().setEnabledAndVisible(true); return; @@ -87,7 +90,10 @@ public void update(@NotNull final AnActionEvent event) { } @Override - protected boolean isEnabled(@NotNull RootsSelection rootsSelection, @NotNull Module module) { + protected boolean isEnabled( + @NotNull final RootsSelection rootsSelection, + @NotNull final Module module + ) { return false; } } diff --git a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java index e3134d913..ae7dd6258 100644 --- a/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java +++ b/src/main/java/com/magento/idea/magento2plugin/actions/content/root/UnmarkDirectoryAsMagentoContentRot.java @@ -28,7 +28,10 @@ public class UnmarkDirectoryAsMagentoContentRot extends MarkRootActionBase { private Project project; @Override - protected void modifyRoots(final VirtualFile virtualFile, ContentEntry contentEntry) { + protected void modifyRoots( + final VirtualFile virtualFile, + final ContentEntry contentEntry + ) { if (project != null) { final Settings settings = Settings.getInstance(project); Settings.getInstance(project).removeMagentoFolder(virtualFile.getUrl()); @@ -58,7 +61,6 @@ public void update(@NotNull final AnActionEvent event) { } if (targetElement instanceof PsiDirectory && project != null) { - final Settings settings = Settings.getInstance(project); final String magentoPathUrl = MagentoPathUrlUtil.execute(project); final String directoryUrl = ((PsiDirectory) targetElement).getVirtualFile().getUrl(); if (magentoPathUrl != null && magentoPathUrl.equals(directoryUrl)) { @@ -66,6 +68,7 @@ public void update(@NotNull final AnActionEvent event) { return; } + final Settings settings = Settings.getInstance(project); if (settings.containsMagentoFolder(directoryUrl)) { event.getPresentation().setEnabledAndVisible(true); return; @@ -76,7 +79,10 @@ public void update(@NotNull final AnActionEvent event) { } @Override - protected boolean isEnabled(@NotNull RootsSelection rootsSelection, @NotNull Module module) { + protected boolean isEnabled( + @NotNull final RootsSelection rootsSelection, + @NotNull final Module module + ) { return false; } } diff --git a/src/main/java/com/magento/idea/magento2plugin/project/Settings.java b/src/main/java/com/magento/idea/magento2plugin/project/Settings.java index 0ef071b09..b24b0d6e2 100644 --- a/src/main/java/com/magento/idea/magento2plugin/project/Settings.java +++ b/src/main/java/com/magento/idea/magento2plugin/project/Settings.java @@ -21,6 +21,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +@SuppressWarnings({ + "PMD.ExcessivePublicCount" +}) @State( name = "Magento2PluginSettings", storages = { From 9d5d4fa72420acd4b162c3dac94d59b0b436ec39 Mon Sep 17 00:00:00 2001 From: vitaliy Date: Sat, 29 Mar 2025 21:52:56 +0200 Subject: [PATCH 34/34] Add copyright headers and fix spelling error in StepsLogger Added missing copyright headers to multiple test files for legal compliance. Also corrected a spelling error in the variable name "initializaed" to "initialized" in the StepsLogger file. --- .../idea/magento2plugin/pages/ContextMenuFixture.kt | 5 +++++ .../magento2plugin/pages/CreateAPluginDialogFixture.kt | 4 ++++ .../magento/idea/magento2plugin/pages/DialogFixture.kt | 4 ++++ .../magento2plugin/pages/FilteredComboBoxFixture.kt | 5 +++++ .../com/magento/idea/magento2plugin/pages/IdeaFrame.kt | 4 ++++ .../magento/idea/magento2plugin/pages/WelcomeFrame.kt | 4 ++++ .../idea/magento2plugin/utils/RemoteRobotExtension.kt | 5 +++++ .../magento/idea/magento2plugin/utils/StepsLogger.kt | 10 +++++++--- 8 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/ContextMenuFixture.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/ContextMenuFixture.kt index d372d193a..e3ac8b483 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/pages/ContextMenuFixture.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/ContextMenuFixture.kt @@ -1,3 +1,8 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + package com.magento.idea.magento2plugin.pages import com.intellij.remoterobot.RemoteRobot diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/CreateAPluginDialogFixture.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/CreateAPluginDialogFixture.kt index 169a0f1ec..09e11673b 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/pages/CreateAPluginDialogFixture.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/CreateAPluginDialogFixture.kt @@ -1,3 +1,7 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ package com.magento.idea.magento2plugin.pages diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/DialogFixture.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/DialogFixture.kt index 9f2448d0e..b76cdf71f 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/pages/DialogFixture.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/DialogFixture.kt @@ -1,3 +1,7 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ package com.magento.idea.magento2plugin.pages diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/FilteredComboBoxFixture.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/FilteredComboBoxFixture.kt index f321a6212..a55da468d 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/pages/FilteredComboBoxFixture.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/FilteredComboBoxFixture.kt @@ -1,3 +1,8 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + package com.magento.idea.magento2plugin.pages import com.intellij.remoterobot.RemoteRobot diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt index 96d93eb33..b947dfb7a 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/IdeaFrame.kt @@ -1,3 +1,7 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ package com.magento.idea.magento2plugin.pages diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/pages/WelcomeFrame.kt b/src/test/kotlin/com/magento/idea/magento2plugin/pages/WelcomeFrame.kt index cf66bdb30..9dd311cdd 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/pages/WelcomeFrame.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/pages/WelcomeFrame.kt @@ -1,3 +1,7 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ package com.magento.idea.magento2plugin.pages diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/utils/RemoteRobotExtension.kt b/src/test/kotlin/com/magento/idea/magento2plugin/utils/RemoteRobotExtension.kt index cf472574c..a38ae7228 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/utils/RemoteRobotExtension.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/utils/RemoteRobotExtension.kt @@ -1,3 +1,8 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ + package com.magento.idea.magento2plugin.utils import com.intellij.remoterobot.RemoteRobot diff --git a/src/test/kotlin/com/magento/idea/magento2plugin/utils/StepsLogger.kt b/src/test/kotlin/com/magento/idea/magento2plugin/utils/StepsLogger.kt index 1162b6f1c..80fff7d58 100644 --- a/src/test/kotlin/com/magento/idea/magento2plugin/utils/StepsLogger.kt +++ b/src/test/kotlin/com/magento/idea/magento2plugin/utils/StepsLogger.kt @@ -1,3 +1,7 @@ +/* + * Copyright © Magento, Inc. All rights reserved. + * See COPYING.txt for license details. + */ package com.magento.idea.magento2plugin.utils @@ -5,12 +9,12 @@ import com.intellij.remoterobot.stepsProcessing.StepLogger import com.intellij.remoterobot.stepsProcessing.StepWorker object StepsLogger { - private var initializaed = false + private var initialized = false @JvmStatic fun init() { - if (initializaed.not()) { + if (initialized.not()) { StepWorker.registerProcessor(StepLogger()) - initializaed = true + initialized = true } } } \ No newline at end of file