github.com/Bio-core/jtree@v0.0.0-20190705165106-1d7a7e7d6272/tests/unit_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"io/ioutil"
     7  	"log"
     8  	"net/http"
     9  	"os"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/Bio-core/jtree/database"
    14  	"github.com/Bio-core/jtree/dummydata"
    15  	"github.com/Bio-core/jtree/models"
    16  	"github.com/Bio-core/jtree/repos"
    17  	"github.com/Bio-core/jtree/restapi"
    18  	"github.com/Bio-core/jtree/restapi/operations"
    19  	"github.com/go-openapi/loads"
    20  )
    21  
    22  var host = "http://127.0.0.1:8000"
    23  
    24  func TestMain(m *testing.M) {
    25  	testResults := m.Run()
    26  	os.Exit(testResults)
    27  }
    28  
    29  func TestSetupSever(t *testing.T) {
    30  	swaggerSpec, err := loads.Embedded(restapi.SwaggerJSON, restapi.FlatSwaggerJSON)
    31  	if err != nil {
    32  		t.Errorf("%v", err)
    33  		log.Fatalln(err)
    34  	}
    35  
    36  	api := operations.NewJtreeMetadataAPI(swaggerSpec)
    37  	server := restapi.NewServer(api)
    38  
    39  	server.ConfigureAPI()
    40  
    41  	go server.Serve()
    42  }
    43  
    44  func TestGenerateDummyData(t *testing.T) {
    45  	dummydata.MakeData(100)
    46  
    47  	query := models.Query{}
    48  	query.SelectedFields = make([]string, 0)
    49  	query.SelectedFields = append(query.SelectedFields, "*")
    50  	query.SelectedTables = make([]string, 0)
    51  	query.SelectedTables = append(query.SelectedTables, "patients")
    52  	query.SelectedCondition = make([][]string, 0)
    53  	querystring := database.BuildQuery(query)
    54  	if len(repos.GetAllSamples(querystring)) != 100 {
    55  		t.Fail()
    56  	}
    57  	query.SelectedTables[0] = "samples"
    58  	querystring = database.BuildQuery(query)
    59  	if len(repos.GetAllSamples(querystring)) != 287 {
    60  		t.Fail()
    61  	}
    62  	query.SelectedTables[0] = "experiments"
    63  	querystring = database.BuildQuery(query)
    64  	if len(repos.GetAllSamples(querystring)) != 866 {
    65  		t.Fail()
    66  	}
    67  	query.SelectedTables[0] = "results"
    68  	querystring = database.BuildQuery(query)
    69  	if len(repos.GetAllSamples(querystring)) != 1282 {
    70  		t.Fail()
    71  	}
    72  	query.SelectedTables[0] = "resultdetails"
    73  	querystring = database.BuildQuery(query)
    74  	if len(repos.GetAllSamples(querystring)) != 1899 {
    75  		t.Fail()
    76  	}
    77  	return
    78  }
    79  func TestUrls(t *testing.T) {
    80  	result := true
    81  	result = result && CheckPageResponse(host+"/Jtree/metadata/0.1.0/columns")
    82  	result = result && CheckPageResponse(host+"/Jtree/metadata/0.1.0/uneditable")
    83  	result = result && CheckPageResponse(host+"/Jtree/metadata/0.1.0/searchable")
    84  	result = result && !CheckPageResponse(host+"/x")
    85  	result = result && !CheckNoPageResponse(host+"/Jtree/metadata/0.1.0/searchable")
    86  	result = result && CheckNoPageResponse(host+"/x")
    87  
    88  	if result != true {
    89  		t.Error("Web Pages Not Successful")
    90  	}
    91  }
    92  
    93  func TestAddPatientPOST(t *testing.T) {
    94  
    95  	patient := dummydata.MakePatient(-1)
    96  	person1Bytes, err := json.Marshal(patient)
    97  
    98  	if err != nil {
    99  		t.Fail()
   100  		return
   101  	}
   102  
   103  	body := bytes.NewReader(person1Bytes)
   104  
   105  	req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/patient", body)
   106  
   107  	if err != nil {
   108  		t.Fail()
   109  		return
   110  	}
   111  
   112  	req.Header.Set("Content-Type", "application/json")
   113  
   114  	resp, err := http.DefaultClient.Do(req)
   115  
   116  	content, err := ioutil.ReadAll(resp.Body)
   117  	if err != nil {
   118  		t.Fail()
   119  		return
   120  	}
   121  	if resp.Status != "200 OK" && string(content) != "error" {
   122  		t.Fail()
   123  		return
   124  	}
   125  
   126  	if err != nil {
   127  		t.Fail()
   128  		return
   129  	}
   130  
   131  	defer resp.Body.Close()
   132  
   133  }
   134  
   135  func TestUpdatePatientPOST(t *testing.T) {
   136  
   137  	patient := repos.GetPatientByID("1")
   138  	first := "Mitchell"
   139  	last := "Strong"
   140  	patient.FirstName = &first
   141  	patient.LastName = &last
   142  	person1Bytes, err := json.Marshal(patient)
   143  
   144  	if err != nil {
   145  		t.Fail()
   146  		return
   147  	}
   148  
   149  	body := bytes.NewReader(person1Bytes)
   150  
   151  	req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/patient", body)
   152  
   153  	if err != nil {
   154  		t.Fail()
   155  		return
   156  	}
   157  
   158  	req.Header.Set("Content-Type", "application/json")
   159  
   160  	resp, err := http.DefaultClient.Do(req)
   161  	content, err := ioutil.ReadAll(resp.Body)
   162  	if err != nil {
   163  		t.Fail()
   164  		return
   165  	}
   166  	if resp.Status != "200 OK" && string(content) != "error" {
   167  		t.Fail()
   168  		return
   169  	}
   170  
   171  	if err != nil {
   172  		t.Fail()
   173  		return
   174  	}
   175  
   176  	defer resp.Body.Close()
   177  
   178  	patientNew := repos.GetPatientByID("1")
   179  
   180  	if *patientNew.FirstName != first || *patientNew.LastName != last {
   181  		t.Fail()
   182  		return
   183  	}
   184  
   185  	return
   186  }
   187  
   188  func TestAddSamplePOST(t *testing.T) {
   189  
   190  	sample := dummydata.MakeSample(1, -1)
   191  	sample1Bytes, err := json.Marshal(sample)
   192  
   193  	if err != nil {
   194  		t.Fail()
   195  		return
   196  	}
   197  
   198  	body := bytes.NewReader(sample1Bytes)
   199  
   200  	req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/sample", body)
   201  
   202  	if err != nil {
   203  		t.Fail()
   204  		return
   205  	}
   206  
   207  	req.Header.Set("Content-Type", "application/json")
   208  
   209  	resp, err := http.DefaultClient.Do(req)
   210  
   211  	content, err := ioutil.ReadAll(resp.Body)
   212  	if err != nil {
   213  		t.Fail()
   214  		return
   215  	}
   216  	if resp.Status != "200 OK" && string(content) != "error" {
   217  		t.Fail()
   218  		return
   219  	}
   220  
   221  	if err != nil {
   222  		t.Fail()
   223  		return
   224  	}
   225  
   226  	defer resp.Body.Close()
   227  
   228  }
   229  
   230  func TestUpdateSamplePOST(t *testing.T) {
   231  
   232  	sample := repos.GetSampleByID("1")
   233  	comments := "updated"
   234  	sample.Comments = &comments
   235  	sample1Bytes, err := json.Marshal(sample)
   236  
   237  	if err != nil {
   238  		t.Fail()
   239  		return
   240  	}
   241  
   242  	body := bytes.NewReader(sample1Bytes)
   243  
   244  	req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/sample", body)
   245  
   246  	if err != nil {
   247  		t.Fail()
   248  		return
   249  	}
   250  
   251  	req.Header.Set("Content-Type", "application/json")
   252  
   253  	resp, err := http.DefaultClient.Do(req)
   254  
   255  	content, err := ioutil.ReadAll(resp.Body)
   256  	if err != nil {
   257  		t.Fail()
   258  		return
   259  	}
   260  	if resp.Status != "200 OK" && string(content) != "error" {
   261  		t.Fail()
   262  		return
   263  	}
   264  
   265  	if err != nil {
   266  		t.Fail()
   267  		return
   268  	}
   269  
   270  	defer resp.Body.Close()
   271  
   272  	sampleNew := repos.GetSampleByID("1")
   273  
   274  	if *sampleNew.Comments != comments {
   275  		t.Fail()
   276  		return
   277  	}
   278  
   279  	return
   280  }
   281  
   282  func TestAddExperimentPOST(t *testing.T) {
   283  
   284  	experiment := dummydata.MakeExperiment(1, -1)
   285  	experiment1Bytes, err := json.Marshal(experiment)
   286  
   287  	if err != nil {
   288  		t.Fail()
   289  		return
   290  	}
   291  
   292  	body := bytes.NewReader(experiment1Bytes)
   293  
   294  	req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/experiment", body)
   295  
   296  	if err != nil {
   297  		t.Fail()
   298  		return
   299  	}
   300  
   301  	req.Header.Set("Content-Type", "application/json")
   302  
   303  	resp, err := http.DefaultClient.Do(req)
   304  
   305  	content, err := ioutil.ReadAll(resp.Body)
   306  	if err != nil {
   307  		t.Fail()
   308  		return
   309  	}
   310  	if resp.Status != "200 OK" && string(content) != "error" {
   311  		t.Fail()
   312  		return
   313  	}
   314  
   315  	if err != nil {
   316  		t.Fail()
   317  		return
   318  	}
   319  
   320  	defer resp.Body.Close()
   321  
   322  }
   323  
   324  func TestUpdateExperimentPOST(t *testing.T) {
   325  
   326  	experiment := repos.GetExperimentByID("1")
   327  	projectName := "updated"
   328  	experiment.ProjectName = &projectName
   329  	experiment1Bytes, err := json.Marshal(experiment)
   330  
   331  	if err != nil {
   332  		t.Fail()
   333  		return
   334  	}
   335  
   336  	body := bytes.NewReader(experiment1Bytes)
   337  
   338  	req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/experiment", body)
   339  
   340  	if err != nil {
   341  		t.Fail()
   342  		return
   343  	}
   344  
   345  	req.Header.Set("Content-Type", "application/json")
   346  
   347  	resp, err := http.DefaultClient.Do(req)
   348  
   349  	content, err := ioutil.ReadAll(resp.Body)
   350  	if err != nil {
   351  		t.Fail()
   352  		return
   353  	}
   354  	if resp.Status != "200 OK" && string(content) != "error" {
   355  		t.Fail()
   356  		return
   357  	}
   358  
   359  	if err != nil {
   360  		t.Fail()
   361  		return
   362  	}
   363  
   364  	defer resp.Body.Close()
   365  
   366  	experimentNew := repos.GetExperimentByID("1")
   367  
   368  	if *experimentNew.ProjectName != projectName {
   369  		t.Fail()
   370  		return
   371  	}
   372  
   373  	return
   374  }
   375  
   376  func TestAddResultPOST(t *testing.T) {
   377  
   378  	result := dummydata.MakeResult(1, -1)
   379  	result1Bytes, err := json.Marshal(result)
   380  
   381  	if err != nil {
   382  		t.Fail()
   383  		return
   384  	}
   385  
   386  	body := bytes.NewReader(result1Bytes)
   387  
   388  	req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/result", body)
   389  
   390  	if err != nil {
   391  		t.Fail()
   392  		return
   393  	}
   394  
   395  	req.Header.Set("Content-Type", "application/json")
   396  
   397  	resp, err := http.DefaultClient.Do(req)
   398  
   399  	content, err := ioutil.ReadAll(resp.Body)
   400  	if err != nil {
   401  		t.Fail()
   402  		return
   403  	}
   404  	if resp.Status != "200 OK" && string(content) != "error" {
   405  		t.Fail()
   406  		return
   407  	}
   408  
   409  	if err != nil {
   410  		t.Fail()
   411  		return
   412  	}
   413  
   414  	defer resp.Body.Close()
   415  
   416  }
   417  
   418  func TestUpdateResultPOST(t *testing.T) {
   419  
   420  	result := repos.GetResultByID("1")
   421  	uid := "updated"
   422  	result.UID = &uid
   423  	result1Bytes, err := json.Marshal(result)
   424  
   425  	if err != nil {
   426  		t.Fail()
   427  		return
   428  	}
   429  
   430  	body := bytes.NewReader(result1Bytes)
   431  
   432  	req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/result", body)
   433  
   434  	if err != nil {
   435  		t.Fail()
   436  		return
   437  	}
   438  
   439  	req.Header.Set("Content-Type", "application/json")
   440  
   441  	resp, err := http.DefaultClient.Do(req)
   442  
   443  	content, err := ioutil.ReadAll(resp.Body)
   444  	if err != nil {
   445  		t.Fail()
   446  		return
   447  	}
   448  	if resp.Status != "200 OK" && string(content) != "error" {
   449  		t.Fail()
   450  		return
   451  	}
   452  	if err != nil {
   453  		t.Fail()
   454  		return
   455  	}
   456  
   457  	defer resp.Body.Close()
   458  
   459  	resultNew := repos.GetResultByID("1")
   460  
   461  	if *resultNew.UID != uid {
   462  		t.Fail()
   463  		return
   464  	}
   465  
   466  	return
   467  }
   468  
   469  func TestAddResultDetailPOST(t *testing.T) {
   470  
   471  	result := dummydata.MakeResultDetail(1, -1)
   472  	result1Bytes, err := json.Marshal(result)
   473  
   474  	if err != nil {
   475  		t.Fail()
   476  		return
   477  	}
   478  
   479  	body := bytes.NewReader(result1Bytes)
   480  
   481  	req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/resultdetails", body)
   482  
   483  	if err != nil {
   484  		t.Fail()
   485  		return
   486  	}
   487  
   488  	req.Header.Set("Content-Type", "application/json")
   489  
   490  	resp, err := http.DefaultClient.Do(req)
   491  
   492  	content, err := ioutil.ReadAll(resp.Body)
   493  	if err != nil {
   494  		t.Fail()
   495  		return
   496  	}
   497  	if resp.Status != "200 OK" && string(content) != "error" {
   498  		t.Fail()
   499  		return
   500  	}
   501  
   502  	if err != nil {
   503  		t.Fail()
   504  		return
   505  	}
   506  
   507  	defer resp.Body.Close()
   508  
   509  }
   510  
   511  func TestUpdateResultDetailPOST(t *testing.T) {
   512  
   513  	result := repos.GetResultDetailByID("1")
   514  	uid := "updated"
   515  	result.UID = &uid
   516  	result1Bytes, err := json.Marshal(result)
   517  
   518  	if err != nil {
   519  		t.Fail()
   520  		return
   521  	}
   522  
   523  	body := bytes.NewReader(result1Bytes)
   524  
   525  	req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/resultdetails", body)
   526  
   527  	if err != nil {
   528  		t.Fail()
   529  		return
   530  	}
   531  
   532  	req.Header.Set("Content-Type", "application/json")
   533  
   534  	resp, err := http.DefaultClient.Do(req)
   535  	content, err := ioutil.ReadAll(resp.Body)
   536  	if err != nil {
   537  		t.Fail()
   538  		return
   539  	}
   540  	if resp.Status != "200 OK" && string(content) != "error" {
   541  		t.Fail()
   542  		return
   543  	}
   544  	if err != nil {
   545  		t.Fail()
   546  		return
   547  	}
   548  
   549  	defer resp.Body.Close()
   550  
   551  	resultNew := repos.GetResultByID("1")
   552  
   553  	if *resultNew.UID != uid {
   554  		t.Fail()
   555  		return
   556  	}
   557  
   558  	return
   559  }
   560  
   561  func TestQueries(t *testing.T) {
   562  
   563  	patient := dummydata.MakePatient(-1)
   564  	mrn := "Test123"
   565  	id := "TestID"
   566  	dob, _ := time.Parse("2006-01-02", "2034-01-02")
   567  	patient.Mrn = &mrn
   568  	patient.PatientID = &id
   569  	patient.Dob = &dob
   570  
   571  	repos.InsertPatient(&patient)
   572  	queriesList := make([]models.Query, 0)
   573  	expected := 102
   574  	//Return all
   575  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{}))
   576  	//Test Equal to
   577  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.mrn", "Equal to", "Test123"}}))
   578  	//Test not equal to
   579  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.mrn", "Not equal to", "Test123"}}))
   580  	//Test Begins with
   581  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.mrn", "Begins with", "Te"}}))
   582  	//Test Not begins with
   583  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.mrn", "Not begins with", "Te"}}))
   584  	//Test Ends with
   585  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.mrn", "Ends with", "123"}}))
   586  	//Test Not ends with
   587  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.mrn", "Not ends with", "123"}}))
   588  	//Test Contains
   589  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.mrn", "Contains", "est1"}}))
   590  	//Test Not contains
   591  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.mrn", "Not contains", "est1"}}))
   592  	//Test Greater than
   593  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.dob", "Greater than", "2034-01-01"}}))
   594  	//Test Less than
   595  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.dob", "Less than", "2034-01-01"}}))
   596  	//Test Greater or equal to
   597  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.dob", "Greater or equal to", "2034-01-02"}}))
   598  	//Test Less than
   599  	queriesList = append(queriesList, returnQuery([]string{"*"}, []string{"patients"}, [][]string{{"AND", "patients.dob", "Less or equal to", "2034-01-02"}}))
   600  
   601  	for i, q := range queriesList {
   602  		queryBytes, err := json.Marshal(q)
   603  
   604  		if err != nil {
   605  			t.Fail()
   606  			return
   607  		}
   608  		body := bytes.NewReader(queryBytes)
   609  		req, err := http.NewRequest("POST", host+"/Jtree/metadata/0.1.0/query", body)
   610  		if err != nil {
   611  			t.Fail()
   612  			return
   613  		}
   614  		req.Header.Set("Content-Type", "application/json")
   615  		resp, err := http.DefaultClient.Do(req)
   616  		if err != nil {
   617  			t.Fail()
   618  			return
   619  		}
   620  		content, err := ioutil.ReadAll(resp.Body)
   621  		if err != nil {
   622  			t.Fail()
   623  			return
   624  		}
   625  		var results []models.Record
   626  		err = json.Unmarshal(content, &results)
   627  		if err != nil {
   628  			t.Fail()
   629  			return
   630  		}
   631  		defer resp.Body.Close()
   632  		if len(results) != expected {
   633  			t.Error("Query #", i+1, " failed - Expected:", expected, " Got:", len(results))
   634  		}
   635  		if i%2 == 0 {
   636  			expected = 1
   637  		} else {
   638  			expected = 101
   639  		}
   640  		if i+2 == len(queriesList) {
   641  			expected = 102
   642  		}
   643  	}
   644  	return
   645  }