Skip to content

Commit e2d1545

Browse files
committed
Revert "remove unused"
This reverts commit e23704c.
1 parent e23704c commit e2d1545

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
func TestIsAuthorizedQuery(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+
func TestWorkspaceTableConvert(t *testing.T) {
23+
t.Parallel()
24+
25+
var workspace Workspace
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+
type Random struct {
10+
String func() string
11+
Bool func() bool
12+
Int func() int64
13+
Uint func() uint64
14+
Float func() float64
15+
Complex func() complex128
16+
}
17+
18+
func NewRandom() *Random {
19+
// Guaranteed to be random...
20+
return &Random{
21+
String: func() string { return "foo" },
22+
Bool: func() bool { return true },
23+
Int: func() int64 { return 500 },
24+
Uint: func() uint64 { return 126 },
25+
Float: func() float64 { return 3.14 },
26+
Complex: func() complex128 { return 6.24 },
27+
}
28+
}
29+
30+
// PopulateStruct does a best effort to populate a struct with random values.
31+
func PopulateStruct(s interface{}, r *Random) error {
32+
if r == nil {
33+
r = NewRandom()
34+
}
35+
36+
v := reflect.ValueOf(s)
37+
if v.Kind() != reflect.Ptr || v.IsNil() {
38+
return fmt.Errorf("s must be a non-nil pointer")
39+
}
40+
41+
v = v.Elem()
42+
if v.Kind() != reflect.Struct {
43+
return fmt.Errorf("s must be a pointer to a struct")
44+
}
45+
46+
t := v.Type()
47+
for i := 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+
if err != nil {
58+
return fmt.Errorf("%s : %w", fieldName, err)
59+
}
60+
v.Field(i).Set(nv)
61+
}
62+
63+
return nil
64+
}
65+
66+
func populateValue(v reflect.Value, r *Random) (reflect.Value, error) {
67+
var err error
68+
69+
// Handle some special cases
70+
switch v.Type() {
71+
case reflect.TypeOf(time.Time{}):
72+
v.Set(reflect.ValueOf(time.Date(2020, 5, 2, 5, 19, 21, 30, time.UTC)))
73+
return v, nil
74+
}
75+
76+
switch v.Kind() {
77+
case reflect.Struct:
78+
if err := PopulateStruct(v.Addr().Interface(), r); err != nil {
79+
return v, err
80+
}
81+
case reflect.String:
82+
v.SetString(r.String())
83+
case reflect.Bool:
84+
v.SetBool(true)
85+
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
86+
v.SetInt(r.Int())
87+
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
88+
v.SetUint(r.Uint())
89+
case reflect.Float32, reflect.Float64:
90+
v.SetFloat(r.Float())
91+
case reflect.Complex64, reflect.Complex128:
92+
v.SetComplex(r.Complex())
93+
case reflect.Array:
94+
for i := 0; i < v.Len(); i++ {
95+
nv, err := populateValue(v.Index(i), r)
96+
if err != nil {
97+
return v, fmt.Errorf("array index %d : %w", i, err)
98+
}
99+
v.Index(i).Set(nv)
100+
}
101+
case reflect.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+
if err != nil {
109+
return v, fmt.Errorf("map key : %w", err)
110+
}
111+
kv, err = populateValue(kv, r)
112+
if err != nil {
113+
return v, fmt.Errorf("map value : %w", err)
114+
}
115+
116+
m.SetMapIndex(k, kv)
117+
return m, nil
118+
case reflect.Pointer:
119+
return populateValue(v.Elem(), r)
120+
case reflect.Slice:
121+
s := reflect.MakeSlice(v.Type(), 2, 2)
122+
sv, err := populateValue(reflect.New(v.Type().Elem()), r)
123+
if err != nil {
124+
return v, 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+
return s, nil
132+
case reflect.Uintptr, reflect.UnsafePointer, reflect.Chan, reflect.Func, reflect.Interface:
133+
// Unsupported
134+
return v, fmt.Errorf("%s is not supported", v.Kind())
135+
default:
136+
return v, fmt.Errorf("unsupported kind %s", v.Kind())
137+
}
138+
return v, nil
139+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy