Added model for alliances.

This commit is contained in:
Patrick Fairbank
2014-05-31 22:16:35 -07:00
parent 3589e05a8b
commit 32aacf0c50
4 changed files with 197 additions and 0 deletions

57
alliance_team.go Normal file
View File

@@ -0,0 +1,57 @@
// Copyright 2014 Team 254. All Rights Reserved.
// Author: pat@patfairbank.com (Patrick Fairbank)
//
// Model and datastore CRUD methods for an alliance-team association.
package main
type AllianceTeam struct {
Id int
AllianceId int
PickPosition int
TeamId int
}
func (database *Database) CreateAllianceTeam(allianceTeam *AllianceTeam) error {
return database.allianceTeamMap.Insert(allianceTeam)
}
func (database *Database) GetTeamsByAlliance(allianceId int) ([]AllianceTeam, error) {
var allianceTeams []AllianceTeam
err := database.allianceTeamMap.Select(&allianceTeams,
"SELECT * FROM alliance_teams WHERE allianceid = ? ORDER BY pickposition", allianceId)
return allianceTeams, err
}
func (database *Database) SaveAllianceTeam(allianceTeam *AllianceTeam) error {
_, err := database.allianceTeamMap.Update(allianceTeam)
return err
}
func (database *Database) DeleteAllianceTeam(allianceTeam *AllianceTeam) error {
_, err := database.allianceTeamMap.Delete(allianceTeam)
return err
}
func (database *Database) TruncateAllianceTeams() error {
return database.allianceTeamMap.TruncateTables()
}
func (database *Database) GetAllAlliances() ([][]AllianceTeam, error) {
alliances := make([][]AllianceTeam, 0)
var allianceTeams []AllianceTeam
err := database.allianceTeamMap.Select(&allianceTeams,
"SELECT * FROM alliance_teams ORDER BY allianceid, pickposition")
if err == nil {
// Format the sorted list of teams into a two-dimensional slice.
currentAllianceId := -1
for _, allianceTeam := range allianceTeams {
if allianceTeam.AllianceId != currentAllianceId {
currentAllianceId = allianceTeam.AllianceId
alliances = append(alliances, make([]AllianceTeam, 0))
}
alliances[len(alliances)-1] = append(alliances[len(alliances)-1], allianceTeam)
}
}
return alliances, err
}

124
alliance_team_test.go Normal file
View File

