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 }