Skip to content

Commit

Permalink
add test
Browse files Browse the repository at this point in the history
  • Loading branch information
akriventsev committed Oct 28, 2020
1 parent c476419 commit 45d7f4b
Show file tree
Hide file tree
Showing 5 changed files with 241 additions and 15 deletions.
61 changes: 57 additions & 4 deletions card.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package gocard
package card

import (
"fmt"
"strconv"
"strings"
"time"
)

type Card struct {
Expand All @@ -14,13 +16,64 @@ type Card struct {
cardHolder string
}

func (c *Card) Number() string {
return strings.Trim(strings.Join(strings.Fields(fmt.Sprint(c.number)), ""), "[]")
}

func (c *Card) MaskedNumber(headlen int, taillen int) string {

hl := headlen
tl := taillen
if (hl < 0) || (hl > len(c.number)) {
hl = 6
}
if (tl < 0) || (tl > len(c.number)) {
tl = 4
}
head := c.number[:hl]
tail := c.number[len(c.number)-tl:]

maskednumber := strings.Trim(strings.Join(strings.Fields(fmt.Sprint(head)), ""), "[]")
masklen := len(c.number) - len(head) - len(tail)
maskednumber = maskednumber + strings.Repeat("*", masklen)
maskednumber = maskednumber + strings.Trim(strings.Join(strings.Fields(fmt.Sprint(tail)), ""), "[]")
return maskednumber
}

func (c *Card) Cvv() string {
return c.cvv
}

func (c *Card) Month() int {
return c.month
}

func (c *Card) Year() int {
return c.year
}

func (c *Card) CardHolder() string {
return c.cardHolder
}

func (c *Card) Expired() bool {

now := time.Now()
expirationDate := time.Date(c.year, time.Month(c.month), 1, 0, 0, 0, 0, now.Location())
expirationDate.AddDate(0, 1, 0)
return expirationDate.Before(now)

}

// Company holds a short and long names of who has issued the credit card
type PaymentSystem struct {
Short, Full string
}

func NewCard(number string, cvv string, month int, year int) (*Card, error) {
if (len(number) < 13) || (len(number) > 19) {
func NewCard(number string, cvv string, month int, year int, cardHolder string) (*Card, error) {
length := len(number)

if (length < 14) || (length > 19) {
return nil, fmt.Errorf("Invalid number length")
}
if (month > 12) || (month < 0) || (year < 0) {
Expand All @@ -39,7 +92,7 @@ func NewCard(number string, cvv string, month int, year int) (*Card, error) {
return nil, fmt.Errorf("Card number is not valid")
}

c := &Card{number: digits, cvv: cvv, month: month, year: year}
c := &Card{number: digits, cvv: cvv, month: month, year: year, cardHolder: cardHolder}
return c, nil

}
189 changes: 181 additions & 8 deletions card_test.go
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package gocard
package card

import (
"reflect"
"testing"
)

var testCard = &Card{number: []int{4, 7, 1, 6, 3, 3, 9, 2, 3, 9, 4, 6, 6, 8, 9, 8}, cvv: "334", month: 12, year: 2023, cardHolder: "Ivanov Ivan"}
var expiredCard = &Card{number: []int{4, 7, 1, 6, 3, 3, 9, 2, 3, 9, 4, 6, 6, 8, 9, 8}, cvv: "334", month: 12, year: 2019, cardHolder: "Ivanov Ivan"}

func TestNewCard(t *testing.T) {
type args struct {
number string
cvv string
month int
year int
number string
cvv string
month int
year int
cardHolder string
}
tests := []struct {
name string
Expand All @@ -20,8 +24,8 @@ func TestNewCard(t *testing.T) {
}{
// TODO: Add test cases.
{name: "VISA valid test",
args: args{number: "4716339239466898", cvv: "334", year: 2023, month: 12},
want: &Card{number: []int{4, 7, 1, 6, 3, 3, 9, 2, 3, 9, 4, 6, 6, 8, 9, 8}, cvv: "334", month: 12, year: 2023},
args: args{number: "4716339239466898", cvv: "334", year: 2023, month: 12, cardHolder: "Ivanov Ivan"},
want: testCard,
wantErr: false,
},
{name: "VISA invalid number charactertest",
Expand Down Expand Up @@ -49,10 +53,20 @@ func TestNewCard(t *testing.T) {
want: nil,
wantErr: true,
},
{name: "VISA invalid number length over 19",
args: args{number: "471633923946689811111", cvv: "334", year: 2023, month: 12},
want: nil,
wantErr: true,
},
{name: "VISA invalid number length lower than 14",
args: args{number: "4716339239466", cvv: "334", year: 2023, month: 12},
want: nil,
wantErr: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := NewCard(tt.args.number, tt.args.cvv, tt.args.month, tt.args.year)
got, err := NewCard(tt.args.number, tt.args.cvv, tt.args.month, tt.args.year, tt.args.cardHolder)
if (err != nil) != tt.wantErr {
t.Errorf("NewCard() error = %v, wantErr %v", err, tt.wantErr)
return
Expand All @@ -63,3 +77,162 @@ func TestNewCard(t *testing.T) {
})
}
}

func TestCard_Number(t *testing.T) {
tests := []struct {
name string
c *Card
want string
}{
// TODO: Add test cases.
{name: "Test number getter",
c: testCard,
want: "4716339239466898",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.c.Number(); got != tt.want {
t.Errorf("Card.Number() = %v, want %v", got, tt.want)
}
})
}
}

func TestCard_Cvv(t *testing.T) {
tests := []struct {
name string
c *Card
want string
}{
{
name: "Test cvv getter",
c: testCard,
want: "334",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.c.Cvv(); got != tt.want {
t.Errorf("Card.Cvv() = %v, want %v", got, tt.want)
}
})
}
}

func TestCard_Month(t *testing.T) {
tests := []struct {
name string
c *Card
want int
}{
{
name: "Test cvv getter",
c: testCard,
want: 12,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.c.Month(); got != tt.want {
t.Errorf("Card.Month() = %v, want %v", got, tt.want)
}
})
}
}

func TestCard_Year(t *testing.T) {
tests := []struct {
name string
c *Card
want int
}{
{
name: "Test cvv getter",
c: testCard,
want: 2023,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.c.Year(); got != tt.want {
t.Errorf("Card.Year() = %v, want %v", got, tt.want)
}
})
}
}

func TestCard_CardHolder(t *testing.T) {
tests := []struct {
name string
c *Card
want string
}{
{
name: "Test cvv getter",
c: testCard,
want: "Ivanov Ivan",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.c.CardHolder(); got != tt.want {
t.Errorf("Card.CardHolder() = %v, want %v", got, tt.want)
}
})
}
}

func TestCard_MaskedNumber(t *testing.T) {
type args struct {
headlen int
taillen int
}
tests := []struct {
name string
c *Card
args args
want string
}{
// TODO: Add test cases.
{
name: "Test cvv getter",
c: testCard,
args: args{headlen: 6, taillen: 4},
want: "471633******6898",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.c.MaskedNumber(tt.args.headlen, tt.args.taillen); got != tt.want {
t.Errorf("Card.MaskedNumber() = %v, want %v", got, tt.want)
}
})
}
}

func TestCard_Expired(t *testing.T) {
tests := []struct {
name string
c *Card
want bool
}{
{
name: "Test not expired card",
c: testCard,
want: false,
},
{
name: "Test expired card",
c: expiredCard,
want: true,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := tt.c.Expired(); got != tt.want {
t.Errorf("Card.Expired() = %v, want %v", got, tt.want)
}
})
}
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
module forvard.me/octopus/go-card
module github.com/anaximen/go-card

go 1.15
2 changes: 1 addition & 1 deletion luhn.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gocard
package card

// CalculateLuhn return the check number
func CalculateLuhn(digits []int) int {
Expand Down
2 changes: 1 addition & 1 deletion luhn_test.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package gocard
package card

import "testing"

Expand Down

0 comments on commit 45d7f4b

Please sign in to comment.