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") } }