// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

import (
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"net/url"
	"strings"
	"testing"
)

func TestHandleFmt(t *testing.T) {
	s, err := newServer(testingOptions(t))
	if err != nil {
		t.Fatalf("newServer(testingOptions(t)): %v", err)
	}

	for _, tt := range []struct {
		name    string
		method  string
		body    string
		imports bool
		want    string
		wantErr string
	}{
		{
			name:   "OPTIONS no-op",
			method: http.MethodOptions,
		},
		{
			name:   "classic",
			method: http.MethodPost,
			body:   " package main\n    func main( ) {  }\n",
			want:   "package main\n\nfunc main() {}\n",
		},
		{
			name:    "classic_goimports",
			method:  http.MethodPost,
			body:    " package main\nvar _ = fmt.Printf",
			imports: true,
			want:    "package main\n\nimport \"fmt\"\n\nvar _ = fmt.Printf\n",
		},
		{
			name:   "single_go_with_header",
			method: http.MethodPost,
			body:   "-- prog.go --\n  package main",
			want:   "-- prog.go --\npackage main\n",
		},
		{
			name:   "multi_go_with_header",
			method: http.MethodPost,
			body:   "-- prog.go --\n  package main\n\n\n-- two.go --\n   package main\n  var X = 5",
			want:   "-- prog.go --\npackage main\n-- two.go --\npackage main\n\nvar X = 5\n",
		},
		{
			name:   "multi_go_without_header",
			method: http.MethodPost,
			body:   "    package main\n\n\n-- two.go --\n   package main\n  var X = 5",
			want:   "package main\n-- two.go --\npackage main\n\nvar X = 5\n",
		},
		{
			name:   "single_go.mod_with_header",
			method: http.MethodPost,
			body:   "-- go.mod --\n   module   \"foo\"   ",
			want:   "-- go.mod --\nmodule foo\n",
		},
		{
			name:   "multi_go.mod_with_header",
			method: http.MethodPost,
			body:   "-- a/go.mod --\n  module foo\n\n\n-- b/go.mod --\n   module  \"bar\"",
			want:   "-- a/go.mod --\nmodule foo\n-- b/go.mod --\nmodule bar\n",
		},
		{
			name:   "only_format_go_and_go.mod",
			method: http.MethodPost,
			body: "    package   main   \n\n\n" +
				"-- go.mod --\n   module   foo   \n\n\n" +
				"-- plain.txt --\n   plain   text   \n\n\n",
			want: "package main\n-- go.mod --\nmodule foo\n-- plain.txt --\n   plain   text   \n\n\n",
		},
		{
			name:    "error_gofmt",
			method:  http.MethodPost,
			body:    "package 123\n",
			wantErr: "prog.go:1:9: expected 'IDENT', found 123",
		},
		{
			name:    "error_gofmt_with_header",
			method:  http.MethodPost,
			body:    "-- dir/one.go --\npackage 123\n",
			wantErr: "dir/one.go:1:9: expected 'IDENT', found 123",
		},
		{
			name:    "error_goimports",
			method:  http.MethodPost,
			body:    "package 123\n",
			imports: true,
			wantErr: "prog.go:1:9: expected 'IDENT', found 123",
		},
		{
			name:    "error_goimports_with_header",
			method:  http.MethodPost,
			body:    "-- dir/one.go --\npackage 123\n",
			imports: true,
			wantErr: "dir/one.go:1:9: expected 'IDENT', found 123",
		},
		{
			name:    "error_go.mod",
			method:  http.MethodPost,
			body:    "-- go.mod --\n123\n",
			wantErr: "go.mod:1: unknown directive: 123",
		},
		{
			name:    "error_go.mod_with_header",
			method:  http.MethodPost,
			body:    "-- dir/go.mod --\n123\n",
			wantErr: "dir/go.mod:1: unknown directive: 123",
		},
	} {
		t.Run(tt.name, func(t *testing.T) {
			rec := httptest.NewRecorder()
			form := url.Values{}
			form.Set("body", tt.body)
			if tt.imports {
				form.Set("imports", "true")
			}
			req := httptest.NewRequest("POST", "/fmt", strings.NewReader(form.Encode()))
			req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
			s.handleFmt(rec, req)
			resp := rec.Result()
			if resp.StatusCode != 200 {
				t.Fatalf("code = %v", resp.Status)
			}
			corsHeader := "Access-Control-Allow-Origin"
			if got, want := resp.Header.Get(corsHeader), "*"; got != want {
				t.Errorf("Header %q: got %q; want %q", corsHeader, got, want)
			}
			if ct := resp.Header.Get("Content-Type"); ct != "application/json" {
				t.Fatalf("Content-Type = %q; want application/json", ct)
			}
			var got fmtResponse
			if err := json.NewDecoder(resp.Body).Decode(&got); err != nil {
				t.Fatal(err)
			}
			if got.Body != tt.want {
				t.Errorf("wrong output\n got: %q\nwant: %q\n", got.Body, tt.want)
			}
			if got.Error != tt.wantErr {
				t.Errorf("wrong error\n got err: %q\nwant err: %q\n", got.Error, tt.wantErr)
			}
		})
	}
}
