github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/js/goja_test.go (about) 1 package js 2 3 import ( 4 "encoding/xml" 5 "fmt" 6 "path/filepath" 7 "testing" 8 9 "github.com/angenalZZZ/gofunc/data" 10 11 "github.com/angenalZZZ/gofunc/configfile" 12 "github.com/angenalZZZ/gofunc/data/cache/store" 13 "github.com/angenalZZZ/gofunc/data/id" 14 "github.com/angenalZZZ/gofunc/data/random" 15 "github.com/angenalZZZ/gofunc/f" 16 "github.com/dop251/goja" 17 "github.com/go-redis/redis/v7" 18 "github.com/go-resty/resty/v2" 19 "github.com/jmoiron/sqlx" 20 21 _ "github.com/denisenkom/go-mssqldb" 22 _ "github.com/go-sql-driver/mysql" 23 _ "github.com/mattn/go-sqlite3" 24 ) 25 26 func TestNewObject(t *testing.T) { 27 vm := goja.New() 28 defer func() { vm.ClearInterrupt() }() 29 30 newObj := func(c goja.ConstructorCall) *goja.Object { 31 _ = c.This.Set("name", c.Argument(0).String()) 32 _ = c.This.Set("display", func(c1 goja.FunctionCall) goja.Value { 33 fmt.Println(" display: my name is", c.This.Get("name").Export()) 34 return goja.Undefined() 35 }) 36 return nil 37 } 38 39 vm.Set("Obj", newObj) 40 41 if v, err := vm.RunString(`obj = new Obj('GO'); obj.name`); err != nil { 42 t.Fatal(err) 43 } else { 44 t.Logf("obj.name = %q", v.Export()) 45 } 46 47 vm.ClearInterrupt() 48 49 if _, err := vm.RunString(`obj.display()`); err != nil { 50 t.Fatal(err) 51 } 52 } 53 54 func TestConsole(t *testing.T) { 55 vm := goja.New() 56 defer func() { vm.ClearInterrupt() }() 57 Console(vm) 58 59 if v, err := vm.RunString(`console.log('hello world')`); err != nil { 60 t.Fatal(err) 61 } else if !v.Equals(goja.Undefined()) { 62 t.Fail() 63 } 64 65 if buf, err := xml.Marshal(&resty.User{Username: "Hi", Password: "***"}); err != nil { 66 t.Fatal(err) 67 } else if _, err := vm.RunString(`dump('` + f.String(buf) + `')`); err != nil { 68 t.Fatal(err) 69 } 70 } 71 72 func TestID(t *testing.T) { 73 vm := goja.New() 74 defer func() { vm.ClearInterrupt() }() 75 Console(vm) 76 ID(vm) 77 RD(vm) 78 79 shareObject := make(map[string]interface{}) 80 shareObject["id"] = id.L36() 81 shareObject["name"] = random.AlphaNumber(10) 82 vm.Set("shareObject", shareObject) 83 84 script := ` 85 dump(shareObject) 86 shareObject.id = ID() 87 shareObject.rd = RD() 88 shareObject.f1 = function (a) { console.log('this.id =', this.id, ', arguments =', a) }; 89 shareObject.f1(111) 90 ` 91 92 if _, err := vm.RunString(script); err != nil { 93 t.Fatal(err) 94 } else { 95 self := vm.Get("shareObject") 96 if obj, ok := self.Export().(map[string]interface{}); ok { 97 t.Logf("%+v", obj) 98 if f1, ok := obj["f1"].(func(goja.FunctionCall) goja.Value); ok { 99 f1(goja.FunctionCall{This: self, Arguments: []goja.Value{vm.ToValue(222)}}) 100 } 101 } 102 } 103 } 104 105 func TestDb(t *testing.T) { 106 r := goja.New() 107 defer func() { r.ClearInterrupt() }() 108 Console(r) 109 Cache(r, nil, filepath.Join(data.RootDir, ".nats01")) 110 store.RedisClient = redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}) 111 Redis(r, store.RedisClient) 112 113 config, err := configfile.YamlToMap("../test/config/database.yaml") 114 if err != nil { 115 t.Fatal(err) 116 } 117 conn, ok := config["database"].(map[interface{}]interface{}) 118 if !ok { 119 t.SkipNow() 120 } 121 122 var d *sqlx.DB 123 if d, err = sqlx.Connect("mysql", conn["mysql"].(string)); err != nil { 124 t.Skip(err) 125 } 126 defer func() { _ = d.Close() }() 127 128 Db(r, d) 129 130 var ID string 131 var newID int64 132 script := `db.i("insert into logtest(Code,Type,Message,Account,CreateTime) values(?,?,?,?,?)",'test',2,'new message','admin','2020-10-10 10:20:30')` 133 if res, err := r.RunString(script); err != nil { 134 t.Fatal(err) 135 } else { 136 newID = res.ToInteger() 137 ID = f.ToString(newID) 138 t.Logf("inserted rows Id: %d", newID) 139 } 140 141 script = `console.log('update rows affected: '+db.x("update logtest set Code=? where Id=?",'200',` + ID + "))" 142 if _, err := r.RunString(script); err != nil { 143 t.Fatal(err) 144 } 145 146 script = `console.log('select rows: '+JSON.stringify(db.q2(2,"select * from logtest where Id=?",` + ID + ")))" 147 if _, err := r.RunString(script); err != nil { 148 t.Fatal(err) 149 } 150 script = `console.log('select rows: '+JSON.stringify(db.q2(0,"select * from logtest where Id=?",` + ID + ")))" 151 if _, err := r.RunString(script); err != nil { 152 t.Fatal(err) 153 } 154 155 script = `console.log('delete rows affected: '+db.x("delete from logtest where Id=?",` + ID + "))" 156 if _, err := r.RunString(script); err != nil { 157 t.Fatal(err) 158 } 159 } 160 161 func TestAjax(t *testing.T) { 162 r := goja.New() 163 defer func() { r.ClearInterrupt() }() 164 Console(r) 165 Ajax(r) 166 167 script := ` 168 dump($.header, $.user, $.trace) 169 var res = $.q("get","https://postman-echo.com/time/now") 170 dump(res) 171 res = $.q("post","https://postman-echo.com/post","hello","text") 172 dump(res) 173 $.trace = true 174 res = $.q("post","https://postman-echo.com/post",{strange:'boom'},"url") 175 dump(res) 176 ` 177 178 if _, err := r.RunString(script); err != nil { 179 t.Fatal(err) 180 } 181 } 182 183 func TestCache(t *testing.T) { 184 r := goja.New() 185 defer func() { r.ClearInterrupt() }() 186 Console(r) 187 Cache(r, nil, filepath.Join(data.RootDir, ".nats01")) 188 189 script := ` 190 console.log("cache.dir =", cache.dir) 191 console.log("cache.cap =", cache.cap) 192 try { cache.load() } catch (e) { throw(e) } 193 console.log("key =", cache.get("key")) 194 cache.set("key",123) 195 console.log("key =", cache.get("key")) 196 cache.set("key",123456) 197 try { cache.save(); cache.load(); } catch (e) { throw(e) } 198 console.log("key =",cache.get("key")) 199 console.log("ok!") 200 cache.clear() 201 ` 202 203 if _, err := r.RunString(script); err != nil { 204 t.Fatal(err) 205 } 206 } 207 208 func TestRedis(t *testing.T) { 209 r := goja.New() 210 defer func() { r.ClearInterrupt() }() 211 Console(r) 212 store.RedisClient = redis.NewClient(&redis.Options{Addr: "127.0.0.1:6379"}) 213 Redis(r, store.RedisClient) 214 215 script := ` 216 var k = 'key-123' 217 console.log(k+' =>', redis.get(k)) 218 redis.setNX(k,'value-123',86400) // 1 days 219 var res = redis.get(k) 220 console.log(k+' =>', res, '( ttl =', redis.ttl(k), ')') 221 if (redis.del(k)) { 222 console.log(k, 'is deleted.') 223 console.log(k, (!redis.get(k) ? 'has been deleted.' : 'delete operation failed!')) 224 } 225 k = 'key-count' 226 res = redis.incr(k) 227 console.log(k+' =>', res) 228 res = redis.incr(k,2) 229 console.log(k+' =>', res) 230 ` 231 232 if _, err := r.RunString(script); err != nil { 233 t.Fatal(err) 234 } 235 } 236 237 func TestGoRuntime_loadModules(t *testing.T) { 238 Runtime = NewRuntime(nil) 239 v, err := Runtime.RunString(` 240 var t = require('../test/js/load-modules.js'); 241 console.log(Object.getOwnPropertyNames(t)); 242 t.test(); 243 `) 244 if err != nil { 245 t.Fatal(err) 246 } else { 247 t.Log(v) 248 } 249 }