package monitor

import (
	"local/rssmon3/config"
	"os"
	"testing"
	"time"
)

func initMonitor() {
	os.Args = []string{"a", "-db", "map"}
	if err := config.New(); err != nil {
		panic(err)
	}
}

func TestMonitorNew(t *testing.T) {
	initMonitor()

	New()
}

func TestMonitorTrigger(t *testing.T) {
	initMonitor()

	m, _ := New()
	i, _ := NewItem("MonitorTrigger", time.Second)
	i.setLast(never)
	if time.Now().After(i.Last()) {
		t.Error(i.Last())
	}

	m.Outgoing = make(chan *Item, 1)
	m.queue.Push(i)
	m.trigger()

	j := <-m.Outgoing
	if i.Key != j.Key {
		t.Errorf("popped %v != %v", j, i)
	}
	if time.Since(j.Last()) > time.Second {
		t.Error(j.Last())
	}
}

func TestMonitorTriggered(t *testing.T) {
	initMonitor()

	m, _ := New()
	i, _ := NewItem("MonitorTriggered", time.Second)
	i.setLast(time.Now().Add(time.Hour * -1))
	m.queue.Push(i)

	start := time.Now()
	select {
	case <-m.triggered():
	case <-time.After(time.Second):
	}
	if time.Since(start) > time.Second {
		t.Errorf("failed to triggered")
	}
}

func TestMonitorEnqueued(t *testing.T) {
	initMonitor()

	m, _ := New()
	m.Incoming = make(chan *Item, 1)
	m.Incoming <- &Item{Key: "MonitorEnqueued"}

	select {
	case i := <-m.enqueued():
		if i.Key != "MonitorEnqueued" {
			t.Error(i)
		}
	case <-time.After(time.Second):
		t.Errorf("enqueued didnt pop")
	}
}

func TestMonitorEnqueue(t *testing.T) {
	initMonitor()

	m, _ := New()
	m.enqueue(&Item{})

	if m.queue.Len() != 1 {
		t.Error(m.queue.Len())
	}
}

func TestMonitorRun(t *testing.T) {
	initMonitor()

	m, _ := New()
	m.Outgoing = make(chan *Item, 1)
	go m.Run()
	defer config.Values().Can()

	i, _ := NewItem("MonitorRun", time.Second*5)
	m.Incoming <- i
	time.Sleep(time.Millisecond * 250)
	for j := 0; j < 5; j++ {
		if m.queue.Len() == 1 {
			return
		}
		time.Sleep(time.Millisecond * 10)
	}
	t.Errorf("incoming item didnt enter/reenter queue")
}
