📝

GoでCSVをzipにする&テストを書く

2022/10/19に公開

GoでCSVをZIPにしてアップロードする際、実装やテストに悩んだのでメモしておきます。

CSVをzipにする

main.go
package main

import (
	"archive/zip"
	"bytes"
	"encoding/csv"
)

func main() {
	buffer := new(bytes.Buffer)
	if err := MakeZipFile(buffer); err != nil {
		return
	}
}

func MakeZipFile(buffer *bytes.Buffer) error {
	zipWriter := zip.NewWriter(buffer)
	file, err := zipWriter.Create("sample.txt")
	if err != nil {
		return err
	}

	csvWriter := csv.NewWriter(file)
	csvWriter.Write([]string{"id", "name", "address", "birthday", "gender"})
	csvWriter.Flush()
	if err := zipWriter.Close(); err != nil {
		return err
	}
	return nil
}

テストを書く

main_test.go
package main

import (
	"archive/zip"
	"bytes"
	"fmt"
	"testing"
)

func TestMakeZipFile(t *testing.T) {
	t.Run("main test", func(t *testing.T) {
		buffer := new(bytes.Buffer)
		MakeZipFile(buffer)

		// zipを読み込むためのreaderを生成する
		r, err := zip.NewReader(bytes.NewReader(buffer.Bytes()), int64(len(buffer.Bytes())))
		if err != nil {
			t.Error("error")
		}

		// outputの変数に読み込ませる
		output := bytes.Buffer{}
		rc, err := r.File[0].Open()
		t.Cleanup(func() { rc.Close() })

		output.ReadFrom(rc)
		actual := string(output.Bytes())
		expect := `id,name,address,birthday,gender
`
		if actual != expect {
			t.Error("\nactual: ", actual, "\nexpect: ", expect)
		}
	})
}

もっと良い方法あったら教えてください

GitHub
https://github.com/takazumik/go-zip-sample

Discussion