sigs.k8s.io/prow@v0.0.0-20240503223140-c5e374dc7eb1/pkg/gitattributes/gitattributes_test.go (about)

     1  /*
     2  Copyright 2019 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package gitattributes
    18  
    19  import (
    20  	"bytes"
    21  	"testing"
    22  )
    23  
    24  func TestLoad(t *testing.T) {
    25  	var cases = []struct {
    26  		name                        string
    27  		src                         string
    28  		nbLinguistGeneratedPatterns int
    29  		expectError                 bool
    30  	}{
    31  		{
    32  			name: "kubernetes",
    33  			src: `hack/verify-flags/known-flags.txt merge=union
    34  
    35  **/zz_generated.*.go linguist-generated=true
    36  **/types.generated.go linguist-generated=true
    37  **/generated.pb.go linguist-generated=true
    38  **/generated.proto
    39  **/types_swagger_doc_generated.go linguist-generated=true
    40  docs/api-reference/** linguist-generated=true
    41  api/swagger-spec/*.json linguist-generated=true
    42  api/openapi-spec/*.json linguist-generated=true`,
    43  			nbLinguistGeneratedPatterns: 7,
    44  		},
    45  		{
    46  			name: "mholt/caddy",
    47  			src: `# shell scripts should not use tabs to indent!
    48  *.bash    text eol=lf core.whitespace whitespace=tab-in-indent,trailing-space,tabwidth=2
    49  *.sh      text eol=lf core.whitespace whitespace=tab-in-indent,trailing-space,tabwidth=2
    50  
    51  # files for systemd (shell-similar)
    52  *.path    text eol=lf core.whitespace whitespace=tab-in-indent,trailing-space,tabwidth=2
    53  *.service text eol=lf core.whitespace whitespace=tab-in-indent,trailing-space,tabwidth=2
    54  *.timer   text eol=lf core.whitespace whitespace=tab-in-indent,trailing-space,tabwidth=2
    55  
    56  # go fmt will enforce this, but in case a user has not called "go fmt" allow GIT to catch this:
    57  *.go      text eol=lf core.whitespace whitespace=indent-with-non-tab,trailing-space,tabwidth=4
    58  
    59  *.yml     text eol=lf core.whitespace whitespace=tab-in-indent,trailing-space,tabwidth=2
    60  .git*     text eol=auto core.whitespace whitespace=trailing-space`,
    61  		},
    62  		{
    63  			name: "opencontainers/runtime-spec",
    64  			src: `# https://tools.ietf.org/html/rfc5545#section-3.1
    65  *.ics text eol=crlf`,
    66  		},
    67  		{
    68  			name: "test-infra/prow/cmd/phony/examples",
    69  			src: `# Treat webhook fixtures as generated so they don't clutter PRs
    70  *.json linguist-generated=true`,
    71  			nbLinguistGeneratedPatterns: 1,
    72  		},
    73  		{
    74  			name:        "wrong pattern",
    75  			src:         `abc/ linguist-generated=true`,
    76  			expectError: true,
    77  		},
    78  	}
    79  	for _, c := range cases {
    80  		t.Run(c.name, func(t *testing.T) {
    81  			g := &Group{
    82  				LinguistGeneratedPatterns: []Pattern{},
    83  			}
    84  			if err := g.load(bytes.NewBufferString(c.src)); err != nil && !c.expectError {
    85  				t.Fatalf("load error: %v", err)
    86  			}
    87  			if got := len(g.LinguistGeneratedPatterns); got != c.nbLinguistGeneratedPatterns {
    88  				t.Fatalf("len(g.LinguistGeneratedPatterns) mismatch: got %d, want %d", got, c.nbLinguistGeneratedPatterns)
    89  			}
    90  		})
    91  	}
    92  }
    93  
    94  func TestIsLinguistGenerated(t *testing.T) {
    95  	var src = `hack/verify-flags/known-flags.txt merge=union
    96  
    97  **/zz_generated.*.go linguist-generated=true
    98  **/types.generated.go linguist-generated=true
    99  **/generated.pb.go linguist-generated=true
   100  **/generated.proto
   101  **/types_swagger_doc_generated.go linguist-generated=true
   102  docs/api-reference/** linguist-generated=true
   103  api/swagger-spec/*.json linguist-generated=true
   104  api/openapi-spec/*.json linguist-generated=true`
   105  	var cases = []struct {
   106  		name string
   107  		path string
   108  		want bool
   109  	}{
   110  		{
   111  			name: "known-flags.txt",
   112  			path: "hack/verify-flags/known-flags.txt",
   113  			want: false,
   114  		},
   115  		{
   116  			name: "generated.proto",
   117  			path: "a/generated.proto",
   118  			want: false,
   119  		},
   120  		{
   121  			name: "generated.pb.go",
   122  			path: "a/b/generated.pb.go",
   123  			want: true,
   124  		},
   125  		{
   126  			name: "abc.xml",
   127  			path: "docs/api-reference/a/b/c/abc.xml",
   128  			want: true,
   129  		},
   130  		{
   131  			name: "abc.json",
   132  			path: "api/openapi-spec/abc.json",
   133  			want: true,
   134  		},
   135  	}
   136  	for _, c := range cases {
   137  		g := &Group{
   138  			LinguistGeneratedPatterns: []Pattern{},
   139  		}
   140  		if err := g.load(bytes.NewBufferString(src)); err != nil {
   141  			t.Fatalf("load error: %v", err)
   142  		}
   143  		t.Run(c.name, func(t *testing.T) {
   144  			if got := g.IsLinguistGenerated(c.path); got != c.want {
   145  				t.Fatalf("IsLinguistGenerated mismatch: got %t, want %t", got, c.want)
   146  			}
   147  		})
   148  	}
   149  }