diff --git a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTask.kt b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTask.kt index 0c42f7929e8..59855d63e04 100644 --- a/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTask.kt +++ b/packages/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTask.kt @@ -35,11 +35,19 @@ abstract class GenerateCodegenSchemaTask : Exec() { val generatedSchemaFile: Provider = generatedSrcDir.file("schema.json") override fun exec() { + wipeOutputDir() + setupCommandLine() + super.exec() + } + + internal fun wipeOutputDir() { generatedSrcDir.asFile.get().apply { - delete() + deleteRecursively() mkdirs() } + } + internal fun setupCommandLine() { commandLine( windowsAwareYarn( *nodeExecutableAndArgs.get().toTypedArray(), @@ -51,6 +59,5 @@ abstract class GenerateCodegenSchemaTask : Exec() { generatedSchemaFile.get().asFile.absolutePath, jsRootDir.asFile.get().absolutePath, )) - super.exec() } } diff --git a/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTaskTest.kt b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTaskTest.kt new file mode 100644 index 00000000000..cb092dfc6ec --- /dev/null +++ b/packages/react-native-gradle-plugin/src/test/kotlin/com/facebook/react/tasks/GenerateCodegenSchemaTaskTest.kt @@ -0,0 +1,116 @@ +/* + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.react.tasks + +import com.facebook.react.tests.OS +import com.facebook.react.tests.OsRule +import com.facebook.react.tests.WithOs +import com.facebook.react.tests.createTestTask +import java.io.File +import org.gradle.api.tasks.* +import org.junit.Assert.* +import org.junit.Rule +import org.junit.Test +import org.junit.rules.TemporaryFolder + +class GenerateCodegenSchemaTaskTest { + + @get:Rule val tempFolder = TemporaryFolder() + + @get:Rule val osRule = OsRule() + + @Test + fun generateCodegenSchema_inputFiles_areSetCorrectly() { + val jsRootDir = + tempFolder.newFolder("js").apply { + File(this, "file.js").createNewFile() + File(this, "ignore.txt").createNewFile() + } + + val task = createTestTask { it.jsRootDir.set(jsRootDir) } + + assertEquals(jsRootDir, task.jsInputFiles.dir) + assertEquals(setOf("**/*.js"), task.jsInputFiles.includes) + assertEquals(1, task.jsInputFiles.files.size) + assertEquals(setOf(File(jsRootDir, "file.js")), task.jsInputFiles.files) + } + + @Test + fun generateCodegenSchema_outputFile_isSetCorrectly() { + val outputDir = tempFolder.newFolder("output") + + val task = createTestTask { it.generatedSrcDir.set(outputDir) } + + assertEquals(File(outputDir, "schema.json"), task.generatedSchemaFile.get().asFile) + } + + @Test + fun generateCodegenSchema_nodeExecutablesArgs_areInsideInput() { + val task = + createTestTask { + it.nodeExecutableAndArgs.set(listOf("npm", "help")) + } + + assertEquals(listOf("npm", "help"), task.nodeExecutableAndArgs.get()) + assertTrue(task.inputs.properties.containsKey("nodeExecutableAndArgs")) + } + + @Test + fun wipeOutputDir_willCreateOutputDir() { + val task = + createTestTask { + it.generatedSrcDir.set(File(tempFolder.root, "output")) + } + + task.wipeOutputDir() + + assertTrue(File(tempFolder.root, "output").exists()) + assertEquals(0, File(tempFolder.root, "output").listFiles()?.size) + } + + @Test + fun wipeOutputDir_willWipeOutputDir() { + val outputDir = + tempFolder.newFolder("output").apply { File(this, "some-generated-file").createNewFile() } + + val task = createTestTask { it.generatedSrcDir.set(outputDir) } + + task.wipeOutputDir() + + assertTrue(outputDir.exists()) + assertEquals(0, outputDir.listFiles()?.size) + } + + @Test + @WithOs(OS.UNIX) + fun setupCommandLine_willSetupCorrectly() { + val codegenDir = tempFolder.newFolder("codegen") + val jsRootDir = tempFolder.newFolder("js") + val outputDir = tempFolder.newFolder("output") + + val task = + createTestTask { + it.codegenDir.set(codegenDir) + it.jsRootDir.set(jsRootDir) + it.generatedSrcDir.set(outputDir) + it.nodeExecutableAndArgs.set(listOf("--verbose")) + } + + task.setupCommandLine() + + assertEquals( + listOf( + "yarn", + "--verbose", + File(codegenDir, "lib/cli/combine/combine-js-to-schema-cli.js").toString(), + File(outputDir, "schema.json").toString(), + jsRootDir.toString(), + ), + task.commandLine.toMutableList()) + } +}