@ -5,7 +5,6 @@ import (
"testing"
"time"
_ "github.com/denisenkom/go-mssqldb"
"github.com/go-xorm/xorm"
"github.com/grafana/grafana/pkg/components/simplejson"
"github.com/grafana/grafana/pkg/log"
@ -15,9 +14,9 @@ import (
)
// To run this test, remove the Skip from SkipConvey
// and set up a MSSQL db named grafana_tests and a user/password grafana/password
// and set up a MSSQL db named grafana_tests and a user/password grafana/Password!
// and set the variable below to the IP address of the database
var serverIP string = "10.20.30.40 "
var serverIP string = "172.18.0.1 "
func TestMSSQL ( t * testing . T ) {
SkipConvey ( "MSSQL" , t , func ( ) {
@ -34,37 +33,54 @@ func TestMSSQL(t *testing.T) {
sess := x . NewSession ( )
defer sess . Close ( )
sql := "IF OBJECT_ID('dbo.[mssql_types]', 'U') IS NOT NULL"
sql += " DROP TABLE dbo.[mssql_types];"
sql += "CREATE TABLE [mssql_types] ( "
sql += "abit bit, "
sql += "atinyint tinyint, "
sql += "asmallint smallint, "
sql += "aint int, "
sql += "abigint bigint, "
sql += "avarchar varchar(3), "
sql += "achar char(3), "
sql += "anewvarchar varchar(14), "
sql += "anewchar char(14), "
sql += "areal real, "
sql += "anewdecimal decimal(10,2), "
sql += "afloat float, "
sql += "adatetime datetime, "
sql += "adate date, "
sql += "atime time, "
sql += "adatetimeoffset datetimeoffset) "
sql := `
IF OBJECT_ID ( ' dbo . [ mssql_types ] ' , 'U' ) IS NOT NULL
DROP TABLE dbo . [ mssql_types ]
CREATE TABLE [ mssql_types ] (
c_bit bit ,
c_tinyint tinyint ,
c_smallint smallint ,
c_int int ,
c_bigint bigint ,
c_money money ,
c_smallmoney smallmoney ,
c_numeric numeric ( 10 , 5 ) ,
c_real real ,
c_decimal decimal ( 10 , 2 ) ,
c_float float ,
c_char char ( 10 ) ,
c_varchar varchar ( 10 ) ,
c_text text ,
c_nchar nchar ( 12 ) ,
c_nvarchar nvarchar ( 12 ) ,
c_ntext ntext ,
c_datetime datetime ,
c_datetime2 datetime2 ,
c_smalldatetime smalldatetime ,
c_date date ,
c_time time ,
c_datetimeoffset datetimeoffset
)
`
_ , err := sess . Exec ( sql )
So ( err , ShouldBeNil )
sql = "INSERT INTO [mssql_types] "
sql += "(abit, atinyint, asmallint, aint, abigint, "
sql += "avarchar, achar, anewvarchar, anewchar, "
sql += "areal, anewdecimal, afloat, "
sql += "adatetime, adate, atime, adatetimeoffset ) "
sql += "VALUES(1, 5, 20020, 980300, 1420070400, "
sql += "'abc', 'def', 'hi varchar', 'I am only char', "
sql += "1.11, 2.22, 3.33, "
sql += "GETUTCDATE(), CAST(GETUTCDATE() AS DATE), CAST(GETUTCDATE() AS TIME), SWITCHOFFSET(SYSDATETIMEOFFSET(), '-07:00') );"
sql = `
INSERT INTO [ mssql_types ]
SELECT
1 , 5 , 20020 , 980300 , 1420070400 , ' $ 20000.15 ' , ' £ 2.15 ' , 12345.12 ,
1.11 , 2.22 , 3.33 ,
' char10 ' , ' varchar10 ' , ' text ' ,
N ' ☺ nchar12 ☺ ' , N ' ☺ nvarchar12 ☺ ' , N ' ☺ text ☺ ' ,
GETUTCDATE ( ) , GETUTCDATE ( ) , GETUTCDATE ( ) , CAST ( GETUTCDATE ( ) AS DATE ) , CAST ( GETUTCDATE ( ) AS TIME ) , SWITCHOFFSET ( SYSDATETIMEOFFSET ( ) , ' - 07 : 00 ' )
`
_ , err = sess . Exec ( sql )
So ( err , ShouldBeNil )
@ -86,25 +102,35 @@ func TestMSSQL(t *testing.T) {
So ( err , ShouldBeNil )
column := queryResult . Tables [ 0 ] . Rows [ 0 ]
So ( column [ 0 ] . ( bool ) , ShouldEqual , true )
So ( column [ 1 ] . ( int64 ) , ShouldEqual , 5 )
So ( column [ 2 ] . ( int64 ) , ShouldEqual , 20020 )
So ( column [ 3 ] . ( int64 ) , ShouldEqual , 980300 )
So ( column [ 4 ] . ( int64 ) , ShouldEqual , 1420070400 )
// So(column[5].(float64), ShouldEqual, 20000.15)
// So(column[6].(float64), ShouldEqual, 2.15)
//So(column[7].(float64), ShouldEqual, 12345.12)
So ( column [ 5 ] . ( string ) , ShouldEqual , "abc" )
So ( column [ 6 ] . ( string ) , ShouldEqual , "def" )
So ( column [ 7 ] . ( string ) , ShouldEqual , "hi varchar" )
So ( column [ 8 ] . ( string ) , ShouldEqual , "I am only char" )
So ( column [ 9 ] . ( float64 ) , ShouldEqual , 1.1100000143051147 ) // MSSQL dose not have precision for "real" datatype
So ( column [ 8 ] . ( float64 ) , ShouldEqual , 1.1100000143051147 ) // MSSQL dose not have precision for "real" datatype
// fix me: MSSQL driver puts the decimal inside an array of chars. and the test fails despite the values are correct.
//So(column[10].([]uint8), ShouldEqual, []uint8{'2', '.', '2', '2'})
So ( column [ 11 ] . ( float64 ) , ShouldEqual , 3.33 )
So ( column [ 12 ] . ( time . Time ) , ShouldHappenWithin , time . Duration ( 10 * time . Second ) , time . Now ( ) . UTC ( ) )
So ( column [ 13 ] . ( time . Time ) , ShouldHappenWithin , time . Duration ( 10 * time . Second ) , time . Now ( ) . UTC ( ) . Truncate ( 24 * time . Hour ) ) // ShouldEqual dose not work here !!?
So ( column [ 14 ] . ( time . Time ) , ShouldHappenWithin , time . Duration ( 10 * time . Second ) , time . Date ( 1 , time . January , 1 , time . Now ( ) . UTC ( ) . Hour ( ) , time . Now ( ) . UTC ( ) . Minute ( ) , time . Now ( ) . UTC ( ) . Second ( ) , 0 , time . UTC ) )
So ( column [ 15 ] . ( time . Time ) , ShouldHappenWithin , time . Duration ( 10 * time . Second ) , time . Now ( ) . UTC ( ) )
//So(column[9].([]uint8), ShouldEqual, []uint8{'2', '.', '2', '2'})
So ( column [ 10 ] . ( float64 ) , ShouldEqual , 3.33 )
So ( column [ 11 ] . ( string ) , ShouldEqual , "char10 " )
So ( column [ 12 ] . ( string ) , ShouldEqual , "varchar10" )
So ( column [ 13 ] . ( string ) , ShouldEqual , "text" )
So ( column [ 14 ] . ( string ) , ShouldEqual , "☺nchar12☺ " )
So ( column [ 15 ] . ( string ) , ShouldEqual , "☺nvarchar12☺" )
So ( column [ 16 ] . ( string ) , ShouldEqual , "☺text☺" )
So ( column [ 17 ] . ( time . Time ) , ShouldHappenWithin , time . Duration ( 10 * time . Second ) , time . Now ( ) . UTC ( ) )
So ( column [ 18 ] . ( time . Time ) , ShouldHappenWithin , time . Duration ( 10 * time . Millisecond ) , time . Now ( ) . UTC ( ) )
So ( column [ 19 ] . ( time . Time ) , ShouldHappenWithin , time . Duration ( 10 * time . Second ) , time . Now ( ) . UTC ( ) . Truncate ( time . Minute ) )
So ( column [ 20 ] . ( time . Time ) , ShouldHappenWithin , time . Duration ( 10 * time . Second ) , time . Now ( ) . UTC ( ) . Truncate ( 24 * time . Hour ) ) // ShouldEqual dose not work here !!?
So ( column [ 21 ] . ( time . Time ) , ShouldHappenWithin , time . Duration ( 10 * time . Second ) , time . Date ( 1 , time . January , 1 , time . Now ( ) . UTC ( ) . Hour ( ) , time . Now ( ) . UTC ( ) . Minute ( ) , time . Now ( ) . UTC ( ) . Second ( ) , 0 , time . UTC ) )
So ( column [ 22 ] . ( time . Time ) , ShouldHappenWithin , time . Duration ( 10 * time . Second ) , time . Now ( ) . UTC ( ) )
} )
} )
}