rssmon3/copart/auction/auction_test.go

186 lines
4.5 KiB
Go

package auction
import (
"context"
"crypto/rand"
"fmt"
"local/sandbox/selenium/copart/copart/browser"
"local/sandbox/selenium/copart/copart/config"
"math/big"
"net/url"
"os"
"strings"
"sync"
"testing"
"time"
)
func randStr() string {
n := 3
letters := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
k := big.NewInt(int64(len(letters)))
b := make([]byte, n)
for i := 0; i < n; i++ {
j, _ := rand.Int(rand.Reader, k)
b[i] = letters[int(j.Int64())]
}
return string(b)
}
func randomAuctionBody() []browser.MockElement {
return []browser.MockElement{browser.MockElement{
Attrs: map[string]string{
"src": "anything",
},
Ret: map[string][]browser.MockElement{
"//bidding-dialer-refactor": []browser.MockElement{browser.MockElement{
Ret: map[string][]browser.MockElement{
"text": []browser.MockElement{browser.MockElement{
Txt: "$bid" + randStr(),
}},
},
}},
"//lot-details-primary-refactored": []browser.MockElement{browser.MockElement{
Ret: map[string][]browser.MockElement{
"label": []browser.MockElement{browser.MockElement{
Txt: "label" + randStr(),
Ret: map[string][]browser.MockElement{
"../div[1]": []browser.MockElement{browser.MockElement{
Txt: "value" + randStr(),
}},
},
}},
},
}},
"//lot-details-secondary-refactored": []browser.MockElement{browser.MockElement{
Ret: map[string][]browser.MockElement{
"label": []browser.MockElement{browser.MockElement{
Txt: "label" + randStr(),
Ret: map[string][]browser.MockElement{
"../div[1]": []browser.MockElement{browser.MockElement{
Txt: "value" + randStr(),
}},
},
}},
},
}},
"//ngx-carousel": []browser.MockElement{browser.MockElement{
Ret: map[string][]browser.MockElement{
"ngx-item": []browser.MockElement{},
},
}},
"//lot-header": []browser.MockElement{browser.MockElement{
Ret: map[string][]browser.MockElement{
"section": []browser.MockElement{browser.MockElement{
Ret: map[string][]browser.MockElement{
"div": []browser.MockElement{browser.MockElement{
Ret: map[string][]browser.MockElement{
"div": []browser.MockElement{browser.MockElement{
Txt: "title" + randStr(),
}},
},
}},
},
}},
},
}},
"//widget-header-sale": []browser.MockElement{browser.MockElement{
Ret: map[string][]browser.MockElement{
".//div[@class=\"watchlist\"]": []browser.MockElement{},
},
}},
},
}}
}
func mockAuction() (*Auction, context.CancelFunc) {
m := &sync.Map{}
r := randomAuctionBody()
m.Store("body", r)
go func() {
time.Sleep(time.Second * 2)
m.Store("//iframe", r)
}()
driver := browser.NewMockDriver(m)
ctx, can := context.WithCancel(context.Background())
go func() {
for ctx.Err() == nil {
time.Sleep(time.Millisecond * 100)
m.Store("body", randomAuctionBody())
}
}()
return &Auction{
browser: &browser.Browser{Driver: driver},
cars: make(chan *Car),
ctx: ctx,
can: can,
routines: make(chan struct{}, 5),
}, can
}
func TestNewAuction(t *testing.T) {
a, can := mockAuction()
defer can()
b := a.browser
if _, err := New(b, "any"); err != nil {
t.Fatal(err)
}
}
func TestAuctionStartStop(t *testing.T) {
a, can := mockAuction()
defer can()
if err := a.Start(); err != nil {
t.Fatal(err)
}
if len(a.routines) != 2 {
t.Fatal("not 2 routines")
}
if err := a.Stop(); err != nil {
t.Fatal(err)
}
}
func TestAuctionSaveCar(t *testing.T) {
os.Args = []string{"a", "-db", "map"}
config.New()
a, can := mockAuction()
defer can()
c := NewCar()
c.Bid = "123"
c.Title = "abc"
c.Details = map[string]string{
"x": "y",
}
c.Images = []*Image{&Image{Src: &url.URL{Host: "img"}}}
d := NewCar()
if err := a.saveCar(c); err != nil {
t.Fatal(err)
}
if b, err := config.Values().DB.Get("LIST"); err != nil {
t.Fatal(err)
} else if !strings.Contains(string(b), c.String()) {
t.Fatal("list does not contain new car")
}
if b, err := config.Values().DB.Get(c.String()); err != nil {
t.Fatal(err)
} else if err := d.Decode(b); err != nil {
t.Fatal(err)
} else if !c.Equals(d) {
t.Fatal("saved car != fetched car")
}
}
func TestAuctionNextCar(t *testing.T) {
os.Args = []string{"a", "-db", "map"}
config.New()
a, can := mockAuction()
defer can()
if c, err := a.nextCar(); err != nil {
t.Fatal(err)
} else if c == nil || fmt.Sprintf("%v", *c) == fmt.Sprintf("%v", Car{}) {
t.Fatal("parsed car is nil")
}
}