// Copyright (c) 2015 Serge Gebhardt. All rights reserved.
//
// Use of this source code is governed by the ISC
// license that can be found in the LICENSE file.

package acd

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestNode_getRoot(t *testing.T) {
	r := *NewMockResponseOkString(`
{
	"count":1,
	"data":[
		{
			"isRoot":true,
			"eTagResponse":"LMel82iwbNk",
			"id":"3ohaT2SSQWOecmP0GSWv6g",
			"kind":"FOLDER",
			"version":156,
			"labels":[

			],
			"createdDate":"2014-04-08T20:58:58.011Z",
			"createdBy":"CloudDriveFiles",
			"restricted":false,
			"modifiedDate":"2015-05-03T16:12:35.394Z",
			"isShared":false,
			"parents":[

			],
			"status":"AVAILABLE"
		}
	]
}
`)
	c := NewMockClient(r)

	root, _, err := c.Nodes.GetRoot()

	assert.NoError(t, err)
	assert.Equal(t, "3ohaT2SSQWOecmP0GSWv6g", *root.Id)
	assert.Nil(t, root.Name)
}

func TestNode_getNodes(t *testing.T) {
	r := *NewMockResponseOkString(`
{
	"count":2,
	"nextToken":"kgkbpodpt6",
	"data":[
		{
			"eTagResponse":"eodh1-sfNbMI",
			"id":"eRkZ6YMuX5W3VqV3Ia7_lf",
			"name":"fooNew.jpg",
			"kind":"FILE",
			"metadataVersion":1,
			"modifiedDate":"2014-03-07T22:31:12.173Z",
			"creationDate":"2014-03-07T22:31:12.173Z",
			"labels":[
				"PHOTO"
			],
			"description":"My Awesome Photo",
			"createdBy":"ApplicationId1",
			"parents":[
				"foo1",
				"123"
			],
			"status":"Available",
			"restricted":false,
			"size":56654,
			"contentType":"image/jpeg",
			"md5":"6df23dc03f9b54cc38a0fc1483df6e21",
			"fileExtension":"jpeg",
			"contentProperties":{
				"image":{
					"make":"SAMSUNG",
					"model":"SAMSUNG-SGH-I747",
					"exposureTime":"1/1780",
					"dateTimeOriginal":"2012-08-25T14:23:24.000Z",
					"flash":"No",
					"focalLength":"37/10",
					"dateTime":"2012-08-25T14:23:24.000Z",
					"dateTimeDigitized":"2012-08-25T14:23:24.000Z",
					"software":"I747UCALG1",
					"orientation":"1",
					"colorSpace":"sRGB",
					"meteringMode":"CenterWeightedAverage",
					"exposureProgram":"Aperture Priority",
					"exposureMode":"Auto Exposure",
					"whiteBalance":"Auto",
					"sensingMethod":"One-chip color area",
					"xResolution":"72",
					"yResolution":"72",
					"resolutionUnit":"Pixels/Inch"
				}
			}
		},
		{
			"eTagResponse":"sdgrrtbbfdd",
			"id":"fooo1",
			"name":"foo.zip",
			"kind":"FILE",
			"metadataVersion":1,
			"modifiedDate":"2014-03-07T22:31:12.173Z",
			"creationDate":"2014-03-07T22:31:12.173Z",
			"labels":[
				"ZIP File"
			],
			"description":"All My Data",
			"createdBy":"ApplicationId2",
			"status":"Available",
			"restricted":false,
			"size":5665423,
			"contentType":"application/octet-stream",
			"md5":"6df23dc03f9b54cc38a0fc1483df6e23",
			"fileExtension":"zip"
		}
	]
}
`)
	c := NewMockClient(r)
	opts := &NodeListOptions{}

	nodes, _, err := c.Nodes.GetNodes(opts)

	assert.NoError(t, err)
	assert.Equal(t, "kgkbpodpt6", opts.StartToken)
	assert.Equal(t, 2, len(nodes))

	assert.Equal(t, "eRkZ6YMuX5W3VqV3Ia7_lf", *nodes[0].Id)
	assert.Equal(t, "fooNew.jpg", *nodes[0].Name)

	assert.Equal(t, "fooo1", *nodes[1].Id)
	assert.Equal(t, "foo.zip", *nodes[1].Name)
}

func TestEscapeForFilter(t *testing.T) {
	for _, test := range []struct {
		in   string
		want string
	}{
		{"", ""},
		{"potato", "potato"},
		{`potato+sausage`, `potato\+sausage`},
		{`+ - & | ! ( ) { } [ ] ^ ' " ~ * ? : \`, `\+\ \-\ \&\ \|\ \!\ \(\ \)\ \{\ \}\ \[\ \]\ \^\ \'\ \"\ \~\ \*\ \?\ \:\ \\`},
	} {
		got := EscapeForFilter(test.in)
		if test.want != got {
			t.Errorf("in(%q): want '%s' got '%s'", test.in, test.want, got)
		}
	}
}