github.com/hasnat/dolt/go@v0.0.0-20210628190320-9eb5d843fbb7/store/spec/commit_meta_test.go (about)

     1  // Copyright 2019 Dolthub, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  //
    15  // This file incorporates work covered by the following copyright and
    16  // permission notice:
    17  //
    18  // Copyright 2016 Attic Labs, Inc. All rights reserved.
    19  // Licensed under the Apache License, version 2.0:
    20  // http://www.apache.org/licenses/LICENSE-2.0
    21  
    22  package spec
    23  
    24  import (
    25  	"context"
    26  	"fmt"
    27  	"strings"
    28  	"testing"
    29  	"time"
    30  
    31  	"github.com/stretchr/testify/assert"
    32  
    33  	"github.com/dolthub/dolt/go/store/chunks"
    34  	"github.com/dolthub/dolt/go/store/datas"
    35  	"github.com/dolthub/dolt/go/store/types"
    36  )
    37  
    38  func isEmptyStruct(s types.Struct) bool {
    39  	return s.Equals(types.EmptyStruct(types.Format_7_18))
    40  }
    41  
    42  func newTestDB() datas.Database {
    43  	return datas.NewDatabase(chunks.NewMemoryStoreFactory().CreateStore(context.Background(), ""))
    44  }
    45  
    46  func TestCreateCommitMetaStructBasic(t *testing.T) {
    47  	assert := assert.New(t)
    48  
    49  	meta, err := CreateCommitMetaStruct(context.Background(), newTestDB(), "", "", nil, nil)
    50  	assert.NoError(err)
    51  	assert.False(isEmptyStruct(meta))
    52  	assert.Equal("Struct Meta {\n  date: String,\n}", mustString(mustType(types.TypeOf(meta)).Describe(context.Background())))
    53  }
    54  
    55  func TestCreateCommitMetaStructFromFlags(t *testing.T) {
    56  	assert := assert.New(t)
    57  
    58  	setCommitMetaFlags(time.Now().UTC().Format(CommitMetaDateFormat), "this is a message", "k1=v1,k2=v2,k3=v3")
    59  	defer resetCommitMetaFlags()
    60  
    61  	meta, err := CreateCommitMetaStruct(context.Background(), newTestDB(), "", "", nil, nil)
    62  	assert.NoError(err)
    63  	assert.Equal("Struct Meta {\n  date: String,\n  k1: String,\n  k2: String,\n  k3: String,\n  message: String,\n}",
    64  		mustString(mustType(types.TypeOf(meta)).Describe(context.Background())))
    65  	assert.Equal(types.String(commitMetaDate), mustGetValue(meta.MaybeGet("date")))
    66  	assert.Equal(types.String(commitMetaMessage), mustGetValue(meta.MaybeGet("message")))
    67  	assert.Equal(types.String("v1"), mustGetValue(meta.MaybeGet("k1")))
    68  	assert.Equal(types.String("v2"), mustGetValue(meta.MaybeGet("k2")))
    69  	assert.Equal(types.String("v3"), mustGetValue(meta.MaybeGet("k3")))
    70  }
    71  
    72  func TestCreateCommitMetaStructFromArgs(t *testing.T) {
    73  	assert := assert.New(t)
    74  
    75  	dateArg := time.Now().UTC().Format(CommitMetaDateFormat)
    76  	messageArg := "this is a message"
    77  	keyValueArg := map[string]string{"k1": "v1", "k2": "v2", "k3": "v3"}
    78  	meta, err := CreateCommitMetaStruct(context.Background(), newTestDB(), dateArg, messageArg, keyValueArg, nil)
    79  	assert.NoError(err)
    80  	assert.Equal("Struct Meta {\n  date: String,\n  k1: String,\n  k2: String,\n  k3: String,\n  message: String,\n}",
    81  		mustString(mustType(types.TypeOf(meta)).Describe(context.Background())))
    82  	assert.Equal(types.String(dateArg), mustGetValue(meta.MaybeGet("date")))
    83  	assert.Equal(types.String(messageArg), mustGetValue(meta.MaybeGet("message")))
    84  	assert.Equal(types.String("v1"), mustGetValue(meta.MaybeGet("k1")))
    85  	assert.Equal(types.String("v2"), mustGetValue(meta.MaybeGet("k2")))
    86  	assert.Equal(types.String("v3"), mustGetValue(meta.MaybeGet("k3")))
    87  }
    88  
    89  func TestCreateCommitMetaStructFromFlagsAndArgs(t *testing.T) {
    90  	assert := assert.New(t)
    91  
    92  	setCommitMetaFlags(time.Now().UTC().Format(CommitMetaDateFormat), "this is a message", "k1=v1p1,k2=v2p2,k4=v4p4")
    93  	defer resetCommitMetaFlags()
    94  
    95  	dateArg := time.Now().UTC().Add(time.Hour * -24).Format(CommitMetaDateFormat)
    96  	messageArg := "this is a message"
    97  	keyValueArg := map[string]string{"k1": "v1", "k2": "v2", "k3": "v3"}
    98  
    99  	// args passed in should win over the ones in the flags
   100  	meta, err := CreateCommitMetaStruct(context.Background(), newTestDB(), dateArg, messageArg, keyValueArg, nil)
   101  	assert.NoError(err)
   102  	assert.Equal("Struct Meta {\n  date: String,\n  k1: String,\n  k2: String,\n  k3: String,\n  k4: String,\n  message: String,\n}",
   103  		mustString(mustType(types.TypeOf(meta)).Describe(context.Background())))
   104  	assert.Equal(types.String(dateArg), mustGetValue(meta.MaybeGet("date")))
   105  	assert.Equal(types.String(messageArg), mustGetValue(meta.MaybeGet("message")))
   106  	assert.Equal(types.String("v1"), mustGetValue(meta.MaybeGet("k1")))
   107  	assert.Equal(types.String("v2"), mustGetValue(meta.MaybeGet("k2")))
   108  	assert.Equal(types.String("v3"), mustGetValue(meta.MaybeGet("k3")))
   109  	assert.Equal(types.String("v4p4"), mustGetValue(meta.MaybeGet("k4")))
   110  }
   111  
   112  func TestCreateCommitMetaStructBadDate(t *testing.T) {
   113  	assert := assert.New(t)
   114  
   115  	testBadDates := func(cliDateString, argDateString string) {
   116  		setCommitMetaFlags(cliDateString, "", "")
   117  		defer resetCommitMetaFlags()
   118  
   119  		meta, err := CreateCommitMetaStruct(context.Background(), newTestDB(), argDateString, "", nil, nil)
   120  		assert.Error(err)
   121  		assert.True(strings.HasPrefix(err.Error(), "unable to parse date: "))
   122  		assert.True(isEmptyStruct(meta))
   123  	}
   124  	testBadDateMultipleWays := func(dateString string) {
   125  		testBadDates(dateString, "")
   126  		testBadDates("", dateString)
   127  		testBadDates(dateString, dateString)
   128  	}
   129  
   130  	testBadDateMultipleWays(time.Now().UTC().Format("Jan _2 15:04:05 2006"))
   131  	testBadDateMultipleWays(time.Now().UTC().Format("Mon Jan _2 15:04:05 2006"))
   132  	testBadDateMultipleWays(time.Now().UTC().Format("2006-01-02T15:04:05"))
   133  }
   134  
   135  func TestCreateCommitMetaStructBadMetaStrings(t *testing.T) {
   136  	assert := assert.New(t)
   137  
   138  	testBadMetaSeparator := func(k, v, sep string) {
   139  		setCommitMetaFlags("", "", fmt.Sprintf("%s%s%s", k, sep, v))
   140  		defer resetCommitMetaFlags()
   141  
   142  		meta, err := CreateCommitMetaStruct(context.Background(), newTestDB(), "", "", nil, nil)
   143  		assert.Error(err)
   144  		assert.True(strings.HasPrefix(err.Error(), "unable to parse meta value: "))
   145  		assert.True(isEmptyStruct(meta))
   146  	}
   147  
   148  	testBadMetaKeys := func(k, v string) {
   149  		testBadMetaSeparator(k, v, ":")
   150  		testBadMetaSeparator(k, v, "-")
   151  
   152  		setCommitMetaFlags("", "", fmt.Sprintf("%s=%s", k, v))
   153  
   154  		meta, err := CreateCommitMetaStruct(context.Background(), newTestDB(), "", "", nil, nil)
   155  		assert.Error(err)
   156  		assert.True(strings.HasPrefix(err.Error(), "invalid meta key: "))
   157  		assert.True(isEmptyStruct(meta))
   158  
   159  		resetCommitMetaFlags()
   160  
   161  		metaValues := map[string]string{k: v}
   162  		meta, err = CreateCommitMetaStruct(context.Background(), newTestDB(), "", "", metaValues, nil)
   163  		assert.Error(err)
   164  		assert.True(strings.HasPrefix(err.Error(), "invalid meta key: "))
   165  		assert.True(isEmptyStruct(meta))
   166  	}
   167  
   168  	// Valid names must start with `a-zA-Z` and after that `a-zA-Z0-9_`.
   169  	testBadMetaKeys("_name", "value")
   170  	testBadMetaKeys("99problems", "now 100")
   171  	testBadMetaKeys("one-hundred-bottles", "take one down")
   172  	testBadMetaKeys("👀", "who watches the watchers?")
   173  	testBadMetaKeys("key:", "value")
   174  }
   175  
   176  func setCommitMetaFlags(date, message, kvStrings string) {
   177  	commitMetaDate = date
   178  	commitMetaMessage = message
   179  	commitMetaKeyValueStrings = kvStrings
   180  }
   181  
   182  func resetCommitMetaFlags() {
   183  	setCommitMetaFlags("", "", "")
   184  }