github.com/andrewrech/ih-abstract@v0.0.0-20210322142951-2fec1c8d0f38/ih-abstract_test.go (about)

     1  package main
     2  
     3  import (
     4  	"log"
     5  	"os"
     6  	"testing"
     7  
     8  	"github.com/google/go-cmp/cmp"
     9  )
    10  
    11  // TestFile is a test CSV file containing simulated / de-identified input data.
    12  const TestFile = "test.csv"
    13  
    14  // TestFileOld is a test CSV file containing simulated / de-identified outdated input data.
    15  // Some records are removed to simulate old data.
    16  const TestFileOld = "test_old.csv"
    17  
    18  // TestFilePhi is a test CSV file containing real input data.
    19  // This file is available within our organization upon request.
    20  const TestFilePhi = "test_phi.csv"
    21  
    22  // TestFilePhiOld is a test CSV file containing real outdated input data.
    23  // This file is available within our organization upon request.
    24  const TestFilePhiOld = "test_phi_old.csv"
    25  
    26  // TestFilePhiGeneric is a test CSV file containing real input data.
    27  // The file contains generic pathology data.
    28  // This file is available within our organization upon request.
    29  const TestFilePhiGeneric = "test_phi_generic.csv"
    30  
    31  // TestFilePhiGenericOld is a test CSV file containing real outdated input data.
    32  // The file contains generic pathology data.
    33  // This file is available within our organization upon request.
    34  const TestFilePhiGenericOld = "test_phi_generic_old.csv"
    35  
    36  func TestMain(m *testing.M) {
    37  	previousDir, err := os.Getwd()
    38  	if err != nil {
    39  		log.Println(err)
    40  	}
    41  
    42  	err = os.Chdir("./testdata")
    43  	if err != nil {
    44  		log.Println(err)
    45  	}
    46  
    47  	exitVal := m.Run()
    48  
    49  	// change to previous directory
    50  	err = os.Chdir(previousDir)
    51  	if err != nil {
    52  		log.Println(err)
    53  	}
    54  
    55  	os.Exit(exitVal)
    56  }
    57  
    58  func cleanupTestFull() {
    59  	testFiles := []string{
    60  		"cpd.csv",
    61  		"msi-unique-strings.csv",
    62  		"msi-unique-strings-new.csv",
    63  		"msi.csv",
    64  		"new-ids.tst",
    65  		"pdl1-unique-strings.csv",
    66  		"pdl1-unique-strings-new.csv",
    67  		"pdl1.csv",
    68  		"results-increment.csv",
    69  		"results.csv",
    70  		"wbc.csv",
    71  	}
    72  
    73  	for _, f := range testFiles {
    74  		if _, err := os.Stat(f); err == nil {
    75  			err := os.Remove(f)
    76  			if err != nil {
    77  				log.Fatalln(err)
    78  			}
    79  		}
    80  	}
    81  }
    82  
    83  func innerTest(f flags, newFile string) {
    84  	conn, err := os.Open(newFile)
    85  	if err != nil {
    86  		log.Fatalln(err)
    87  	}
    88  
    89  	mainInner(f, conn)
    90  }
    91  
    92  func TestFullFilter(t *testing.T) {
    93  	cleanupTestFull()
    94  
    95  	config := ""
    96  	example := false
    97  	noFilter := false
    98  	old := TestFileOld
    99  	sql := false
   100  
   101  	var f flags
   102  	f.config = &config
   103  	f.example = &example
   104  	f.noFilter = &noFilter
   105  	f.old = &old
   106  	f.sql = &sql
   107  
   108  	defer cleanupTestFull()
   109  	innerTest(f, TestFile)
   110  
   111  	tests := map[string]struct {
   112  		input string
   113  		want  int64
   114  	}{
   115  		"integration: cpd.csv":                     {input: "cpd.csv", want: int64(2)},
   116  		"integration: msi-unique-strings-new.csv":  {input: "msi-unique-strings-new.csv", want: int64(3)},
   117  		"integration: msi-unique-strings.csv":      {input: "msi-unique-strings.csv", want: int64(3)},
   118  		"integration: pdl1-unique-strings-new.csv": {input: "pdl1-unique-strings-new.csv", want: int64(2)},
   119  		"integration: pdl1-unique-strings.csv":     {input: "pdl1-unique-strings.csv", want: int64(2)},
   120  		"integration: pdl1.csv":                    {input: "pdl1.csv", want: int64(5)},
   121  		"integration: results-increment.csv":       {input: "results-increment.csv", want: int64(8)},
   122  		"integration: results.csv":                 {input: "results.csv", want: int64(12)},
   123  		"integration: wbc.csv":                     {input: "wbc.csv", want: int64(5)},
   124  	}
   125  
   126  	for name, tc := range tests {
   127  		name := name
   128  		tc := tc
   129  
   130  		t.Run(name, func(t *testing.T) {
   131  			got := helperCsvLines(tc.input)
   132  
   133  			diff := cmp.Diff(tc.want, got)
   134  			if diff != "" {
   135  				t.Fatalf(diff)
   136  			}
   137  		})
   138  	}
   139  }
   140  
   141  func TestFullNoFilter(t *testing.T) {
   142  	cleanupTestFull()
   143  
   144  	config := ""
   145  	example := false
   146  	noFilter := true
   147  	old := TestFileOld
   148  	sql := false
   149  
   150  	var f flags
   151  	f.config = &config
   152  	f.example = &example
   153  	f.noFilter = &noFilter
   154  	f.old = &old
   155  	f.sql = &sql
   156  
   157  	defer cleanupTestFull()
   158  	innerTest(f, TestFile)
   159  
   160  	tests := map[string]struct {
   161  		input string
   162  		want  int64
   163  	}{
   164  		"integration: results-increment.csv": {input: "results-increment.csv", want: int64(13)},
   165  		"integration: results.csv":           {input: "results.csv", want: int64(13)},
   166  	}
   167  
   168  	for name, tc := range tests {
   169  		name := name
   170  		tc := tc
   171  
   172  		t.Run(name, func(t *testing.T) {
   173  			got := helperCsvLines(tc.input)
   174  
   175  			diff := cmp.Diff(tc.want, got)
   176  			if diff != "" {
   177  				t.Fatalf(diff)
   178  			}
   179  		})
   180  	}
   181  }
   182  
   183  func TestPHIFilter(t *testing.T) {
   184  	err := os.Chdir("./phi")
   185  	if err != nil {
   186  		log.Fatalln(err)
   187  	}
   188  
   189  	cleanupTestFull()
   190  
   191  	err = os.Link("pdl1-unique-strings.csv-test", "pdl1-unique-strings.csv")
   192  	if err != nil {
   193  		log.Fatalln(err)
   194  	}
   195  
   196  	err = os.Link("msi-unique-strings.csv-test", "msi-unique-strings.csv")
   197  	if err != nil {
   198  		log.Fatalln(err)
   199  	}
   200  
   201  	defer func() {
   202  		err := os.Chdir("../")
   203  		if err != nil {
   204  			log.Fatalln(err)
   205  		}
   206  	}()
   207  
   208  	config := ""
   209  	example := false
   210  	noFilter := false
   211  	old := TestFilePhiOld
   212  	sql := false
   213  
   214  	var f flags
   215  	f.config = &config
   216  	f.example = &example
   217  	f.noFilter = &noFilter
   218  	f.old = &old
   219  	f.sql = &sql
   220  
   221  	defer cleanupTestFull()
   222  	innerTest(f, TestFilePhi)
   223  
   224  	tests := map[string]struct {
   225  		input string
   226  		want  int64
   227  	}{
   228  		"integration: cpd.csv":                     {input: "cpd.csv", want: int64(559)},
   229  		"integration: msi-unique-strings-new.csv":  {input: "msi-unique-strings-new.csv", want: int64(1)},
   230  		"integration: msi-unique-strings.csv":      {input: "msi-unique-strings.csv", want: int64(3)},
   231  		"integration: pdl1-unique-strings-new.csv": {input: "pdl1-unique-strings-new.csv", want: int64(1)},
   232  		"integration: pdl1-unique-strings.csv":     {input: "pdl1-unique-strings.csv", want: int64(16)},
   233  		"integration: pdl1.csv":                    {input: "pdl1.csv", want: int64(118)},
   234  		"integration: results-increment.csv":       {input: "results-increment.csv", want: int64(725)},
   235  		"integration: results.csv":                 {input: "results.csv", want: int64(334924)},
   236  		"integration: wbc.csv":                     {input: "wbc.csv", want: int64(334200)},
   237  	}
   238  
   239  	for name, tc := range tests {
   240  		name := name
   241  		tc := tc
   242  
   243  		t.Run(name, func(t *testing.T) {
   244  			got := helperCsvLines(tc.input)
   245  
   246  			diff := cmp.Diff(tc.want, got)
   247  			if diff != "" {
   248  				t.Fatalf(diff)
   249  			}
   250  		})
   251  	}
   252  }
   253  
   254  func TestPHINoFilter(t *testing.T) {
   255  	err := os.Chdir("./phi")
   256  	if err != nil {
   257  		log.Fatalln(err)
   258  	}
   259  
   260  	cleanupTestFull()
   261  
   262  	defer func() {
   263  		err := os.Chdir("../")
   264  		if err != nil {
   265  			log.Fatalln(err)
   266  		}
   267  	}()
   268  
   269  	config := ""
   270  	example := false
   271  	noFilter := true
   272  	old := TestFilePhiGenericOld
   273  	sql := false
   274  
   275  	var f flags
   276  	f.config = &config
   277  	f.example = &example
   278  	f.noFilter = &noFilter
   279  	f.old = &old
   280  	f.sql = &sql
   281  
   282  	// defer cleanupTestFull()
   283  	innerTest(f, TestFilePhiGeneric)
   284  
   285  	tests := map[string]struct {
   286  		input string
   287  		want  int64
   288  	}{
   289  		"integration: results-increment.csv": {input: "results-increment.csv", want: int64(50001)},
   290  	}
   291  
   292  	for name, tc := range tests {
   293  		name := name
   294  		tc := tc
   295  
   296  		t.Run(name, func(t *testing.T) {
   297  			got := helperCsvLines(tc.input)
   298  
   299  			diff := cmp.Diff(tc.want, got)
   300  			if diff != "" {
   301  				t.Fatalf(diff)
   302  			}
   303  		})
   304  	}
   305  }