diff --git a/.github/workflows/go-test.yml b/.github/workflows/go-test.yml new file mode 100644 index 0000000..21a5395 --- /dev/null +++ b/.github/workflows/go-test.yml @@ -0,0 +1,27 @@ +name: Go Tests + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: 1.22 + + - name: Install dependencies + run: go mod tidy + + - name: Run tests + run: go test ./test -v + diff --git a/CHANGELOG.md b/CHANGELOG.md index 83e1acc..274fcc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - feat: complete help page implementation - feat(core): add interactive main menu as root command - feat(main): Improving description for better reading +- feat(tests): adding tests and github actions ### Fixes - fix(changelog): filter only commits after last recorded hash diff --git a/internal/changelog_generator.go b/internal/changelog_generator.go index b41e791..7a09d83 100644 --- a/internal/changelog_generator.go +++ b/internal/changelog_generator.go @@ -65,7 +65,7 @@ func getGitLogSince(lastCommit string) ([]string, error) { return filtered, nil } -func changelogVersionExists(version string) bool { +func ChangelogVersionExists(version string) bool { file, err := os.Open("CHANGELOG.md") if err != nil { return false @@ -82,7 +82,7 @@ func changelogVersionExists(version string) bool { return false } -func printChangelogVersion(version string) (features, fixes, others []string) { +func GetChangelogVersion(version string) (features, fixes, others []string) { file, err := os.ReadFile("CHANGELOG.md") if err != nil { return @@ -150,7 +150,7 @@ func GenerateChangelog() { Message: "Enter the version for this changelog (e.g., 1.0.0):", }, &version, survey.WithValidator(survey.Required)) - if changelogVersionExists(version) { + if ChangelogVersionExists(version) { var choice string survey.AskOne(&survey.Select{ Message: fmt.Sprintf("⚠️ Version %s already exists. What do you want to do?", version), @@ -161,7 +161,7 @@ func GenerateChangelog() { }, &choice) if choice == "Add new commits to this version" { - existingFeatures, existingFixes, existingOthers := printChangelogVersion(version) + existingFeatures, existingFixes, existingOthers := GetChangelogVersion(version) selectedFeatures = append(selectedFeatures, existingFeatures...) selectedFixes = append(selectedFixes, existingFixes...) selectedOthers = append(selectedOthers, existingOthers...) @@ -179,7 +179,6 @@ func GenerateChangelog() { Default: defaultDate, }, &date) } else { - // Mesmo se for edição, mantenha a data antiga date = defaultDate } diff --git a/test/changelog_test.go b/test/changelog_test.go new file mode 100644 index 0000000..caca863 --- /dev/null +++ b/test/changelog_test.go @@ -0,0 +1,75 @@ +package test + +import ( + "os" + "testing" + + "github.com/caarloshenriq/forge-cli/internal" +) + +func TestPrintChangelogVersion(t *testing.T) { + content := ` +# Changelog + +### Version 1.0.0 - 2025-01-01 + +### Features +- feat: add login + +### Fixes +- fix: resolve crash on load + +### Other commits +- refactor: simplify config +` + + err := os.WriteFile("CHANGELOG.md", []byte(content), 0644) + if err != nil { + t.Fatalf("failed to create changelog: %v", err) + } + defer os.Remove("CHANGELOG.md") + + features, fixes, others := internal.GetChangelogVersion("1.0.0") + + if len(features) != 1 || features[0] != "feat: add login" { + t.Errorf("expected feature not found") + } + if len(fixes) != 1 || fixes[0] != "fix: resolve crash on load" { + t.Errorf("expected fix not found") + } + if len(others) != 1 || others[0] != "refactor: simplify config" { + t.Errorf("expected other commit not found") + } +} + +func TestChangelogVersionExists(t *testing.T) { + mockChangelog := ` +# Changelog + +### Version 1.2.0 - 2025-06-21 + +### Features +- feat: test feature +` + + err := os.WriteFile("CHANGELOG.md", []byte(mockChangelog), 0644) + if err != nil { + t.Fatalf("failed to write changelog file: %v", err) + } + defer os.Remove("CHANGELOG.md") + + tests := []struct { + version string + expected bool + }{ + {"1.2.0", true}, + {"1.0.0", false}, + } + + for _, tt := range tests { + result := internal.ChangelogVersionExists(tt.version) + if result != tt.expected { + t.Errorf("changelogVersionExists(%q) = %v; want %v", tt.version, result, tt.expected) + } + } +} diff --git a/test/readme_test.go b/test/readme_test.go new file mode 100644 index 0000000..af9bb33 --- /dev/null +++ b/test/readme_test.go @@ -0,0 +1,69 @@ +package test + +import ( + "strings" + "testing" + "text/template" + + "github.com/caarloshenriq/forge-cli/internal" +) + +func TestReadmeTemplateGeneration(t *testing.T) { + data := internal.ReadmeTemplateData{ + ProjectName: "Forge CLI", + Description: "CLI to generate boilerplate documentation", + Installation: "go install github.com/your/repo", + Usage: "forge-cli generate", + License: "MIT", + } + + const expectedContent = `# Forge CLI + +CLI to generate boilerplate documentation + +## Installation + +go install github.com/your/repo + +## Usage + +forge-cli generate + +## License + +MIT + ` + + const readmeTemplate = `# {{.ProjectName}} + +{{.Description}} + +## Installation + +{{.Installation}} + +## Usage + +{{.Usage}} + +## License + +{{.License}}` + + tmpl, err := template.New("readme").Parse(readmeTemplate) + if err != nil { + t.Fatalf("Error parsing template: %v", err) + } + + var builder strings.Builder + err = tmpl.Execute(&builder, data) + if err != nil { + t.Fatalf("Error executing template: %v", err) + } + + result := builder.String() + + if strings.TrimSpace(result) != strings.TrimSpace(expectedContent) { + t.Errorf("Generated content doesn't match expected.\nExpected:\n%s\n\nGot:\n%s", expectedContent, result) + } +} diff --git a/test/sum_test.go b/test/sum_test.go new file mode 100644 index 0000000..41e33cf --- /dev/null +++ b/test/sum_test.go @@ -0,0 +1,14 @@ +package test + +import "testing" + +func sum(a, b int) int { + return a + b +} + +func TestSum(t *testing.T) { + result := sum(2, 3) + if result != 5 { + t.Errorf("Espect 5, but get %d", result) + } +} \ No newline at end of file