diff --git a/internal/cardsinfo/prices.go b/internal/cardsinfo/prices.go index 3aefa1d..e6e3577 100644 --- a/internal/cardsinfo/prices.go +++ b/internal/cardsinfo/prices.go @@ -2,6 +2,7 @@ package cardsinfo import ( "net/url" + "strings" "github.com/antchfx/htmlquery" "github.com/pkg/errors" @@ -33,20 +34,20 @@ func getPricesScg(name string) ([]scgCardPrice, error) { for _, block := range blocks { price := scgCardPrice{} linkNode := htmlquery.FindOne(block, "//h2/a") - for _, attr := range linkNode.Attr { - if attr.Key == "href" { - price.link = scgDomain + attr.Val - break - } - } + price.link = scgDomain + htmlquery.SelectAttr(linkNode, "href") editionNode := htmlquery.FindOne(block, "//p[@class=\"hawk-results-item__category\"]/a") - if editionNode.FirstChild != nil { - price.edition = editionNode.FirstChild.Data + if editionNode.FirstChild == nil { + continue } + if !strings.HasPrefix(htmlquery.SelectAttr(editionNode, "href"), "/shop/singles/") { + continue + } + price.edition = editionNode.FirstChild.Data priceNode := htmlquery.FindOne(block, "//span[@class='hawk-old-price']|//div[contains(concat(' ',normalize-space(@class),' '),' hawk-results-item__options-table-cell--price ')]") - if priceNode.FirstChild != nil { - price.price = priceNode.FirstChild.Data + if priceNode.FirstChild == nil { + continue } + price.price = priceNode.FirstChild.Data results = append(results, price) } return results, nil diff --git a/internal/cardsinfo/prices_test.go b/internal/cardsinfo/prices_test.go index 3aa2782..8b367a1 100644 --- a/internal/cardsinfo/prices_test.go +++ b/internal/cardsinfo/prices_test.go @@ -1,11 +1,12 @@ package cardsinfo import ( - "gopkg.in/h2non/gock.v1" "net/http" "os" "testing" + "gopkg.in/h2non/gock.v1" + "github.com/stretchr/testify/assert" ) @@ -65,3 +66,41 @@ func TestGetPrices_Empty(t *testing.T) { assert.Nil(t, err) assert.Nil(t, prices) } + +func TestGetPrices_FilterNonCards(t *testing.T) { + defer gock.Off() + + file, _ := os.Open("test_data/NonCards.html") + gock.New(scgSearchUrlTemplate + "card").Reply(http.StatusOK).Body(file) + f := &Fetcher{} + prices, err := f.getPrices("card") + assert.Nil(t, err) + expected := []scgCardPrice{ + { + price: "$72.99", + edition: "3rd Edition - Black Border", + link: "https://starcitygames.com/sol-ring-sgl-mtg-3bb-274-frn/?sku=SGL-MTG-3BB-274-FRN3", + }, + { + price: "$24.99", + edition: "3rd Edition/Revised", + link: "https://starcitygames.com/sol-ring-sgl-mtg-3ed-274-enn/?sku=SGL-MTG-3ED-274-ENN1", + }, + { + price: "$1,999.99", + edition: "Alpha", + link: "https://starcitygames.com/sol-ring-sgl-mtg-lea-269-enn/?sku=SGL-MTG-LEA-269-ENN1", + }, + { + price: "$1,199.99", + edition: "Beta", + link: "https://starcitygames.com/sol-ring-sgl-mtg-leb-270-enn/?sku=SGL-MTG-LEB-270-ENN1", + }, + { + price: "$99.99", + edition: "Collectors' Edition", + link: "https://starcitygames.com/sol-ring-sgl-mtg-ced-270-enn/?sku=SGL-MTG-CED-270-ENN1", + }, + } + assert.Equal(t, expected, prices) +} diff --git a/internal/cardsinfo/test_data/NonCards.html b/internal/cardsinfo/test_data/NonCards.html new file mode 100644 index 0000000..e04ecfd --- /dev/null +++ b/internal/cardsinfo/test_data/NonCards.html @@ -0,0 +1,4139 @@ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+