package webshit

import (
	"github.com/jmoiron/sqlx"
	"github.com/rs/zerolog"
	"github.com/rs/zerolog/log"
	"github.com/stretchr/testify/assert"
	"os"
	"testing"

	_ "github.com/mattn/go-sqlite3"
)

func init() {
	log.Logger = log.Logger.Output(zerolog.ConsoleWriter{Out: os.Stderr})
}

func makeWS(t *testing.T) *Webshit {
	db := sqlx.MustOpen("sqlite3", "file::memory:?mode=memory&cache=shared")
	w := New(db)
	assert.Equal(t, w.db, db)
	return w
}

func TestWebshit_GetWeekly(t *testing.T) {
	w := makeWS(t)
	weekly, pub, err := w.GetWeekly()
	t.Logf("Pub: %v", pub)
	assert.NotNil(t, pub)
	assert.Nil(t, err)
	assert.NotEmpty(t, weekly)
}

func TestWebshit_GetHeadlines(t *testing.T) {
	w := makeWS(t)
	headlines, err := w.GetHeadlines()
	assert.Nil(t, err)
	assert.NotEmpty(t, headlines)
}

func TestWebshit_getStoryByURL(t *testing.T) {
	w := makeWS(t)
	expected := "Developer Tropes: “Google Does It”"
	s, err := w.getStoryByURL("https://news.ycombinator.com/item?id=20432887")
	assert.Nil(t, err)
	assert.Equal(t, s.Title, expected)
}

func TestWebshit_getStoryByURL_BadURL(t *testing.T) {
	w := makeWS(t)
	_, err := w.getStoryByURL("https://google.com")
	assert.Error(t, err)
}

func TestWebshit_GetBalance(t *testing.T) {
	w := makeWS(t)
	expected := 100
	actual := w.GetBalance("foo")
	assert.Equal(t, expected, actual)
}

func TestWebshit_checkBids(t *testing.T) {
	w := makeWS(t)
	bids := []Bid{
		Bid{User: "foo", Title: "bar", URL: "baz", Bid: 10},
		Bid{User: "foo", Title: "bar2", URL: "baz2", Bid: 10},
	}
	storyMap := map[string]Story{
		"baz": Story{Title: "bar", URL: "baz"},
	}
	result := w.checkBids(bids, storyMap)
	assert.Len(t, result, 1)
	if len(result) > 0 {
		assert.Len(t, result[0].WinningArticles, 1)
		assert.Len(t, result[0].LosingArticles, 1)
	}
}