package module

import (
	"sort"
	"testing"

	"github.com/stretchr/testify/suite"
)

func TestModuleIntSuite(t *testing.T) {
	suite.Run(t, new(TestSuite))
}

type TestSuite struct {
	suite.Suite
}

func (s TestSuite) TestAssertNoForgottenModules() {
	m := Manager{
		Modules: map[string]AppModule{"a": nil, "b": nil},
	}
	tcs := []struct {
		name     string
		positive bool
		modules  []string
	}{
		{"same modules", true, []string{"a", "b"}},
		{"more modules", true, []string{"a", "b", "c"}},
	}

	for _, tc := range tcs {
		if tc.positive {
			m.assertNoForgottenModules("x", tc.modules)
		} else {
			s.Panics(func() { m.assertNoForgottenModules("x", tc.modules) })
		}
	}
}

func (s TestSuite) TestModuleNames() {
	m := Manager{
		Modules: map[string]AppModule{"a": nil, "b": nil},
	}
	ms := m.ModuleNames()
	sort.Strings(ms)
	s.Require().Equal([]string{"a", "b"}, ms)
}

func (s TestSuite) TestDefaultMigrationsOrder() {
	require := s.Require()
	require.Equal(
		[]string{"auth2", "d", "z", "auth"},
		DefaultMigrationsOrder([]string{"d", "auth", "auth2", "z"}), "alphabetical, but auth should be last")
	require.Equal(
		[]string{"auth2", "d", "z"},
		DefaultMigrationsOrder([]string{"d", "auth2", "z"}), "alphabetical")
}
