Feat: [AA-950] Streak discount productization (#623)

- Remove Jira tag from StreakCelebrationCouponEnabled prop
- Remove "experiment" from streak discount vars
- Cleaned up warning in unit test
- Added mock function for closeStreakCelebration
- Set End Date to 2 weeks from current date
- Updated unit tests
- Fixed naming issues
- Added official coupon code
- Cast isStreakCelebrationOpen to boolean

Co-authored-by: cdeery <cdeery@edx.edu>
This commit is contained in:
Chris Deery
2021-09-01 12:21:43 -04:00
committed by GitHub
parent 04cc668e9b
commit fda9ab6bce
6 changed files with 26 additions and 24 deletions

View File

@@ -62,7 +62,7 @@ describe('Course Home Service', () => {
celebrations: like({
first_section: false,
streak_length_to_celebrate: null,
streak_discount_experiment_enabled: false,
streak_discount_enabled: false,
}),
course_access: {
has_access: boolean(true),
@@ -110,7 +110,7 @@ describe('Course Home Service', () => {
celebrations: {
firstSection: false,
streakLengthToCelebrate: null,
streakDiscountExperimentEnabled: false,
streakDiscountEnabled: false,
},
courseAccess: {
hasAccess: true,

View File

@@ -201,7 +201,7 @@ describe('Courseware Service', () => {
celebrations: {
first_section: boolean(false),
streak_length_to_celebrate: null,
streak_discount_experiment_enabled: boolean(false),
streak_discount_enabled: boolean(false),
},
user_has_passing_grade: boolean(false),
course_exit_page_is_active: boolean(false),
@@ -279,7 +279,7 @@ describe('Courseware Service', () => {
celebrations: {
firstSection: false,
streakLengthToCelebrate: null,
streakDiscountExperimentEnabled: false,
streakDiscountEnabled: false,
},
userHasPassingGrade: false,
courseExitPageIsActive: false,

View File

@@ -31,7 +31,7 @@
"celebrations": {
"first_section": false,
"streak_length_to_celebrate": null,
"streak_discount_experiment_enabled": false
"streak_discount_enabled": false
},
"course_access": {
"has_access": true,
@@ -298,7 +298,7 @@
"celebrations": {
"first_section": false,
"streak_length_to_celebrate": null,
"streak_discount_experiment_enabled": false
"streak_discount_enabled": false
},
"user_has_passing_grade": false,
"course_exit_page_is_active": false,
@@ -434,7 +434,7 @@
"$.body.celebrations.first_section": {
"match": "type"
},
"$.body.celebrations.streak_discount_experiment_enabled": {
"$.body.celebrations.streak_discount_enabled": {
"match": "type"
},
"$.body.user_has_passing_grade": {
@@ -637,4 +637,4 @@
"version": "2.0.0"
}
}
}
}

View File

@@ -43,7 +43,7 @@ function getRandomFactoid(intl, streakLength) {
function StreakModal({
courseId, metadataModel, streakLengthToCelebrate, intl, isStreakCelebrationOpen,
closeStreakCelebration, AA759ExperimentEnabled, verifiedMode, ...rest
closeStreakCelebration, StreakDiscountCouponEnabled, verifiedMode, ...rest
}) {
if (!isStreakCelebrationOpen) {
return null;
@@ -82,7 +82,7 @@ function StreakModal({
let offer;
if (verifiedMode) {
upgradeUrl = `${verifiedMode.upgradeUrl}&code=3DayStreak`;
upgradeUrl = `${verifiedMode.upgradeUrl}&code=ZGY11119949`;
mode = {
currencySymbol: verifiedMode.currencySymbol,
price: verifiedMode.price,
@@ -125,7 +125,7 @@ function StreakModal({
<img src={StreakDesktopImage} alt="" className="img-fluid" />
</OnDesktop>
</p>
{ !AA759ExperimentEnabled && (
{ !StreakDiscountCouponEnabled && (
<div className="d-flex py-3 bg-light-300">
<Icon className="col-small ml-3" src={Lightbulb} />
<div className="col-11 factoid-wrapper">
@@ -133,7 +133,7 @@ function StreakModal({
</div>
</div>
)}
{ AA759ExperimentEnabled && (
{ StreakDiscountCouponEnabled && (
<Alert variant="success" className="px-0">
<div className="d-flex">
<Icon className="col-small ml-3 text-success-500" src={MoneyFilled} />
@@ -141,10 +141,10 @@ function StreakModal({
<b>{intl.formatMessage(messages.congratulations)}</b>
&nbsp;{intl.formatMessage(messages.streakDiscountMessage)}&nbsp;
<FormattedMessage
id="learning.streakCelebration.streakAA759EndDateMessage"
id="learning.streakCelebration.streakCelebrationCouponEndDateMessage"
defaultMessage="Ends {date}."
values={{
date: new Date('2021-7-20 00:00').toLocaleDateString({ timeZone: 'UTC' }),
date: new Date(Date.now() + 14 * 24 * 60 * 60 * 1000).toLocaleDateString({ timeZone: 'UTC' }),
}}
/>
</div>
@@ -153,7 +153,7 @@ function StreakModal({
)}
</ModalDialog.Body>
<ModalDialog.Footer className="modal-footer d-block">
{ AA759ExperimentEnabled && (
{ StreakDiscountCouponEnabled && (
<>
<OnMobile>
<UpgradeNowButton
@@ -180,7 +180,7 @@ function StreakModal({
</OnDesktop>
</>
)}
{ !AA759ExperimentEnabled && (
{ !StreakDiscountCouponEnabled && (
<ModalDialog.CloseButton className="px-5" variant="primary"><CloseText /></ModalDialog.CloseButton>
)}
</ModalDialog.Footer>
@@ -192,7 +192,7 @@ StreakModal.defaultProps = {
isStreakCelebrationOpen: false,
streakLengthToCelebrate: -1,
verifiedMode: {},
AA759ExperimentEnabled: false,
StreakDiscountCouponEnabled: false,
};
StreakModal.propTypes = {
@@ -202,7 +202,7 @@ StreakModal.propTypes = {
intl: intlShape.isRequired,
isStreakCelebrationOpen: PropTypes.bool,
closeStreakCelebration: PropTypes.func.isRequired,
AA759ExperimentEnabled: PropTypes.bool,
StreakDiscountCouponEnabled: PropTypes.bool,
verifiedMode: PropTypes.shape({
currencySymbol: PropTypes.string,
price: PropTypes.number,

View File

@@ -18,6 +18,7 @@ describe('Loaded Tab Page', () => {
const courseMetadata = Factory.build('courseMetadata', { celebrations: { streakLengthToCelebrate: 3 } });
mockData.courseId = courseMetadata.id;
mockData.verifiedMode = courseMetadata.verifiedMode;
mockData.closeStreakCelebration = jest.fn();
const testStore = await initializeTestStore({ courseMetadata }, false);
render(<StreakModal {...mockData} courseId={courseMetadata.id} />, { store: testStore });
@@ -31,7 +32,7 @@ describe('Loaded Tab Page', () => {
});
});
it('shows streak celebration modal AA-759 experiment', async () => {
it('shows streak celebration discount modal', async () => {
Object.defineProperty(window, 'matchMedia', {
writable: true,
value: jest.fn().mockImplementation(query => {
@@ -51,11 +52,12 @@ describe('Loaded Tab Page', () => {
const courseMetadata = Factory.build('courseMetadata', { celebrations: { shouldCelebrateStreak: 3 } });
mockData.courseId = courseMetadata.id;
mockData.verifiedMode = courseMetadata.verifiedMode;
mockData.AA759ExperimentEnabled = true;
mockData.StreakDiscountCouponEnabled = true;
const testStore = await initializeTestStore({ courseMetadata }, false);
render(<StreakModal {...mockData} courseId={courseMetadata.id} />, { store: testStore });
const endDateText = `Ends ${new Date(Date.now() + 14 * 24 * 60 * 60 * 1000).toLocaleDateString({ timeZone: 'UTC' })}.`;
expect(screen.getByText('Youve unlocked a 15% off discount when you upgrade this course for a limited time only.')).toBeInTheDocument();
expect(screen.getByText('Ends 7/20/2021.')).toBeInTheDocument();
expect(screen.getByText(endDateText)).toBeInTheDocument();
expect(screen.getByText('Continue with course')).toBeInTheDocument();
});
});

View File

@@ -37,7 +37,7 @@ function LoadedTabPage({
const activeTab = tabs.filter(tab => tab.slug === activeTabSlug)[0];
const streakLengthToCelebrate = celebrations && celebrations.streakLengthToCelebrate;
const AA759ExperimentEnabled = celebrations && celebrations.streakDiscountExperimentEnabled && verifiedMode;
const StreakDiscountCouponEnabled = celebrations && celebrations.streakDiscountEnabled && verifiedMode;
const [isStreakCelebrationOpen,, closeStreakCelebration] = useToggle(streakLengthToCelebrate);
return (
@@ -56,9 +56,9 @@ function LoadedTabPage({
courseId={courseId}
metadataModel={metadataModel}
streakLengthToCelebrate={streakLengthToCelebrate}
isStreakCelebrationOpen={isStreakCelebrationOpen}
isStreakCelebrationOpen={!!isStreakCelebrationOpen}
closeStreakCelebration={closeStreakCelebration}
AA759ExperimentEnabled={AA759ExperimentEnabled}
StreakDiscountCouponEnabled={StreakDiscountCouponEnabled}
verifiedMode={verifiedMode}
/>
<main id="main-content" className="d-flex flex-column flex-grow-1">