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  }