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 }