github.com/git-lfs/git-lfs@v2.5.2+incompatible/locking/locks_test.go (about)

     1  package locking
     2  
     3  import (
     4  	"encoding/json"
     5  	"io/ioutil"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"sort"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/git-lfs/git-lfs/lfsapi"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  )
    16  
    17  type LocksById []Lock
    18  
    19  func (a LocksById) Len() int           { return len(a) }
    20  func (a LocksById) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
    21  func (a LocksById) Less(i, j int) bool { return a[i].Id < a[j].Id }
    22  
    23  func TestRefreshCache(t *testing.T) {
    24  	var err error
    25  	tempDir, err := ioutil.TempDir("", "testCacheLock")
    26  	assert.Nil(t, err)
    27  
    28  	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    29  		assert.Equal(t, "POST", r.Method)
    30  		assert.Equal(t, "/api/locks/verify", r.URL.Path)
    31  
    32  		w.Header().Set("Content-Type", "application/json")
    33  		err = json.NewEncoder(w).Encode(lockVerifiableList{
    34  			Theirs: []Lock{
    35  				Lock{Id: "99", Path: "folder/test3.dat", Owner: &User{Name: "Alice"}},
    36  				Lock{Id: "199", Path: "other/test1.dat", Owner: &User{Name: "Charles"}},
    37  			},
    38  			Ours: []Lock{
    39  				Lock{Id: "101", Path: "folder/test1.dat", Owner: &User{Name: "Fred"}},
    40  				Lock{Id: "102", Path: "folder/test2.dat", Owner: &User{Name: "Fred"}},
    41  				Lock{Id: "103", Path: "root.dat", Owner: &User{Name: "Fred"}},
    42  			},
    43  		})
    44  		assert.Nil(t, err)
    45  	}))
    46  
    47  	defer func() {
    48  		srv.Close()
    49  	}()
    50  
    51  	lfsclient, err := lfsapi.NewClient(lfsapi.NewContext(nil, nil, map[string]string{
    52  		"lfs.url":    srv.URL + "/api",
    53  		"user.name":  "Fred",
    54  		"user.email": "fred@bloggs.com",
    55  	}))
    56  	require.Nil(t, err)
    57  
    58  	client, err := NewClient("", lfsclient)
    59  	assert.Nil(t, err)
    60  	assert.Nil(t, client.SetupFileCache(tempDir))
    61  
    62  	// Should start with no cached items
    63  	locks, err := client.SearchLocks(nil, 0, true)
    64  	assert.Nil(t, err)
    65  	assert.Empty(t, locks)
    66  
    67  	_, _, err = client.VerifiableLocks(nil, 100)
    68  	assert.Nil(t, err)
    69  
    70  	locks, err = client.SearchLocks(nil, 0, true)
    71  	assert.Nil(t, err)
    72  	// Need to include zero time in structure for equal to work
    73  	zeroTime := time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC)
    74  
    75  	// Sort locks for stable comparison
    76  	sort.Sort(LocksById(locks))
    77  	assert.Equal(t, []Lock{
    78  		Lock{Path: "folder/test1.dat", Id: "101", Owner: &User{Name: "Fred"}, LockedAt: zeroTime},
    79  		Lock{Path: "folder/test2.dat", Id: "102", Owner: &User{Name: "Fred"}, LockedAt: zeroTime},
    80  		Lock{Path: "root.dat", Id: "103", Owner: &User{Name: "Fred"}, LockedAt: zeroTime},
    81  		Lock{Path: "other/test1.dat", Id: "199", Owner: &User{Name: "Charles"}, LockedAt: zeroTime},
    82  		Lock{Path: "folder/test3.dat", Id: "99", Owner: &User{Name: "Alice"}, LockedAt: zeroTime},
    83  	}, locks)
    84  }
    85  
    86  func TestGetVerifiableLocks(t *testing.T) {
    87  	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    88  		assert.Equal(t, "POST", r.Method)
    89  		assert.Equal(t, "/api/locks/verify", r.URL.Path)
    90  
    91  		body := lockVerifiableRequest{}
    92  		if assert.Nil(t, json.NewDecoder(r.Body).Decode(&body)) {
    93  			w.Header().Set("Content-Type", "application/json")
    94  			list := lockVerifiableList{}
    95  			if body.Cursor == "1" {
    96  				list.Ours = []Lock{
    97  					Lock{Path: "folder/1/test1.dat", Id: "111"},
    98  				}
    99  				list.Theirs = []Lock{
   100  					Lock{Path: "folder/1/test2.dat", Id: "112"},
   101  					Lock{Path: "folder/1/test3.dat", Id: "113"},
   102  				}
   103  			} else {
   104  				list.Ours = []Lock{
   105  					Lock{Path: "folder/0/test1.dat", Id: "101"},
   106  					Lock{Path: "folder/0/test2.dat", Id: "102"},
   107  				}
   108  				list.Theirs = []Lock{
   109  					Lock{Path: "folder/0/test3.dat", Id: "103"},
   110  				}
   111  				list.NextCursor = "1"
   112  			}
   113  
   114  			err := json.NewEncoder(w).Encode(&list)
   115  			assert.Nil(t, err)
   116  		} else {
   117  			w.WriteHeader(500)
   118  		}
   119  	}))
   120  
   121  	defer srv.Close()
   122  
   123  	lfsclient, err := lfsapi.NewClient(lfsapi.NewContext(nil, nil, map[string]string{
   124  		"lfs.url":    srv.URL + "/api",
   125  		"user.name":  "Fred",
   126  		"user.email": "fred@bloggs.com",
   127  	}))
   128  	require.Nil(t, err)
   129  
   130  	client, err := NewClient("", lfsclient)
   131  	assert.Nil(t, err)
   132  
   133  	ourLocks, theirLocks, err := client.VerifiableLocks(nil, 0)
   134  	assert.Nil(t, err)
   135  
   136  	// Need to include zero time in structure for equal to work
   137  	zeroTime := time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC)
   138  
   139  	// Sort locks for stable comparison
   140  	sort.Sort(LocksById(ourLocks))
   141  	assert.Equal(t, []Lock{
   142  		Lock{Path: "folder/0/test1.dat", Id: "101", LockedAt: zeroTime},
   143  		Lock{Path: "folder/0/test2.dat", Id: "102", LockedAt: zeroTime},
   144  		Lock{Path: "folder/1/test1.dat", Id: "111", LockedAt: zeroTime},
   145  	}, ourLocks)
   146  
   147  	sort.Sort(LocksById(theirLocks))
   148  	assert.Equal(t, []Lock{
   149  		Lock{Path: "folder/0/test3.dat", Id: "103", LockedAt: zeroTime},
   150  		Lock{Path: "folder/1/test2.dat", Id: "112", LockedAt: zeroTime},
   151  		Lock{Path: "folder/1/test3.dat", Id: "113", LockedAt: zeroTime},
   152  	}, theirLocks)
   153  }