package main

import (
	"bytes"
	"fmt"
	"net/http"
	"net/http/httptest"
	"os"
	"strings"
	"testing"
	"time"

	"github.com/mattn/go-mastodon"
)

func TestCmdStream(t *testing.T) {
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		if r.URL.Path != "/api/v1/streaming/public/local" {
			http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound)
			return
		}
		f, _ := w.(http.Flusher)
		fmt.Fprintln(w, `
event: update
data: {"content": "foo", "account":{"acct":"FOO"}}
		`)
		f.Flush()

		fmt.Fprintln(w, `
event: update
data: {"content": "bar", "account":{"acct":"BAR"}}
		`)
		f.Flush()
		return
	}))
	defer ts.Close()

	config := &mastodon.Config{
		Server:       ts.URL,
		ClientID:     "foo",
		ClientSecret: "bar",
		AccessToken:  "zoo",
	}
	client := mastodon.NewClient(config)

	var buf bytes.Buffer
	app := makeApp()
	app.Writer = &buf
	app.Metadata = map[string]interface{}{
		"client": client,
		"config": config,
	}

	stop := func() {
		time.Sleep(5 * time.Second)
		if sig, ok := app.Metadata["signal"]; ok {
			sig.(chan os.Signal) <- os.Interrupt
			return
		}
		panic("timeout")
	}

	var out string

	go stop()
	app.Run([]string{"mstdn", "stream"})
	out = buf.String()
	if !strings.Contains(out, "FOO@") {
		t.Fatalf("%q should be contained in output of command: %v", "FOO@", out)
	}
	if !strings.Contains(out, "foo") {
		t.Fatalf("%q should be contained in output of command: %v", "foo", out)
	}

	go stop()
	app.Run([]string{"mstdn", "stream", "--simplejson"})
	out = buf.String()
	if !strings.Contains(out, "FOO@") {
		t.Fatalf("%q should be contained in output of command: %v", "FOO@", out)
	}
	if !strings.Contains(out, "foo") {
		t.Fatalf("%q should be contained in output of command: %v", "foo", out)
	}
}