In the project I am working on, I have to write a test for a function that download CSV from external website and store it locally. I am pretty new in Go so please let me know if I am doing it wrong.
The function is pretty simple, it uses the Go net/http
package to send a GET
request and os
package to write the HTTP response to a local file. See the full code below:
|
|
The function we want to test is DownloadCSV
which expects two arguments. url
is a URL endpoint that host the CSV and filename
is the name of local file to store the HTTP response.
There are three things I want to test here:
http.Get
shouldn’t return an error- It should create a local CSV file
- The content of the local CSV file should match with the server
http.Get
shouldn’t return an error
To test the first one, we will use an awesome Go package called net/http/httptest
. This package allows us to create a HTTP server and set the response to whatever you want.
In the code below, you can see we start with creating the server which return a 200 response status ( line 10 - 12 ). After that, we pass the URL of the server to the DownloadCSV
function and also the required filename.
At the end, we do the assertion to make sure the function does not return an error. We are using Go testing package Errorf
method to output the message if the assertion fail. This is important because we need it to mark the test as FAIL
.
|
|
It should create a local CSV file
We are going to use the os
package to check the file existence and delete it after the test finished. Three functions we will use are Stat
, IsNotExist
and Remove
. Stat
and IsNotExists
are used to assert the file existence and Remove
will clean up the file after test finished.
|
|
The content of the local CSV file should match with the server
The simplest way to do this test is to configure the httptest
server to return a string and check if that string exists in the test file. We can take this a bit further by using an actual CSV file.
We can use test fixture to achieve this. We will create a new folder called testdata
, put a CSV file inside it, set the httptest
server to read the file using ioutil.ReadFile
and return the content to the client. We will also use ioutil.ReadFile
to do the assertion to compare the content of the files. Here is the final version of the test:
|
|
You can check out the full code here: https://github.com/rudylee/go-playground and please leave a comment if find any errors.