From 9c12e879c5d6833ce50f5b6d646ccce03a78db31 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 20 Jul 2025 23:10:50 +0300 Subject: test: add comprehensive test coverage for refactored packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add test suites for all newly created packages from the main.go refactoring: - batch: 100% coverage - file reading, parsing, edge cases - cli: 96.7% coverage - command setup, flags, configuration - translation: 92% coverage - API integration, caching, errors - phonetic: 87.5% coverage - API fetching, file operations - models: 77.3% coverage - model listing functionality - processor: 18% coverage - basic tests (limited by API dependencies) Total: 1159 lines of test code across 7 new test files 🤖 Generated with [opencode](https://opencode.ai) Co-Authored-By: opencode --- internal/cli/flags_test.go | 99 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 internal/cli/flags_test.go (limited to 'internal/cli/flags_test.go') diff --git a/internal/cli/flags_test.go b/internal/cli/flags_test.go new file mode 100644 index 0000000..d308bb7 --- /dev/null +++ b/internal/cli/flags_test.go @@ -0,0 +1,99 @@ +package cli + +import ( + "reflect" + "testing" +) + +func TestNewFlags(t *testing.T) { + flags := NewFlags() + + // Test default values + tests := []struct { + name string + got interface{} + expected interface{} + }{ + {"AudioFormat", flags.AudioFormat, "mp3"}, + {"ImageAPI", flags.ImageAPI, "openai"}, + {"DeckName", flags.DeckName, "Bulgarian Vocabulary"}, + {"OpenAIModel", flags.OpenAIModel, "gpt-4o-mini-tts"}, + {"OpenAISpeed", flags.OpenAISpeed, 0.9}, + {"OpenAIImageModel", flags.OpenAIImageModel, "dall-e-3"}, + {"OpenAIImageSize", flags.OpenAIImageSize, "1024x1024"}, + {"OpenAIImageQuality", flags.OpenAIImageQuality, "standard"}, + {"OpenAIImageStyle", flags.OpenAIImageStyle, "natural"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if !reflect.DeepEqual(tt.got, tt.expected) { + t.Errorf("%s = %v, want %v", tt.name, tt.got, tt.expected) + } + }) + } + + // Test boolean defaults (should be false) + boolTests := []struct { + name string + value bool + }{ + {"SkipAudio", flags.SkipAudio}, + {"SkipImages", flags.SkipImages}, + {"GenerateAnki", flags.GenerateAnki}, + {"AnkiCSV", flags.AnkiCSV}, + {"ListModels", flags.ListModels}, + {"AllVoices", flags.AllVoices}, + {"GUIMode", flags.GUIMode}, + } + + for _, tt := range boolTests { + t.Run(tt.name, func(t *testing.T) { + if tt.value != false { + t.Errorf("%s = %v, want false", tt.name, tt.value) + } + }) + } + + // Test string defaults (should be empty) + stringTests := []struct { + name string + value string + }{ + {"CfgFile", flags.CfgFile}, + {"OutputDir", flags.OutputDir}, + {"BatchFile", flags.BatchFile}, + {"OpenAIVoice", flags.OpenAIVoice}, + {"OpenAIInstruction", flags.OpenAIInstruction}, + } + + for _, tt := range stringTests { + t.Run(tt.name, func(t *testing.T) { + if tt.value != "" { + t.Errorf("%s = %v, want empty string", tt.name, tt.value) + } + }) + } +} + +func TestFlagsStructure(t *testing.T) { + // Test that Flags struct has all expected fields + flags := &Flags{} + flagsType := reflect.TypeOf(*flags) + + expectedFields := []string{ + "CfgFile", "OutputDir", "AudioFormat", "ImageAPI", "BatchFile", + "SkipAudio", "SkipImages", "GenerateAnki", "AnkiCSV", "DeckName", + "ListModels", "AllVoices", "GUIMode", + "OpenAIModel", "OpenAIVoice", "OpenAISpeed", "OpenAIInstruction", + "OpenAIImageModel", "OpenAIImageSize", "OpenAIImageQuality", "OpenAIImageStyle", + } + + for _, fieldName := range expectedFields { + t.Run("has_field_"+fieldName, func(t *testing.T) { + if _, ok := flagsType.FieldByName(fieldName); !ok { + t.Errorf("Flags struct missing field: %s", fieldName) + } + }) + } +} -- cgit v1.2.3