fix: bug fixes, test coverage, and CI workflow
- Fix Nodes.First() panic on empty slice (return nil) - Fix ticker leak in archive.go (create once, defer Stop) - Fix cookie path matching for empty and root paths - Fix lost query params in google.go (u.Query().Set was discarded) - Fix type assertion panic in useragents.go - Fix dropped date parse error in powerball.go - Remove unreachable dead code in megamillions.go and powerball.go - Simplify document.go WaitForNetworkIdle, remove unused root field - Remove debug fmt.Println calls across codebase - Replace panic(err) with stderr+exit in all cmd/ programs - Fix duckduckgo cmd: remove useless defer, return error on bad safesearch - Fix archive cmd: ToConfig returns error instead of panicking - Add 39+ unit tests across 6 new test files - Add Gitea Actions CI workflow (build, test, vet in parallel) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -51,10 +51,8 @@ func main() {
|
||||
},
|
||||
}
|
||||
|
||||
err := cli.Run(context.Background(), os.Args)
|
||||
|
||||
if err != nil {
|
||||
panic(err)
|
||||
if err := cli.Run(context.Background(), os.Args); err != nil {
|
||||
fmt.Fprintf(os.Stderr, "error: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -64,7 +64,6 @@ func getDrawing(_ context.Context, doc extractor.Document) (*Drawing, error) {
|
||||
return nil, fmt.Errorf("failed to parse date: %w", err)
|
||||
}
|
||||
|
||||
fmt.Println("ticks", ticks)
|
||||
drawing.Date = netTicksToTime(ticks)
|
||||
|
||||
err = doc.ForEach("ul.numbers li.ball", func(n extractor.Node) error {
|
||||
@@ -199,23 +198,12 @@ func getNextDrawing(_ context.Context, doc extractor.Document) (*NextDrawing, er
|
||||
|
||||
numeric := numericOnly(txt)
|
||||
|
||||
set := false
|
||||
if strings.Contains(txt, "Billion") {
|
||||
amt := currency.USD.Amount(numeric * 1000000000)
|
||||
nextDrawing.Jackpot = amt
|
||||
set = true
|
||||
nextDrawing.Jackpot = currency.USD.Amount(numeric * 1000000000)
|
||||
} else if strings.Contains(txt, "Million") {
|
||||
amt := currency.USD.Amount(numeric * 1000000)
|
||||
nextDrawing.Jackpot = amt
|
||||
set = true
|
||||
nextDrawing.Jackpot = currency.USD.Amount(numeric * 1000000)
|
||||
} else {
|
||||
amt := currency.USD.Amount(numeric)
|
||||
nextDrawing.Jackpot = amt
|
||||
set = true
|
||||
}
|
||||
|
||||
if !set {
|
||||
return nil, fmt.Errorf("failed to convert jackpot to currency: %w", err)
|
||||
nextDrawing.Jackpot = currency.USD.Amount(numeric)
|
||||
}
|
||||
|
||||
return &nextDrawing, nil
|
||||
|
||||
43
sites/megamillions/megamillions_test.go
Normal file
43
sites/megamillions/megamillions_test.go
Normal file
@@ -0,0 +1,43 @@
|
||||
package megamillions
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestNetTicksToTime_Consistency(t *testing.T) {
|
||||
// netTicksToTime converts .NET ticks to Go time.
|
||||
// Verify it produces consistent results for the same input.
|
||||
ticks := int64(638396256000000000)
|
||||
t1 := netTicksToTime(ticks)
|
||||
t2 := netTicksToTime(ticks)
|
||||
|
||||
if !t1.Equal(t2) {
|
||||
t.Errorf("netTicksToTime is not consistent: %v != %v", t1, t2)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNetTicksToTime_Ordering(t *testing.T) {
|
||||
// A larger ticks value should produce a later time.
|
||||
earlier := netTicksToTime(638396256000000000)
|
||||
later := netTicksToTime(638396256100000000) // 10 seconds later in ticks
|
||||
|
||||
if !later.After(earlier) {
|
||||
t.Errorf("expected later ticks to produce later time: %v vs %v", earlier, later)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNetTicksToTime_DifferenceIsCorrect(t *testing.T) {
|
||||
// .NET ticks are 100-nanosecond intervals.
|
||||
// 10,000,000 ticks = 1 second.
|
||||
ticks1 := int64(638396256000000000)
|
||||
ticks2 := ticks1 + 10000000 // 1 second later
|
||||
|
||||
t1 := netTicksToTime(ticks1)
|
||||
t2 := netTicksToTime(ticks2)
|
||||
|
||||
diff := t2.Sub(t1)
|
||||
if diff != time.Second {
|
||||
t.Errorf("expected 1 second difference, got %v", diff)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user