diff --git a/.github/workflows/scaffold.yml b/.github/workflows/scaffold.yml new file mode 100644 index 00000000..7beb1444 --- /dev/null +++ b/.github/workflows/scaffold.yml @@ -0,0 +1,34 @@ +name: Run scaffold + +on: + pull_request: + types: [synchronize] + +jobs: + scaffold: + strategy: + fail-fast: true + matrix: + go-version: + - 1.13.x + - 1.14.x + - 1.15.x + - 1.16.x + - 1.17.x + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Install Go + uses: actions/setup-go@v2 + with: + go-version: ${{ matrix.go-version }} + - name: Checkout code + uses: actions/checkout@v2 + - name: Build hrp binary + run: make build + - name: Check hrp version + run: ./output/hrp -v + - name: Run start project + run: ./output/hrp startproject demo + - name: Run demo tests + run: ./output/hrp run demo/testcases/demo.json demo/testcases/demo.yaml diff --git a/cli/hrp/cmd/scaffold.go b/cli/hrp/cmd/scaffold.go index d70db7eb..94c4fd51 100644 --- a/cli/hrp/cmd/scaffold.go +++ b/cli/hrp/cmd/scaffold.go @@ -5,7 +5,7 @@ import ( "github.com/spf13/cobra" - "github.com/httprunner/hrp/internal/builtin" + "github.com/httprunner/hrp/internal/scaffold" ) var scaffoldCmd = &cobra.Command{ @@ -16,7 +16,7 @@ var scaffoldCmd = &cobra.Command{ setLogLevel(logLevel) }, Run: func(cmd *cobra.Command, args []string) { - err := builtin.CreateScaffold(args[0]) + err := scaffold.CreateScaffold(args[0]) if err != nil { os.Exit(1) } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index ae6f24e7..e7c708e6 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,9 +1,10 @@ # Release History -## v0.5.0 (2022-01-06) +## v0.5.0 (2022-01-08) - feat: support creating and calling custom functions with [go plugin](https://pkg.go.dev/plugin) - feat: install hrp with one shell command +- feat: add `startproject` sub-command for creating scaffold project - feat: report GA event for loading go plugin ## v0.4.0 (2022-01-05) diff --git a/internal/builtin/scaffold.go b/internal/builtin/scaffold.go deleted file mode 100644 index 0a57f2aa..00000000 --- a/internal/builtin/scaffold.go +++ /dev/null @@ -1,17 +0,0 @@ -package builtin - -import ( - "fmt" - - "github.com/httprunner/hrp/internal/ga" -) - -func CreateScaffold(projectName string) error { - // report event - ga.SendEvent(ga.EventTracking{ - Category: "Scaffold", - Action: "hrp startproject", - }) - - return fmt.Errorf("not implemented") -} diff --git a/examples/demo_test.go b/internal/scaffold/demo.go similarity index 76% rename from examples/demo_test.go rename to internal/scaffold/demo.go index bb41544e..83753467 100644 --- a/examples/demo_test.go +++ b/internal/scaffold/demo.go @@ -1,11 +1,6 @@ -package examples +package scaffold -import ( - "fmt" - "testing" - - "github.com/httprunner/hrp" -) +import "github.com/httprunner/hrp" var demoTestCase = &hrp.TestCase{ Config: hrp.NewConfig("demo with complex mechanisms"). @@ -61,42 +56,17 @@ var demoTestCase = &hrp.TestCase{ }, } -var ( - demoTestCaseJSONPath = "demo.json" - demoTestCaseYAMLPath = "demo.yaml" -) +// .gitignore +var demoIgnoreContent = `.env +reports/* +*.so +.vscode/ +.idea/ +.DS_Store +output/ +` -func TestGenDemoTestCase(t *testing.T) { - tCase, _ := demoTestCase.ToTCase() - err := tCase.Dump2JSON(demoTestCaseJSONPath) - if err != nil { - t.Fail() - } - err = tCase.Dump2YAML(demoTestCaseYAMLPath) - if err != nil { - t.Fail() - } -} - -func Example_demo() { - err := hrp.NewRunner(nil).Run(demoTestCase) // hrp.Run(demoTestCase) - fmt.Println(err) - // Output: - // -} - -func Example_jsonDemo() { - testCase := &hrp.TestCasePath{Path: demoTestCaseJSONPath} - err := hrp.NewRunner(nil).Run(testCase) // hrp.Run(testCase) - fmt.Println(err) - // Output: - // -} - -func Example_yamlDemo() { - testCase := &hrp.TestCasePath{Path: demoTestCaseYAMLPath} - err := hrp.NewRunner(nil).Run(testCase) // hrp.Run(testCase) - fmt.Println(err) - // Output: - // -} +// .env +var demoEnvContent = `USERNAME=debugtalk +"PASSWORD=123456 +` diff --git a/internal/scaffold/demo_test.go b/internal/scaffold/demo_test.go new file mode 100644 index 00000000..870ef7bd --- /dev/null +++ b/internal/scaffold/demo_test.go @@ -0,0 +1,48 @@ +package scaffold + +import ( + "fmt" + "testing" + + "github.com/httprunner/hrp" +) + +var ( + demoTestCaseJSONPath = "../../examples/demo.json" + demoTestCaseYAMLPath = "../../examples/demo.yaml" +) + +func TestGenDemoTestCase(t *testing.T) { + tCase, _ := demoTestCase.ToTCase() + err := tCase.Dump2JSON(demoTestCaseJSONPath) + if err != nil { + t.Fail() + } + err = tCase.Dump2YAML(demoTestCaseYAMLPath) + if err != nil { + t.Fail() + } +} + +func Example_demo() { + err := hrp.NewRunner(nil).Run(demoTestCase) // hrp.Run(demoTestCase) + fmt.Println(err) + // Output: + // +} + +func Example_jsonDemo() { + testCase := &hrp.TestCasePath{Path: demoTestCaseJSONPath} + err := hrp.NewRunner(nil).Run(testCase) // hrp.Run(testCase) + fmt.Println(err) + // Output: + // +} + +func Example_yamlDemo() { + testCase := &hrp.TestCasePath{Path: demoTestCaseYAMLPath} + err := hrp.NewRunner(nil).Run(testCase) // hrp.Run(testCase) + fmt.Println(err) + // Output: + // +} diff --git a/internal/scaffold/main.go b/internal/scaffold/main.go new file mode 100644 index 00000000..32838335 --- /dev/null +++ b/internal/scaffold/main.go @@ -0,0 +1,71 @@ +package scaffold + +import ( + "fmt" + "os" + "path" + + "github.com/httprunner/hrp/internal/ga" + "github.com/rs/zerolog/log" +) + +func CreateScaffold(projectName string) error { + // report event + ga.SendEvent(ga.EventTracking{ + Category: "Scaffold", + Action: "hrp startproject", + }) + + // check if projectName exists + if _, err := os.Stat(projectName); err == nil { + log.Warn().Str("projectName", projectName). + Msg("project name already exists, please specify a new one.") + return fmt.Errorf("project name already exists") + } + + log.Info().Str("projectName", projectName).Msg("create new scaffold project") + + // create project folder + createFolder(projectName) + createFolder(path.Join(projectName, "har")) + createFolder(path.Join(projectName, "testcases")) + createFolder(path.Join(projectName, "reports")) + + // create demo testcases + tCase, _ := demoTestCase.ToTCase() + err := tCase.Dump2JSON(path.Join(projectName, "testcases", "demo.json")) + if err != nil { + log.Error().Err(err).Msg("create demo.json testcase failed") + return err + } + err = tCase.Dump2YAML(path.Join(projectName, "testcases", "demo.yaml")) + if err != nil { + log.Error().Err(err).Msg("create demo.yml testcase failed") + return err + } + + createFile(path.Join(projectName, ".gitignore"), demoIgnoreContent) + createFile(path.Join(projectName, ".env"), demoEnvContent) + + return nil +} + +func createFolder(folderPath string) error { + log.Info().Str("folderPath", folderPath).Msg("create folder") + err := os.MkdirAll(folderPath, os.ModePerm) + if err != nil { + log.Error().Err(err).Msg("create folder failed") + return err + } + return nil +} + +func createFile(filePath string, data string) error { + log.Info().Str("filePath", filePath).Msg("create file") + err := os.WriteFile(filePath, []byte(data), 0o644) + if err != nil { + log.Error().Err(err).Msg("create file failed") + return err + } + return nil +}