Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commite2d1545

Browse files
committed
Revert "remove unused"
This reverts commite23704c.
1 parente23704c commite2d1545

File tree

2 files changed

+158
-0
lines changed

2 files changed

+158
-0
lines changed

‎coderd/database/modelqueries_internal_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package database
22

33
import (
4+
"fmt"
45
"testing"
56

67
"github.com/stretchr/testify/require"
8+
9+
"github.com/coder/coder/v2/testutil"
710
)
811

912
funcTestIsAuthorizedQuery(t*testing.T) {
@@ -13,3 +16,19 @@ func TestIsAuthorizedQuery(t *testing.T) {
1316
_,err:=insertAuthorizedFilter(query,"")
1417
require.ErrorContains(t,err,"does not contain authorized replace string","ensure replace string")
1518
}
19+
20+
// TestWorkspaceTableConvert verifies all workspace fields are converted
21+
// when reducing a `Workspace` to a `WorkspaceTable`.
22+
funcTestWorkspaceTableConvert(t*testing.T) {
23+
t.Parallel()
24+
25+
varworkspaceWorkspace
26+
err:=testutil.PopulateStruct(&workspace,nil)
27+
require.NoError(t,err)
28+
29+
workspace.WorkspaceTable()
30+
require.JSONEq(t)
31+
32+
fmt.Println(workspace)
33+
34+
}

‎testutil/reflect.go

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package testutil
2+
3+
import (
4+
"fmt"
5+
"reflect"
6+
"time"
7+
)
8+
9+
typeRandomstruct {
10+
Stringfunc()string
11+
Boolfunc()bool
12+
Intfunc()int64
13+
Uintfunc()uint64
14+
Floatfunc()float64
15+
Complexfunc()complex128
16+
}
17+
18+
funcNewRandom()*Random {
19+
// Guaranteed to be random...
20+
return&Random{
21+
String:func()string {return"foo" },
22+
Bool:func()bool {returntrue },
23+
Int:func()int64 {return500 },
24+
Uint:func()uint64 {return126 },
25+
Float:func()float64 {return3.14 },
26+
Complex:func()complex128 {return6.24 },
27+
}
28+
}
29+
30+
// PopulateStruct does a best effort to populate a struct with random values.
31+
funcPopulateStruct(sinterface{},r*Random)error {
32+
ifr==nil {
33+
r=NewRandom()
34+
}
35+
36+
v:=reflect.ValueOf(s)
37+
ifv.Kind()!=reflect.Ptr||v.IsNil() {
38+
returnfmt.Errorf("s must be a non-nil pointer")
39+
}
40+
41+
v=v.Elem()
42+
ifv.Kind()!=reflect.Struct {
43+
returnfmt.Errorf("s must be a pointer to a struct")
44+
}
45+
46+
t:=v.Type()
47+
fori:=0;i<t.NumField();i++ {
48+
field:=t.Field(i)
49+
fieldName:=field.Name
50+
51+
fieldValue:=v.Field(i)
52+
if!fieldValue.CanSet() {
53+
continue// Skip if field is unexported
54+
}
55+
56+
nv,err:=populateValue(fieldValue,r)
57+
iferr!=nil {
58+
returnfmt.Errorf("%s : %w",fieldName,err)
59+
}
60+
v.Field(i).Set(nv)
61+
}
62+
63+
returnnil
64+
}
65+
66+
funcpopulateValue(v reflect.Value,r*Random) (reflect.Value,error) {
67+
varerrerror
68+
69+
// Handle some special cases
70+
switchv.Type() {
71+
casereflect.TypeOf(time.Time{}):
72+
v.Set(reflect.ValueOf(time.Date(2020,5,2,5,19,21,30,time.UTC)))
73+
returnv,nil
74+
}
75+
76+
switchv.Kind() {
77+
casereflect.Struct:
78+
iferr:=PopulateStruct(v.Addr().Interface(),r);err!=nil {
79+
returnv,err
80+
}
81+
casereflect.String:
82+
v.SetString(r.String())
83+
casereflect.Bool:
84+
v.SetBool(true)
85+
casereflect.Int,reflect.Int8,reflect.Int16,reflect.Int32,reflect.Int64:
86+
v.SetInt(r.Int())
87+
casereflect.Uint,reflect.Uint8,reflect.Uint16,reflect.Uint32,reflect.Uint64:
88+
v.SetUint(r.Uint())
89+
casereflect.Float32,reflect.Float64:
90+
v.SetFloat(r.Float())
91+
casereflect.Complex64,reflect.Complex128:
92+
v.SetComplex(r.Complex())
93+
casereflect.Array:
94+
fori:=0;i<v.Len();i++ {
95+
nv,err:=populateValue(v.Index(i),r)
96+
iferr!=nil {
97+
returnv,fmt.Errorf("array index %d : %w",i,err)
98+
}
99+
v.Index(i).Set(nv)
100+
}
101+
casereflect.Map:
102+
m:=reflect.MakeMap(v.Type())
103+
104+
// Set a value in the map
105+
k:=reflect.New(v.Type().Key())
106+
kv:=reflect.New(v.Type().Elem())
107+
k,err=populateValue(k,r)
108+
iferr!=nil {
109+
returnv,fmt.Errorf("map key : %w",err)
110+
}
111+
kv,err=populateValue(kv,r)
112+
iferr!=nil {
113+
returnv,fmt.Errorf("map value : %w",err)
114+
}
115+
116+
m.SetMapIndex(k,kv)
117+
returnm,nil
118+
casereflect.Pointer:
119+
returnpopulateValue(v.Elem(),r)
120+
casereflect.Slice:
121+
s:=reflect.MakeSlice(v.Type(),2,2)
122+
sv,err:=populateValue(reflect.New(v.Type().Elem()),r)
123+
iferr!=nil {
124+
returnv,fmt.Errorf("slice value : %w",err)
125+
}
126+
127+
s.Index(0).Set(sv)
128+
s.Index(1).Set(sv)
129+
//reflect.AppendSlice(s, sv)
130+
131+
returns,nil
132+
casereflect.Uintptr,reflect.UnsafePointer,reflect.Chan,reflect.Func,reflect.Interface:
133+
// Unsupported
134+
returnv,fmt.Errorf("%s is not supported",v.Kind())
135+
default:
136+
returnv,fmt.Errorf("unsupported kind %s",v.Kind())
137+
}
138+
returnv,nil
139+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp