package main

import (
	"fmt"
	"testing"
)

func TestActions(t *testing.T) {
	for _, tc := range []struct {
		actions string
		deletes int
		bad     bool
	}{
		{`["no-op"]`, 0, false}, {`["create"]`, 0, false}, {`["read"]`, 0, false}, {`["update"]`, 0, false},
		{`["delete"]`, 1, false}, {`["delete","create"]`, 1, false}, {`["create","delete"]`, 1, false},
		{`[]`, 0, true}, {`["future-action"]`, 0, true}, {`["delete","update"]`, 0, true},
	} {
		t.Run(tc.actions, func(t *testing.T) {
			p := fmt.Sprintf(`{"format_version":"1.2","resource_changes":[{"address":"demo.a","change":{"actions":%s}}]}`, tc.actions)
			got, err := Deletions([]byte(p))
			if (err != nil) != tc.bad || len(got) != tc.deletes {
				t.Fatalf("got %v, %v", got, err)
			}
		})
	}
}
func TestInput(t *testing.T) {
	for _, p := range []string{
		`{`, `{}`, `{"format_version":"2.0","resource_changes":[]}`,
		`{"format_version":"1.x","resource_changes":[]}`,
		`{"format_version":"1.2"}`, `{"format_version":"1.2","resource_changes":null}`,
		`{"format_version":"1.2","resource_changes":[{"change":{"actions":["create"]}}]}`,
	} {
		if _, err := Deletions([]byte(p)); err == nil {
			t.Fatalf("accepted %s", p)
		}
	}
	// Additional object properties do not change the small deletion check.
	if d, err := Deletions([]byte(`{"format_version":"1.99","future":true,"resource_changes":[]}`)); err != nil || len(d) != 0 {
		t.Fatal(d, err)
	}
}
