// Copyright (c) 2022 The Decred developers
// Use of this source code is governed by an ISC
// license that can be found in the LICENSE file.

package database

import (
	"reflect"
	"testing"
)

func TestBytesToStringMap(t *testing.T) {
	t.Parallel()

	var tests = []struct {
		name      string
		input     []byte
		expect    map[string]string
		expectErr bool
	}{
		{
			name:      "Empty map on nil bytes",
			input:     nil,
			expect:    map[string]string{},
			expectErr: false,
		},
		{
			name:      "Empty map on empty json map",
			input:     []byte("{}"),
			expect:    map[string]string{},
			expectErr: false,
		},
		{
			name:      "Empty map on null",
			input:     []byte("null"),
			expect:    map[string]string{},
			expectErr: false,
		},
		{
			name:      "Correct values with valid json",
			input:     []byte("{\"key\":\"value\"}"),
			expect:    map[string]string{"key": "value"},
			expectErr: false,
		},
		{
			name:      "Error on no bytes",
			input:     []byte(""),
			expect:    nil,
			expectErr: true,
		},
		{
			name:      "Error on invalid json",
			input:     []byte("invalid json"),
			expect:    nil,
			expectErr: true,
		},
		{
			name:      "Error on non-map json",
			input:     []byte("[\"not a map\"]"),
			expect:    nil,
			expectErr: true,
		},
	}

	for _, test := range tests {
		test := test
		t.Run(test.name, func(t *testing.T) {
			t.Parallel()
			result, err := bytesToStringMap(test.input)
			if !reflect.DeepEqual(test.expect, result) {
				t.Fatalf("expected %v, got %v", test.expect, result)
			}
			if test.expectErr != (err != nil) {
				t.Fatalf("expected err=%t, got %v", test.expectErr, err)
			}
		})
	}
}
