Skip to content

Commit 7e672e4

Browse files
committed
Started with integration tests for rules
1 parent 95bfbb5 commit 7e672e4

3 files changed

Lines changed: 237 additions & 0 deletions

File tree

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
package de.mygrades;
2+
3+
import android.test.ApplicationTestCase;
4+
5+
import java.util.List;
6+
7+
import de.mygrades.database.dao.Action;
8+
import de.mygrades.database.dao.ActionDao;
9+
import de.mygrades.database.dao.DaoSession;
10+
import de.mygrades.database.dao.GradeEntry;
11+
import de.mygrades.database.dao.GradeEntryDao;
12+
import de.mygrades.database.dao.Overview;
13+
import de.mygrades.database.dao.University;
14+
import de.mygrades.database.dao.UniversityDao;
15+
import de.mygrades.main.processor.GradesProcessor;
16+
import de.mygrades.main.processor.LoginProcessor;
17+
import de.mygrades.main.processor.UniversityProcessor;
18+
import de.mygrades.util.AverageCalculator;
19+
import de.mygrades.util.Config;
20+
21+
/**
22+
* Base class for application tests to test the rules against html fragments.
23+
* Furthermore it tests the correct functionality of the scraper and parser.
24+
*/
25+
public abstract class AbstractRuleTest extends ApplicationTestCase<MyGradesApplication> {
26+
27+
protected GradesProcessor gradesProcessor;
28+
protected LoginProcessor loginProcessor;
29+
protected UniversityProcessor universityProcessor;
30+
protected DaoSession daoSession;
31+
protected AverageCalculator averageCalculator;
32+
33+
protected List<University> universities;
34+
protected List<GradeEntry> gradeEntries;
35+
protected Overview overview;
36+
37+
public AbstractRuleTest() {
38+
super(MyGradesApplication.class);
39+
}
40+
41+
@Override
42+
protected void setUp() throws Exception {
43+
createApplication();
44+
assertNotNull(getContext());
45+
46+
daoSession = ((MyGradesApplication) getContext().getApplicationContext()).getDaoSession();
47+
assertNotNull(daoSession);
48+
daoSession.clear();
49+
daoSession.getGradeEntryDao().deleteAll();
50+
51+
universityProcessor = new UniversityProcessor(getContext());
52+
assertNotNull(universityProcessor);
53+
54+
loginProcessor = new LoginProcessor(getContext());
55+
assertNotNull(loginProcessor);
56+
57+
gradesProcessor = new GradesProcessor(getContext());
58+
assertNotNull(gradesProcessor);
59+
60+
universityProcessor.getUniversities(true);
61+
getUniversitiesFromDatabase();
62+
63+
super.setUp(); // should be on top actually, but then the test is flaky :/
64+
}
65+
66+
@Override
67+
protected void tearDown() throws Exception {
68+
loginProcessor.logout();
69+
loginProcessor = null;
70+
universities = null;
71+
gradesProcessor = null;
72+
loginProcessor = null;
73+
daoSession = null;
74+
averageCalculator = null;
75+
gradeEntries = null;
76+
overview = null;
77+
super.tearDown();
78+
}
79+
80+
private void getUniversitiesFromDatabase() {
81+
UniversityDao universityDao = daoSession.getUniversityDao();
82+
universities = universityDao.queryBuilder()
83+
.where(UniversityDao.Properties.Published.eq(true))
84+
.list();
85+
}
86+
87+
private University getUniversityByName(String name) {
88+
for (University u : universities) {
89+
if (u.getName().toLowerCase().contains(name.toLowerCase())) {
90+
return u;
91+
}
92+
}
93+
return null;
94+
}
95+
96+
protected void scrape(String universityName, String url, int ruleIndex) {
97+
scrape(universityName, url, "", "", ruleIndex);
98+
}
99+
100+
protected void scrape(String universityName, String url, String username, String password, int ruleIndex) {
101+
University university = getUniversityByName(universityName);
102+
assertNotNull(university);
103+
long universityId = university.getUniversityId();
104+
long ruleId = university.getRules().get(ruleIndex).getRuleId(); // TODO: sort rules or get rule by name
105+
universityProcessor.getDetailedUniversity(universityId);
106+
overwriteUrl(ruleId, url);
107+
loginProcessor.loginAndScrapeForGrades(username, password, universityId, ruleId);
108+
gradeEntries = daoSession.getGradeEntryDao().loadAll();
109+
averageCalculator = new AverageCalculator(false);
110+
averageCalculator.calculateFromGradeEntries(gradeEntries);
111+
}
112+
113+
protected void scrapeForOverview(String examId) {
114+
GradeEntry gradeEntry = daoSession.getGradeEntryDao().queryBuilder()
115+
.where(GradeEntryDao.Properties.ExamId.eq(examId)).build().unique();
116+
assertNotNull(gradeEntry);
117+
String gradeHash = gradeEntry.getHash();
118+
gradesProcessor.scrapeForOverview(gradeHash);
119+
gradeEntry.refresh();
120+
overview = gradeEntry.getOverview();
121+
assertNotNull(overview);
122+
}
123+
124+
private void overwriteUrl(long ruleId, String url) {
125+
Action action = daoSession.getActionDao().queryBuilder()
126+
.where(ActionDao.Properties.RuleId.eq(ruleId))
127+
.where(ActionDao.Properties.Position.eq(0))
128+
.build().unique();
129+
assertNotNull(action);
130+
action.setUrl(Config.getTestServerUrl() + url);
131+
action.update();
132+
}
133+
}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package de.mygrades;
2+
3+
/**
4+
* Application test to test the rules against html fragments.
5+
* Furthermore it tests the correct functionality of the scraper and parser.
6+
*/
7+
public class RuleTest extends AbstractRuleTest {
8+
9+
/**
10+
* Test first rule for FernUni in Hagen.
11+
*/
12+
public void testFernuniHagenFirstRule() {
13+
scrape("FernUniversität in Hagen", "fernunihagen/1/1.html", 0);
14+
assertTrue(gradeEntries.size() > 0);
15+
}
16+
17+
/**
18+
* Test second rule for FernUni in Hagen.
19+
*/
20+
public void testFernuniHagenSecondRule() {
21+
scrape("FernUniversität in Hagen", "fernunihagen/2/1.html", 1);
22+
assertTrue(gradeEntries.size() > 0);
23+
}
24+
25+
/**
26+
* Test rule for Fachhochschule Aachen.
27+
*/
28+
public void testFhAachen() {
29+
scrape("Fachhochschule Aachen", "fhaachen/1.html", 0);
30+
assertTrue(gradeEntries.size() > 0);
31+
}
32+
33+
/**
34+
* Test rule for Hochschule Mainz with super broken markup.
35+
*/
36+
public void testHsMainz1() {
37+
scrape("Hochschule Mainz", "hsmainz/1/1.html", 0);
38+
assertEquals(5, gradeEntries.size());
39+
}
40+
41+
/**
42+
* Test rule for Hochschule Mainz.
43+
*/
44+
public void testHsMainz2() {
45+
scrape("Hochschule Mainz", "hsmainz/2/1.html", 0);
46+
assertTrue(gradeEntries.size() > 0);
47+
}
48+
49+
/**
50+
* Test rule for Hochschule RheinMain.
51+
*/
52+
public void testHsrm() {
53+
scrape("Hochschule RheinMain", "hsrm/1.html", 0);
54+
assertEquals(44, gradeEntries.size());
55+
assertEquals(1.64f, averageCalculator.getAverage(), 0.01f);
56+
assertEquals(165.0, averageCalculator.getCreditPointsSum(), 0.00001d);
57+
58+
scrapeForOverview("1111");
59+
assertEquals(44, (int) overview.getParticipants());
60+
assertEquals(3.0d, overview.getAverage());
61+
}
62+
63+
/**
64+
* Test rule for TU Clausthal.
65+
*/
66+
public void testTuClausthal() {
67+
scrape("Clausthal", "tuclausthal/1.html", 0);
68+
assertTrue(gradeEntries.size() > 0);
69+
}
70+
71+
/**
72+
* Test rule for Uni Bonn.
73+
*/
74+
public void testUniBonn() {
75+
scrape("Universität Bonn", "unibonn/1.html", 0);
76+
assertTrue(gradeEntries.size() > 0);
77+
}
78+
79+
/**
80+
* Test rule for Goethe-Uni Frankfurt.
81+
*/
82+
public void testUniFrankfurt() {
83+
scrape("Goethe-Universität", "unifrankfurt/1.html", 0);
84+
assertTrue(gradeEntries.size() > 0);
85+
}
86+
}

app/src/main/java/de/mygrades/util/ConfigDefault.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,4 +56,22 @@ public static String getSecurePreferencesKey() {
5656
public static String getPlayStorePublicKey() {
5757
return null; // must be implemented in Config.java
5858
}
59+
60+
/**
61+
* Get the url for the test server.
62+
*
63+
* @return test server url as String.
64+
*/
65+
public static String getTestServerUrl() {
66+
return null;
67+
}
68+
69+
/**
70+
* Get the credentials for the test server.
71+
*
72+
* @return credentials as String.
73+
*/
74+
public static String getTestServerCredentials() {
75+
return null;
76+
}
5977
}

0 commit comments

Comments
 (0)