2021-04-09 01:25:57 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-04-09 01:25:57 +03:00
package lfs
import (
"bytes"
"context"
2021-06-14 20:20:43 +03:00
"io"
2021-04-09 01:25:57 +03:00
"net/http"
"strings"
"testing"
2021-07-24 19:03:58 +03:00
"code.gitea.io/gitea/modules/json"
2021-04-09 01:25:57 +03:00
"github.com/stretchr/testify/assert"
)
func TestBasicTransferAdapterName ( t * testing . T ) {
a := & BasicTransferAdapter { }
assert . Equal ( t , "basic" , a . Name ( ) )
}
2021-06-14 20:20:43 +03:00
func TestBasicTransferAdapter ( t * testing . T ) {
p := Pointer { Oid : "b5a2c96250612366ea272ffac6d9744aaf4b45aacd96aa7cfcb931ee3b558259" , Size : 5 }
2021-04-09 01:25:57 +03:00
roundTripHandler := func ( req * http . Request ) * http . Response {
2021-06-14 20:20:43 +03:00
assert . Equal ( t , MediaType , req . Header . Get ( "Accept" ) )
assert . Equal ( t , "test-value" , req . Header . Get ( "test-header" ) )
2021-04-09 01:25:57 +03:00
url := req . URL . String ( )
2021-06-14 20:20:43 +03:00
if strings . Contains ( url , "download-request" ) {
2021-04-09 01:25:57 +03:00
assert . Equal ( t , "GET" , req . Method )
2021-09-22 08:38:34 +03:00
return & http . Response { StatusCode : http . StatusOK , Body : io . NopCloser ( bytes . NewBufferString ( "dummy" ) ) }
2021-06-14 20:20:43 +03:00
} else if strings . Contains ( url , "upload-request" ) {
assert . Equal ( t , "PUT" , req . Method )
assert . Equal ( t , "application/octet-stream" , req . Header . Get ( "Content-Type" ) )
b , err := io . ReadAll ( req . Body )
assert . NoError ( t , err )
assert . Equal ( t , "dummy" , string ( b ) )
2021-04-09 01:25:57 +03:00
2021-06-14 20:20:43 +03:00
return & http . Response { StatusCode : http . StatusOK }
} else if strings . Contains ( url , "verify-request" ) {
assert . Equal ( t , "POST" , req . Method )
assert . Equal ( t , MediaType , req . Header . Get ( "Content-Type" ) )
2021-04-09 01:25:57 +03:00
2021-06-14 20:20:43 +03:00
var vp Pointer
2021-07-24 19:03:58 +03:00
err := json . NewDecoder ( req . Body ) . Decode ( & vp )
2021-06-14 20:20:43 +03:00
assert . NoError ( t , err )
assert . Equal ( t , p . Oid , vp . Oid )
assert . Equal ( t , p . Size , vp . Size )
return & http . Response { StatusCode : http . StatusOK }
} else if strings . Contains ( url , "error-response" ) {
er := & ErrorResponse {
Message : "Object not found" ,
}
payload := new ( bytes . Buffer )
2021-07-24 19:03:58 +03:00
json . NewEncoder ( payload ) . Encode ( er )
2021-06-14 20:20:43 +03:00
2021-09-22 08:38:34 +03:00
return & http . Response { StatusCode : http . StatusNotFound , Body : io . NopCloser ( payload ) }
2021-06-14 20:20:43 +03:00
}
2023-10-24 05:54:59 +03:00
t . Errorf ( "Unknown test case: %s" , url )
return nil
2021-04-09 01:25:57 +03:00
}
hc := & http . Client { Transport : RoundTripFunc ( roundTripHandler ) }
a := & BasicTransferAdapter { hc }
2021-06-14 20:20:43 +03:00
t . Run ( "Download" , func ( t * testing . T ) {
cases := [ ] struct {
link * Link
expectederror string
} {
// case 0
{
link : & Link {
Href : "https://download-request.io" ,
Header : map [ string ] string { "test-header" : "test-value" } ,
} ,
expectederror : "" ,
2021-04-09 01:25:57 +03:00
} ,
2021-06-14 20:20:43 +03:00
// case 1
{
link : & Link {
Href : "https://error-response.io" ,
2021-04-09 01:25:57 +03:00
Header : map [ string ] string { "test-header" : "test-value" } ,
2021-06-14 20:20:43 +03:00
} ,
expectederror : "Object not found" ,
2021-04-09 01:25:57 +03:00
} ,
2021-06-14 20:20:43 +03:00
}
2021-04-09 01:25:57 +03:00
2021-06-14 20:20:43 +03:00
for n , c := range cases {
_ , err := a . Download ( context . Background ( ) , c . link )
if len ( c . expectederror ) > 0 {
assert . True ( t , strings . Contains ( err . Error ( ) , c . expectederror ) , "case %d: '%s' should contain '%s'" , n , err . Error ( ) , c . expectederror )
} else {
assert . NoError ( t , err , "case %d" , n )
}
2021-04-09 01:25:57 +03:00
}
2021-06-14 20:20:43 +03:00
} )
t . Run ( "Upload" , func ( t * testing . T ) {
cases := [ ] struct {
link * Link
expectederror string
} {
// case 0
{
link : & Link {
Href : "https://upload-request.io" ,
Header : map [ string ] string { "test-header" : "test-value" } ,
} ,
expectederror : "" ,
} ,
// case 1
{
link : & Link {
Href : "https://error-response.io" ,
Header : map [ string ] string { "test-header" : "test-value" } ,
} ,
expectederror : "Object not found" ,
} ,
}
for n , c := range cases {
err := a . Upload ( context . Background ( ) , c . link , p , bytes . NewBufferString ( "dummy" ) )
if len ( c . expectederror ) > 0 {
assert . True ( t , strings . Contains ( err . Error ( ) , c . expectederror ) , "case %d: '%s' should contain '%s'" , n , err . Error ( ) , c . expectederror )
} else {
assert . NoError ( t , err , "case %d" , n )
}
}
} )
t . Run ( "Verify" , func ( t * testing . T ) {
cases := [ ] struct {
link * Link
expectederror string
} {
// case 0
{
link : & Link {
Href : "https://verify-request.io" ,
Header : map [ string ] string { "test-header" : "test-value" } ,
} ,
expectederror : "" ,
} ,
// case 1
{
link : & Link {
Href : "https://error-response.io" ,
Header : map [ string ] string { "test-header" : "test-value" } ,
} ,
expectederror : "Object not found" ,
} ,
}
for n , c := range cases {
err := a . Verify ( context . Background ( ) , c . link , p )
if len ( c . expectederror ) > 0 {
assert . True ( t , strings . Contains ( err . Error ( ) , c . expectederror ) , "case %d: '%s' should contain '%s'" , n , err . Error ( ) , c . expectederror )
} else {
assert . NoError ( t , err , "case %d" , n )
}
}
} )
2021-04-09 01:25:57 +03:00
}