@@ -0,0 +1,124 @@
// Copyright 2014 Team 254. All Rights Reserved.
// Author: pat@patfairbank.com (Patrick Fairbank)
package main
import (
"github.com/stretchr/testify/assert"
"testing"
)
func TestGetNonexistentAlliance(t *testing.T) {
clearDb()
defer clearDb()
db, err := OpenDatabase(testDbPath)
assert.Nil(t, err)
defer db.Close()
allianceTeams, err := db.GetTeamsByAlliance(1114)
assert.Nil(t, err)
assert.Empty(t, allianceTeams)
}
func TestAllianceTeamCrud(t *testing.T) {
clearDb()
defer clearDb()
db, err := OpenDatabase(testDbPath)
assert.Nil(t, err)
defer db.Close()
allianceTeam := AllianceTeam{0, 1, 0, 254}
db.CreateAllianceTeam(&allianceTeam)
allianceTeams, err := db.GetTeamsByAlliance(1)
assert.Nil(t, err)
assert.Equal(t, 1, len(allianceTeams))
assert.Equal(t, allianceTeam, allianceTeams[0])
allianceTeam.TeamId = 1114
db.SaveAllianceTeam(&allianceTeam)
allianceTeams, err = db.GetTeamsByAlliance(1)
assert.Nil(t, err)
assert.Equal(t, 1, len(allianceTeams))
assert.Equal(t, allianceTeam.TeamId, allianceTeams[0].TeamId)
db.DeleteAllianceTeam(&allianceTeam)
allianceTeams, err = db.GetTeamsByAlliance(1)
assert.Nil(t, err)
assert.Empty(t, allianceTeams)
}
func TestGetTeamsByAlliance(t *testing.T) {
clearDb()
defer clearDb()
db, err := OpenDatabase(testDbPath)
assert.Nil(t, err)
defer db.Close()
buildTestAlliances(db)
allianceTeams, err := db.GetTeamsByAlliance(1)
assert.Nil(t, err)
if assert.Equal(t, 4, len(allianceTeams)) {
assert.Equal(t, 254, allianceTeams[0].TeamId)
assert.Equal(t, 469, allianceTeams[1].TeamId)
assert.Equal(t, 2848, allianceTeams[2].TeamId)
assert.Equal(t, 74, allianceTeams[3].TeamId)
}
allianceTeams, err = db.GetTeamsByAlliance(2)
assert.Nil(t, err)
if assert.Equal(t, 2, len(allianceTeams)) {
assert.Equal(t, 1718, allianceTeams[0].TeamId)
assert.Equal(t, 2451, allianceTeams[1].TeamId)
}
}
func TestTruncateAllianceTeams(t *testing.T) {
clearDb()
defer clearDb()
db, err := OpenDatabase(testDbPath)
assert.Nil(t, err)
defer db.Close()
allianceTeam := AllianceTeam{0, 1, 0, 254}
db.CreateAllianceTeam(&allianceTeam)
db.TruncateAllianceTeams()
allianceTeams, err := db.GetTeamsByAlliance(1)
assert.Nil(t, err)
assert.Empty(t, allianceTeams)
}
func TestGetAllAlliances(t *testing.T) {
clearDb()
defer clearDb()
db, err := OpenDatabase(testDbPath)
assert.Nil(t, err)
defer db.Close()
alliances, err := db.GetAllAlliances()
assert.Nil(t, err)
assert.Empty(t, alliances)
buildTestAlliances(db)
alliances, err = db.GetAllAlliances()
assert.Nil(t, err)
if assert.Equal(t, 2, len(alliances)) {
if assert.Equal(t, 4, len(alliances[0])) {
assert.Equal(t, 254, alliances[0][0].TeamId)
assert.Equal(t, 469, alliances[0][1].TeamId)
assert.Equal(t, 2848, alliances[0][2].TeamId)
assert.Equal(t, 74, alliances[0][3].TeamId)
}
if assert.Equal(t, 2, len(alliances[1])) {
assert.Equal(t, 1718, alliances[1][0].TeamId)
assert.Equal(t, 2451, alliances[1][1].TeamId)
}
}
}
func buildTestAlliances(db *Database) {
db.CreateAllianceTeam(&AllianceTeam{0, 2, 0, 1718})
db.CreateAllianceTeam(&AllianceTeam{0, 1, 3, 74})
db.CreateAllianceTeam(&AllianceTeam{0, 1, 1, 469})
db.CreateAllianceTeam(&AllianceTeam{0, 1, 0, 254})
db.CreateAllianceTeam(&AllianceTeam{0, 1, 2, 2848})
db.CreateAllianceTeam(&AllianceTeam{0, 2, 1, 2451})
}

View File

@@ -22,6 +22,7 @@ type Database struct {
matchResultMap *modl.DbMap
rankingMap *modl.DbMap
teamMap *modl.DbMap
allianceTeamMap *modl.DbMap
}
// Opens the SQLite database at the given path, creating it if it doesn't exist, and runs any pending
@@ -71,4 +72,7 @@ func (database *Database) mapTables() {
database.teamMap = modl.NewDbMap(database.db, dialect)
database.teamMap.AddTableWithName(Team{}, "teams").SetKeys(false, "Id")
database.allianceTeamMap = modl.NewDbMap(database.db, dialect)
database.allianceTeamMap.AddTableWithName(AllianceTeam{}, "alliance_teams").SetKeys(true, "Id")
}

View File

@@ -0,0 +1,12 @@
-- +goose Up
CREATE TABLE alliance_teams (
id INTEGER PRIMARY KEY,
allianceid int,
pickposition int,
teamid int
);
CREATE UNIQUE INDEX alliance_position ON alliance_teams(allianceid, pickposition);
CREATE UNIQUE INDEX team ON alliance_teams(teamid);
-- +goose Down
DROP TABLE alliance_teams;