From 32aacf0c5072d3e924945906776d209460ab1b5d Mon Sep 17 00:00:00 2001 From: Patrick Fairbank Date: Sat, 31 May 2014 22:16:35 -0700 Subject: [PATCH] Added model for alliances. --- alliance_team.go | 57 ++++++++ alliance_team_test.go | 124 ++++++++++++++++++ database.go | 4 + .../20140531205700_CreateAllianceTeams.sql | 12 ++ 4 files changed, 197 insertions(+) create mode 100644 alliance_team.go create mode 100644 alliance_team_test.go create mode 100644 db/migrations/20140531205700_CreateAllianceTeams.sql diff --git a/alliance_team.go b/alliance_team.go new file mode 100644 index 0000000..9177d60 --- /dev/null +++ b/alliance_team.go @@ -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 +} diff --git a/alliance_team_test.go b/alliance_team_test.go new file mode 100644 index 0000000..8c37595 --- /dev/null +++ b/alliance_team_test.go @@ -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}) +} diff --git a/database.go b/database.go index 8d83781..7f7d6f8 100644 --- a/database.go +++ b/database.go @@ -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") } diff --git a/db/migrations/20140531205700_CreateAllianceTeams.sql b/db/migrations/20140531205700_CreateAllianceTeams.sql new file mode 100644 index 0000000..8ff524c --- /dev/null +++ b/db/migrations/20140531205700_CreateAllianceTeams.sql @@ -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;