Skip to content

Commit

Permalink
PT-6909 Handle invalid anonymiser (#114)
Browse files Browse the repository at this point in the history
  • Loading branch information
vgarvardt authored Apr 3, 2020
1 parent 48b20a3 commit 1f12e9d
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 24 deletions.
40 changes: 22 additions & 18 deletions pkg/anonymiser/anonymiser.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,26 +66,30 @@ func (a *anonymiser) ReadTable(tableName string, rowChan chan<- database.Row, op
continue
}

for name, faker := range Functions {
if fakerType != name {
continue
}
faker, found := Functions[fakerType]
if !found {
logger.WithField("anonymiser", fakerType).Error("Anonymiser is not found")
// TODO: actually we should stop the whole process here,
// but currently there is no simple way of doing this, so as a workaround
// we'll just break dump in case log error will be missed by the user
row[column] = fmt.Sprintf("Invalid anonymiser: %s", fakerType)
continue
}

var value string
switch name {
case email, username:
b := make([]byte, 2)
rand.Read(b)
value = fmt.Sprintf(
"%s.%s",
faker.Call([]reflect.Value{})[0].String(),
hex.EncodeToString(b),
)
default:
value = faker.Call([]reflect.Value{})[0].String()
}
row[column] = value
var value string
switch fakerType {
case email, username:
b := make([]byte, 2)
rand.Read(b)
value = fmt.Sprintf(
"%s.%s",
faker.Call([]reflect.Value{})[0].String(),
hex.EncodeToString(b),
)
default:
value = faker.Call([]reflect.Value{})[0].String()
}
row[column] = value
}

rowChan <- row
Expand Down
43 changes: 37 additions & 6 deletions pkg/anonymiser/anonymiser_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"strconv"
"testing"
"time"

"github.com/hellofresh/klepto/pkg/config"
"github.com/hellofresh/klepto/pkg/database"
Expand All @@ -12,6 +13,8 @@ import (
"github.com/stretchr/testify/require"
)

const waitTimeout = time.Second

func TestReadTable(t *testing.T) {
t.Parallel()

Expand Down Expand Up @@ -45,6 +48,12 @@ func TestReadTable(t *testing.T) {
opts: reader.ReadTableOpt{},
config: config.Tables{{Name: "test", Anonymise: map[string]string{"column_test": "literal:Hello"}}},
},
{
scenario: "when column anonymiser in invalid",
function: testWhenColumnAnonymiserIsInvalid,
opts: reader.ReadTableOpt{},
config: config.Tables{{Name: "test", Anonymise: map[string]string{"column_test": "Hello"}}},
},
}

for _, test := range tests {
Expand Down Expand Up @@ -83,10 +92,12 @@ func testWhenColumnIsAnonymised(t *testing.T, opts reader.ReadTableOpt, tables c
err := anonymiser.ReadTable("test", rowChan, opts)
require.NoError(t, err)

for {
row := <-rowChan
timeoutChan := time.After(waitTimeout)
select {
case row := <-rowChan:
assert.NotEqual(t, "to_be_anonimised", row["column_test"])
break
case <-timeoutChan:
assert.FailNow(t, "Failing due to timeout")
}
}

Expand All @@ -99,10 +110,30 @@ func testWhenColumnIsAnonymisedWithLiteral(t *testing.T, opts reader.ReadTableOp
err := anonymiser.ReadTable("test", rowChan, opts)
require.NoError(t, err)

for {
row := <-rowChan
timeoutChan := time.After(waitTimeout)
select {
case row := <-rowChan:
assert.Equal(t, "Hello", row["column_test"])
break
case <-timeoutChan:
assert.FailNow(t, "Failing due to timeout")
}
}

func testWhenColumnAnonymiserIsInvalid(t *testing.T, opts reader.ReadTableOpt, tables config.Tables) {
anonymiser := NewAnonymiser(&mockReader{}, tables)

rowChan := make(chan database.Row)
defer close(rowChan)

err := anonymiser.ReadTable("test", rowChan, opts)
require.NoError(t, err)

timeoutChan := time.After(waitTimeout)
select {
case row := <-rowChan:
assert.Equal(t, "Invalid anonymiser: Hello", row["column_test"])
case <-timeoutChan:
assert.FailNow(t, "Failing due to timeout")
}
}

Expand Down

0 comments on commit 1f12e9d

Please sign in to comment.