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  }