mirror of
				https://github.com/aclindsa/moneygo.git
				synced 2025-11-04 02:23:26 -05:00 
			
		
		
		
	testing: Add tests for fetching multiple securities
This commit is contained in:
		@@ -34,6 +34,7 @@ var error_codes = map[int]string{
 | 
				
			|||||||
	4: "User Exists",
 | 
						4: "User Exists",
 | 
				
			||||||
	//  5:   "Connection Failed", //reserved for client-side error
 | 
						//  5:   "Connection Failed", //reserved for client-side error
 | 
				
			||||||
	6:   "Import Error",
 | 
						6:   "Import Error",
 | 
				
			||||||
 | 
						7:   "In Use Error",
 | 
				
			||||||
	999: "Internal Error",
 | 
						999: "Internal Error",
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -183,6 +183,14 @@ func UpdateSecurity(db *DB, s *Security) error {
 | 
				
			|||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SecurityInUseError struct {
 | 
				
			||||||
 | 
						message string
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (e SecurityInUseError) Error() string {
 | 
				
			||||||
 | 
						return e.message
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func DeleteSecurity(db *DB, s *Security) error {
 | 
					func DeleteSecurity(db *DB, s *Security) error {
 | 
				
			||||||
	transaction, err := db.Begin()
 | 
						transaction, err := db.Begin()
 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
@@ -194,7 +202,7 @@ func DeleteSecurity(db *DB, s *Security) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if accounts != 0 {
 | 
						if accounts != 0 {
 | 
				
			||||||
		transaction.Rollback()
 | 
							transaction.Rollback()
 | 
				
			||||||
		return errors.New("One or more accounts still use this security")
 | 
							return SecurityInUseError{"One or more accounts still use this security"}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	user, err := GetUserTx(transaction, s.UserId)
 | 
						user, err := GetUserTx(transaction, s.UserId)
 | 
				
			||||||
@@ -203,7 +211,7 @@ func DeleteSecurity(db *DB, s *Security) error {
 | 
				
			|||||||
		return err
 | 
							return err
 | 
				
			||||||
	} else if user.DefaultCurrency == s.SecurityId {
 | 
						} else if user.DefaultCurrency == s.SecurityId {
 | 
				
			||||||
		transaction.Rollback()
 | 
							transaction.Rollback()
 | 
				
			||||||
		return errors.New("Cannot delete security which is user's default currency")
 | 
							return SecurityInUseError{"Cannot delete security which is user's default currency"}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Remove all prices involving this security (either of this security, or
 | 
						// Remove all prices involving this security (either of this security, or
 | 
				
			||||||
@@ -401,7 +409,9 @@ func SecurityHandler(w http.ResponseWriter, r *http.Request, db *DB) {
 | 
				
			|||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			err = DeleteSecurity(db, security)
 | 
								err = DeleteSecurity(db, security)
 | 
				
			||||||
			if err != nil {
 | 
								if _, ok := err.(SecurityInUseError); ok {
 | 
				
			||||||
 | 
									WriteError(w, 7 /*In Use Error*/)
 | 
				
			||||||
 | 
								} else if err != nil {
 | 
				
			||||||
				WriteError(w, 999 /*Internal Error*/)
 | 
									WriteError(w, 999 /*Internal Error*/)
 | 
				
			||||||
				log.Print(err)
 | 
									log.Print(err)
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -22,6 +22,15 @@ func getSecurity(client *http.Client, securityid int64) (*handlers.Security, err
 | 
				
			|||||||
	return &s, nil
 | 
						return &s, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func getSecurities(client *http.Client) (*handlers.SecurityList, error) {
 | 
				
			||||||
 | 
						var sl handlers.SecurityList
 | 
				
			||||||
 | 
						err := read(client, &sl, "/security/", "securities")
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return &sl, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func updateSecurity(client *http.Client, security *handlers.Security) (*handlers.Security, error) {
 | 
					func updateSecurity(client *http.Client, security *handlers.Security) (*handlers.Security, error) {
 | 
				
			||||||
	var s handlers.Security
 | 
						var s handlers.Security
 | 
				
			||||||
	err := update(client, security, &s, "/security/"+strconv.FormatInt(security.SecurityId, 10), "security")
 | 
						err := update(client, security, &s, "/security/"+strconv.FormatInt(security.SecurityId, 10), "security")
 | 
				
			||||||
@@ -41,7 +50,7 @@ func deleteSecurity(client *http.Client, s *handlers.Security) error {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func TestCreateSecurity(t *testing.T) {
 | 
					func TestCreateSecurity(t *testing.T) {
 | 
				
			||||||
	RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
						RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
				
			||||||
		for i := 1; i < len(data[0].securities); i++ {
 | 
							for i := 0; i < len(data[0].securities); i++ {
 | 
				
			||||||
			orig := data[0].securities[i]
 | 
								orig := data[0].securities[i]
 | 
				
			||||||
			s := d.securities[i]
 | 
								s := d.securities[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -72,7 +81,7 @@ func TestCreateSecurity(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func TestGetSecurity(t *testing.T) {
 | 
					func TestGetSecurity(t *testing.T) {
 | 
				
			||||||
	RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
						RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
				
			||||||
		for i := 1; i < len(data[0].securities); i++ {
 | 
							for i := 0; i < len(data[0].securities); i++ {
 | 
				
			||||||
			orig := data[0].securities[i]
 | 
								orig := data[0].securities[i]
 | 
				
			||||||
			curr := d.securities[i]
 | 
								curr := d.securities[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -105,9 +114,59 @@ func TestGetSecurity(t *testing.T) {
 | 
				
			|||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGetSecurities(t *testing.T) {
 | 
				
			||||||
 | 
						RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
				
			||||||
 | 
							sl, err := getSecurities(d.clients[0])
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								t.Fatalf("Error fetching securities: %s\n", err)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							numsecurities := 0
 | 
				
			||||||
 | 
							foundIds := make(map[int64]bool)
 | 
				
			||||||
 | 
							for i := 0; i < len(data[0].securities); i++ {
 | 
				
			||||||
 | 
								orig := data[0].securities[i]
 | 
				
			||||||
 | 
								curr := d.securities[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if curr.UserId != d.users[0].UserId {
 | 
				
			||||||
 | 
									continue
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								numsecurities += 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								found := false
 | 
				
			||||||
 | 
								for _, s := range *sl.Securities {
 | 
				
			||||||
 | 
									if orig.Name == s.Name && orig.Description == s.Description && orig.Symbol == orig.Symbol && orig.Precision == s.Precision && orig.Type == s.Type && orig.AlternateId == s.AlternateId {
 | 
				
			||||||
 | 
										if _, ok := foundIds[s.SecurityId]; ok {
 | 
				
			||||||
 | 
											continue
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										foundIds[s.SecurityId] = true
 | 
				
			||||||
 | 
										found = true
 | 
				
			||||||
 | 
										break
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if !found {
 | 
				
			||||||
 | 
									t.Errorf("Unable to find matching security: %+v", curr)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if numsecurities+1 == len(*sl.Securities) {
 | 
				
			||||||
 | 
								for _, s := range *sl.Securities {
 | 
				
			||||||
 | 
									if _, ok := foundIds[s.SecurityId]; !ok {
 | 
				
			||||||
 | 
										if s.SecurityId == d.users[0].DefaultCurrency {
 | 
				
			||||||
 | 
											t.Fatalf("Extra security wasn't default currency, seems like an extra security was created")
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										break
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else if numsecurities != len(*sl.Securities) {
 | 
				
			||||||
 | 
								t.Errorf("%+v\n", *sl.Securities)
 | 
				
			||||||
 | 
								t.Fatalf("Expected %d securities, received %d", numsecurities, len(*sl.Securities))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestUpdateSecurity(t *testing.T) {
 | 
					func TestUpdateSecurity(t *testing.T) {
 | 
				
			||||||
	RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
						RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
				
			||||||
		for i := 1; i < len(data[0].securities); i++ {
 | 
							for i := 0; i < len(data[0].securities); i++ {
 | 
				
			||||||
			orig := data[0].securities[i]
 | 
								orig := data[0].securities[i]
 | 
				
			||||||
			curr := d.securities[i]
 | 
								curr := d.securities[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -148,10 +207,17 @@ func TestUpdateSecurity(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
func TestDeleteSecurity(t *testing.T) {
 | 
					func TestDeleteSecurity(t *testing.T) {
 | 
				
			||||||
	RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
						RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
				
			||||||
		for i := 1; i < len(data[0].securities); i++ {
 | 
						Outer:
 | 
				
			||||||
 | 
							for i := 0; i < len(data[0].securities); i++ {
 | 
				
			||||||
			orig := data[0].securities[i]
 | 
								orig := data[0].securities[i]
 | 
				
			||||||
			curr := d.securities[i]
 | 
								curr := d.securities[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for _, a := range d.accounts {
 | 
				
			||||||
 | 
									if a.SecurityId == curr.SecurityId {
 | 
				
			||||||
 | 
										continue Outer
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			err := deleteSecurity(d.clients[orig.UserId], &curr)
 | 
								err := deleteSecurity(d.clients[orig.UserId], &curr)
 | 
				
			||||||
			if err != nil {
 | 
								if err != nil {
 | 
				
			||||||
				t.Fatalf("Error deleting security: %s\n", err)
 | 
									t.Fatalf("Error deleting security: %s\n", err)
 | 
				
			||||||
@@ -171,3 +237,31 @@ func TestDeleteSecurity(t *testing.T) {
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestDontDeleteSecurity(t *testing.T) {
 | 
				
			||||||
 | 
						RunWith(t, &data[0], func(t *testing.T, d *TestData) {
 | 
				
			||||||
 | 
						Outer:
 | 
				
			||||||
 | 
							for i := 0; i < len(data[0].securities); i++ {
 | 
				
			||||||
 | 
								orig := data[0].securities[i]
 | 
				
			||||||
 | 
								curr := d.securities[i]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								for _, a := range d.accounts {
 | 
				
			||||||
 | 
									if a.SecurityId != curr.SecurityId {
 | 
				
			||||||
 | 
										continue Outer
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								err := deleteSecurity(d.clients[orig.UserId], &curr)
 | 
				
			||||||
 | 
								if err == nil {
 | 
				
			||||||
 | 
									t.Fatalf("Expected error deleting in-use security")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if herr, ok := err.(*handlers.Error); ok {
 | 
				
			||||||
 | 
									if herr.ErrorId != 7 { // In Use Error
 | 
				
			||||||
 | 
										t.Fatalf("Unexpected API error deleting in-use security: %s", herr)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									t.Fatalf("Unexpected error deleting in-use security")
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user