186 lines
4.5 KiB
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")
|
|
}
|
|
}
|