Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom-dependency-tree.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
ai.elimu:webapp:war:2.6.78-SNAPSHOT
ai.elimu:webapp:war:2.6.79-SNAPSHOT
+- ai.elimu:model:jar:model-2.0.114:compile
| \- com.google.code.gson:gson:jar:2.13.1:compile
| \- com.google.errorprone:error_prone_annotations:jar:2.38.0:compile
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand Down Expand Up @@ -86,6 +87,7 @@ public void handleRequest(
outputStream.close();
} catch (Exception ex) {
log.error(ex.getMessage());
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
DiscordHelper.postToChannel(Channel.ANALYTICS, "Error during CSV export of letter-sound learning events: `" + ex.getClass() + ": " + ex.getMessage() + "`");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand Down Expand Up @@ -88,6 +89,7 @@ public void handleRequest(
outputStream.close();
} catch (Exception ex) {
log.error(ex.getMessage());
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
DiscordHelper.postToChannel(Channel.ANALYTICS, "Error during CSV export of number learning events: `" + ex.getClass() + ": " + ex.getMessage() + "`");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand Down Expand Up @@ -90,6 +91,7 @@ public void handleRequest(
outputStream.close();
} catch (Exception ex) {
log.error(ex.getMessage());
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
DiscordHelper.postToChannel(Channel.ANALYTICS, "Error during CSV export of storybook learning events: `" + ex.getClass() + ": " + ex.getMessage() + "`");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand Down Expand Up @@ -91,6 +92,7 @@ public void handleRequest(
outputStream.close();
} catch (Exception ex) {
log.error(ex.getMessage());
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
DiscordHelper.postToChannel(Channel.ANALYTICS, "Error during CSV export of video learning events: `" + ex.getClass() + ": " + ex.getMessage() + "`");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand Down Expand Up @@ -88,6 +89,7 @@ public void handleRequest(
outputStream.close();
} catch (Exception ex) {
log.error(ex.getMessage());
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
DiscordHelper.postToChannel(Channel.ANALYTICS, "Error during CSV export of word assessment events: `" + ex.getClass() + ": " + ex.getMessage() + "`");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVPrinter;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand Down Expand Up @@ -87,6 +88,7 @@ public void handleRequest(
outputStream.close();
} catch (Exception ex) {
log.error(ex.getMessage());
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
DiscordHelper.postToChannel(Channel.ANALYTICS, "Error during CSV export of word learning events: `" + ex.getClass() + ": " + ex.getMessage() + "`");
}
}
Expand Down
30 changes: 20 additions & 10 deletions src/main/java/ai/elimu/web/servlet/CustomDispatcherServlet.java
Original file line number Diff line number Diff line change
Expand Up @@ -385,8 +385,10 @@ private void populateDatabase(WebApplicationContext webApplicationContext) {
wordAssessmentEvent.setTimestamp(week);
wordAssessmentEvent.setAndroidId(student.getAndroidId());
wordAssessmentEvent.setPackageName("ai.elimu.kukariri");
wordAssessmentEvent.setResearchExperiment(ResearchExperiment.EXP_0_WORD_EMOJIS);
wordAssessmentEvent.setExperimentGroup(ExperimentGroup.values()[(int) (Math.random() * 2)]);
if (weekCount > 26) {
wordAssessmentEvent.setResearchExperiment(ResearchExperiment.EXP_0_WORD_EMOJIS);
wordAssessmentEvent.setExperimentGroup(ExperimentGroup.values()[(int) (Math.random() * 2)]);
}
wordAssessmentEvent.setWordText(wordMAA.getText());
wordAssessmentEvent.setWordId(wordMAA.getId());
wordAssessmentEvent.setMasteryScore((float) (int) (Math.random() * 2));
Expand All @@ -400,8 +402,10 @@ private void populateDatabase(WebApplicationContext webApplicationContext) {
wordLearningEvent.setTimestamp(week);
wordLearningEvent.setAndroidId(student.getAndroidId());
wordLearningEvent.setPackageName("ai.elimu.maneno");
wordLearningEvent.setResearchExperiment(ResearchExperiment.EXP_0_WORD_EMOJIS);
wordLearningEvent.setExperimentGroup(ExperimentGroup.values()[(int) (Math.random() * 2)]);
if (weekCount > 13) {
wordLearningEvent.setResearchExperiment(ResearchExperiment.EXP_0_WORD_EMOJIS);
wordLearningEvent.setExperimentGroup(ExperimentGroup.values()[(int) (Math.random() * 2)]);
}
if (Math.random() > 0.5) {
wordLearningEvent.setWordText(wordMAA.getText());
wordLearningEvent.setWordId(wordMAA.getId());
Expand All @@ -419,8 +423,10 @@ private void populateDatabase(WebApplicationContext webApplicationContext) {
numberLearningEvent.setTimestamp(week);
numberLearningEvent.setAndroidId(student.getAndroidId());
numberLearningEvent.setPackageName("ai.elimu.calculator");
numberLearningEvent.setResearchExperiment(ResearchExperiment.EXP_0_WORD_EMOJIS);
numberLearningEvent.setExperimentGroup(ExperimentGroup.values()[(int) (Math.random() * 2)]);
if (weekCount > 13) {
numberLearningEvent.setResearchExperiment(ResearchExperiment.EXP_0_WORD_EMOJIS);
numberLearningEvent.setExperimentGroup(ExperimentGroup.values()[(int) (Math.random() * 2)]);
}
numberLearningEvent.setNumberValue(number3.getValue());
numberLearningEvent.setNumberSymbol(number3.getSymbol());
numberLearningEvent.setNumberId(number3.getId());
Expand All @@ -434,8 +440,10 @@ private void populateDatabase(WebApplicationContext webApplicationContext) {
storyBookLearningEvent.setTimestamp(week);
storyBookLearningEvent.setAndroidId(student.getAndroidId());
storyBookLearningEvent.setPackageName("ai.elimu.vitabu");
storyBookLearningEvent.setResearchExperiment(ResearchExperiment.EXP_0_WORD_EMOJIS);
storyBookLearningEvent.setExperimentGroup(ExperimentGroup.values()[(int) (Math.random() * 2)]);
if (weekCount > 13) {
storyBookLearningEvent.setResearchExperiment(ResearchExperiment.EXP_0_WORD_EMOJIS);
storyBookLearningEvent.setExperimentGroup(ExperimentGroup.values()[(int) (Math.random() * 2)]);
}
storyBookLearningEvent.setLearningEventType(LearningEventType.STORYBOOK_OPENED);
JSONObject additionalData = new JSONObject();
if (storyBookLearningEvent.getExperimentGroup() == ExperimentGroup.CONTROL) {
Expand All @@ -456,8 +464,10 @@ private void populateDatabase(WebApplicationContext webApplicationContext) {
videoLearningEvent.setTimestamp(week);
videoLearningEvent.setAndroidId(student.getAndroidId());
videoLearningEvent.setPackageName("ai.elimu.filamu");
videoLearningEvent.setResearchExperiment(ResearchExperiment.EXP_0_WORD_EMOJIS);
videoLearningEvent.setExperimentGroup(ExperimentGroup.values()[(int) (Math.random() * 2)]);
if (weekCount > 13) {
videoLearningEvent.setResearchExperiment(ResearchExperiment.EXP_0_WORD_EMOJIS);
videoLearningEvent.setExperimentGroup(ExperimentGroup.values()[(int) (Math.random() * 2)]);
}
videoLearningEvent.setVideoTitle(video.getTitle());
videoLearningEvent.setVideoId(video.getId());
videoLearningEvent.setLearningEventType(LearningEventType.VIDEO_OPENED);
Expand Down
18 changes: 18 additions & 0 deletions src/test/java/selenium/analytics/students/StudentPage.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package selenium.analytics.students;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

public class StudentPage {

Expand All @@ -12,4 +15,19 @@ public StudentPage(WebDriver driver) {

driver.findElement(By.id("studentPage"));
}

public String getLetterSoundAssessmentEventsUrl() {
WebElement exportToCsvButton = driver.findElement(By.id("exportLetterSoundAssessmentEventsToCsvButton"));
return exportToCsvButton.getAttribute("href");
}

public String getLetterSoundLearningEventsUrl() {
WebElement exportToCsvButton = driver.findElement(By.id("exportLetterSoundLearningEventsToCsvButton"));
return exportToCsvButton.getAttribute("href");
}

public String getWordLearningEventsUrl() {
WebElement exportToCsvButton = driver.findElement(By.id("exportWordLearningEventsToCsvButton"));
return exportToCsvButton.getAttribute("href");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import org.openqa.selenium.chrome.ChromeOptions;

import lombok.extern.slf4j.Slf4j;
import selenium.content.MainContentPage;
import selenium.util.DomainHelper;

@Slf4j
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package selenium.analytics.students.csv;

import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import kong.unirest.core.HttpResponse;
import kong.unirest.core.Unirest;
import lombok.extern.slf4j.Slf4j;
import selenium.analytics.students.StudentListPage;
import selenium.analytics.students.StudentPage;
import selenium.util.DomainHelper;

@Slf4j
public class StudentCsvExportTest {

private WebDriver driver;

@BeforeEach
public void setUp() {
log.info("setUp");

ChromeOptions chromeOptions = new ChromeOptions();

// Read "headless" property set on the command line:
// mvn clean verify -P regression-test-ui -D headless=true
String headlessSystemProperty = System.getProperty("headless");
log.info("headlessSystemProperty: \"" + headlessSystemProperty + "\"");
if ("true".equals(headlessSystemProperty)) {
chromeOptions.addArguments("headless");
}

driver = new ChromeDriver(chromeOptions);

driver.get(DomainHelper.getBaseUrl() + "/analytics/students");
log.info("driver.getCurrentUrl(): " + driver.getCurrentUrl());
}

@AfterEach
public void tearDown() {
log.info("tearDown");

driver.quit();
}

@Test
public void testExportCsv_LetterSoundAssessmentEvents() {
log.info("testExportCsv_LetterSoundAssessmentEvents");

StudentListPage studentListPage = new StudentListPage(driver);
studentListPage.pressRandomStudent();
log.info("driver.getCurrentUrl(): " + driver.getCurrentUrl());

StudentPage studentPage = new StudentPage(driver);

String fileUrl = studentPage.getLetterSoundAssessmentEventsUrl();
log.info("fileUrl: " + fileUrl);
HttpResponse<String> getResponse = Unirest.get(fileUrl).asString();
log.info("getResponse.getStatus(): " + getResponse.getStatus());
log.info("getResponse.isSuccess(): " + getResponse.isSuccess());
assertTrue(getResponse.isSuccess());
}

@Test
public void testExportCsv_LetterSoundLearningEvents() {
log.info("testExportCsv_LetterSoundLearningEvents");

StudentListPage studentListPage = new StudentListPage(driver);
studentListPage.pressRandomStudent();
log.info("driver.getCurrentUrl(): " + driver.getCurrentUrl());

StudentPage studentPage = new StudentPage(driver);

String fileUrl = studentPage.getLetterSoundLearningEventsUrl();
log.info("fileUrl: " + fileUrl);
HttpResponse<String> getResponse = Unirest.get(fileUrl).asString();
log.info("getResponse.getStatus(): " + getResponse.getStatus());
log.info("getResponse.isSuccess(): " + getResponse.isSuccess());
assertTrue(getResponse.isSuccess());
}

@Test
public void testExportCsv_WordLearningEvents() {
log.info("testExportCsv_WordLearningEvents");

StudentListPage studentListPage = new StudentListPage(driver);
studentListPage.pressRandomStudent();
log.info("driver.getCurrentUrl(): " + driver.getCurrentUrl());

StudentPage studentPage = new StudentPage(driver);

String fileUrl = studentPage.getWordLearningEventsUrl();
log.info("fileUrl: " + fileUrl);
HttpResponse<String> getResponse = Unirest.get(fileUrl).asString();
log.info("getResponse.getStatus(): " + getResponse.getStatus());
log.info("getResponse.isSuccess(): " + getResponse.isSuccess());
assertTrue(getResponse.isSuccess());
}
}
Loading