github.com/dmaizel/tests@v0.0.0-20210728163746-cae6a2d9cee8/cmd/check-markdown/link_test.go (about) 1 // 2 // Copyright (c) 2019 Intel Corporation 3 // 4 // SPDX-License-Identifier: Apache-2.0 5 // 6 7 package main 8 9 import ( 10 "fmt" 11 "io/ioutil" 12 "os" 13 "path/filepath" 14 "testing" 15 16 "github.com/sirupsen/logrus" 17 "github.com/stretchr/testify/assert" 18 ) 19 20 // createLinkAndCategorise will create a link and categorise it. If 21 // createLinkManually is set, the link will be created "manually" (without the 22 // constructor) and categorise() called. If not set, the constructor will be 23 // used. 24 func createLinkAndCategorise(assert *assert.Assertions, createLinkManually bool) { 25 dir, err := ioutil.TempDir("", "") 26 assert.NoError(err) 27 28 cwd, err := os.Getwd() 29 assert.NoError(err) 30 defer os.Chdir(cwd) 31 32 err = os.Chdir(dir) 33 assert.NoError(err) 34 defer os.RemoveAll(dir) 35 36 readmeDirName := "dir-with-readme" 37 emptyDirName := "empty" 38 makeDirs(assert, dir, readmeDirName, emptyDirName) 39 40 readmeDirPath := filepath.Join(readmeDirName, readmeName) 41 42 topLevelReadmeName := "top-level.md" 43 topLevelReadmeLink := filepath.Join("/", topLevelReadmeName) 44 45 topLevelReadmePath := filepath.Join(dir, topLevelReadmeName) 46 47 type testData struct { 48 linkAddress string 49 50 expectedPath string 51 52 expectedType LinkType 53 expectError bool 54 55 // Set if expectedPath should be checked 56 checkPath bool 57 } 58 59 docRoot = dir 60 61 data := []testData{ 62 {"", "", -1, true, false}, 63 {"a", "", -1, true, false}, 64 {"a.b", "", -1, true, false}, 65 {"a#b", "", -1, true, false}, 66 67 {"htt://foo", "", -1, true, false}, 68 {"HTTP://foo", "", -1, true, false}, 69 {"moohttp://foo", "", -1, true, false}, 70 {"mailto", "", -1, true, false}, 71 {"http", "", -1, true, false}, 72 {"https", "", -1, true, false}, 73 74 {"http://foo", "", urlLink, false, false}, 75 {"https://foo/", "", urlLink, false, false}, 76 {"https://foo/bar", "", urlLink, false, false}, 77 {"mailto:me", "", mailLink, false, false}, 78 79 {".", "", externalFile, false, false}, 80 {"/", "", externalFile, false, false}, 81 {emptyDirName, "", externalFile, false, false}, 82 83 {readmeDirName, readmeDirPath, externalLink, false, true}, 84 {"foo.md", "foo.md", externalLink, false, true}, 85 {"foo.md#bar", "foo.md", externalLink, false, true}, 86 {topLevelReadmeLink, topLevelReadmePath, externalLink, false, true}, 87 } 88 89 logger := logrus.WithField("test", "true") 90 description := "" 91 92 for i, d := range data { 93 var link Link 94 var err error 95 96 doc := newDoc("foo", logger) 97 98 if createLinkManually { 99 link = Link{ 100 Doc: doc, 101 Address: d.linkAddress, 102 Description: description, 103 } 104 105 err = link.categorise() 106 } else { 107 link, err = newLink(doc, d.linkAddress, description) 108 } 109 110 msg := fmt.Sprintf("test[%d] manual-link: %v: %+v, link: %+v\n", i, createLinkManually, d, link) 111 112 if d.expectError { 113 assert.Error(err, msg) 114 continue 115 } 116 117 assert.NoError(err, msg) 118 119 assert.Equal(link.Doc, doc) 120 assert.Equal(link.Address, d.linkAddress) 121 assert.Equal(link.Description, description) 122 assert.Equal(link.Type, d.expectedType) 123 124 if d.checkPath { 125 assert.Equal(d.expectedPath, link.ResolvedPath) 126 } 127 } 128 } 129 130 func TestNewLink(t *testing.T) { 131 assert := assert.New(t) 132 133 createLinkAndCategorise(assert, false) 134 } 135 136 func TestLinkCategorise(t *testing.T) { 137 assert := assert.New(t) 138 139 createLinkAndCategorise(assert, true) 140 } 141 142 func TestLinkHandleImplicitREADME(t *testing.T) { 143 assert := assert.New(t) 144 145 dir, err := ioutil.TempDir("", "") 146 assert.NoError(err) 147 defer os.RemoveAll(dir) 148 149 cwd, err := os.Getwd() 150 assert.NoError(err) 151 defer os.Chdir(cwd) 152 153 err = os.Chdir(dir) 154 assert.NoError(err) 155 defer os.RemoveAll(dir) 156 157 readmeDirName := "dir-with-readme" 158 emptyDirName := "empty" 159 makeDirs(assert, dir, readmeDirName, emptyDirName) 160 161 readmePath := filepath.Join(readmeDirName, readmeName) 162 163 emptyFileName := "empty-file" 164 165 err = createFile(emptyFileName, "") 166 assert.NoError(err) 167 168 type testData struct { 169 linkAddr string 170 expectedPath string 171 expectedType LinkType 172 isREADME bool 173 expectError bool 174 } 175 176 data := []testData{ 177 {"", "", unknownLink, false, true}, 178 {"foo", "", unknownLink, false, true}, 179 {emptyFileName, "", unknownLink, false, false}, 180 {emptyDirName, "", unknownLink, false, false}, 181 {readmeDirName, readmePath, externalLink, true, false}, 182 } 183 184 logger := logrus.WithField("test", "true") 185 186 for i, d := range data { 187 doc := newDoc("foo", logger) 188 189 link := Link{ 190 Doc: doc, 191 Address: d.linkAddr, 192 } 193 194 msg := fmt.Sprintf("test[%d]: %+v\n", i, d) 195 196 isREADME, err := link.handleImplicitREADME() 197 198 if d.expectError { 199 assert.Error(err, msg) 200 continue 201 } 202 203 assert.NoError(err, msg) 204 assert.Equal(isREADME, d.isREADME) 205 assert.Equal(isREADME, d.isREADME) 206 assert.Equal(link.Address, d.linkAddr) 207 assert.Equal(link.Type, d.expectedType) 208 assert.Equal(link.ResolvedPath, d.expectedPath) 209 } 210 }