WikiEducationFoundation/WikiEduDashboard

View on GitHub
test/utils/course_utils.spec.js

Summary

Maintainability
F
1 wk
Test Coverage
import '../testHelper';
import courseUtils from '../../app/assets/javascripts/utils/course_utils.js';

describe('courseUtils.generateTempId', () => {
  test('creates a slug from term, title and school', () => {
    const course = {
      term: 'Fall 2015',
      school: 'University of Wikipedia',
      title: 'Introduction to Editing'
    };
    const slug = courseUtils.generateTempId(course);
    expect(slug).toBe('University_of_Wikipedia/Introduction_to_Editing_(Fall_2015)');
  });

  test('trims unnecessary whitespace', () => {
    const course = {
      term: ' Fall 2015',
      school: '   University of Wikipedia ', // includes a non-breaking space
      title: ' Introduction to Editing     '
    };
    const slug = courseUtils.generateTempId(course);
    expect(slug).toBe('University_of_Wikipedia/Introduction_to_Editing_(Fall_2015)');
  });

  test('collapses multiple whiltespaces into one space', () => {
    const course = {
      term: 'Fall    2015',
      school: ' University    of   Wikipedia            ',
      title: '          Introduction     to         Editing          '
    };
    const slug = courseUtils.generateTempId(course);
    expect(slug).toBe('University_of_Wikipedia/Introduction_to_Editing_(Fall_2015)');
  });

  test('creates a slug from title and school when term is empty', () => {
    const course = {
      school: ' University of Wikipedia',
      title: 'Introduction to Editing'
    };
    const slug = courseUtils.generateTempId(course);
    expect(slug).toBe('University_of_Wikipedia/Introduction_to_Editing');
  });
});

describe('CourseUtils.courseSlugRegex', () => {
  test('returns a regex that validates course slug', () => {
    const courseSlugRegex = courseUtils.courseSlugRegex();
    expect(courseSlugRegex.test(' 維基醫學專案 ')).toBe(true);
    expect(courseSlugRegex.test(' North-Cap University')).toBe(true);
    expect(courseSlugRegex.test(' مركز حملة')).toBe(true);
    expect(courseSlugRegex.test('UW, Bothell')).toBe(true);
    expect(courseSlugRegex.test('वसंत 2017')).toBe(true);
    expect(courseSlugRegex.test('  ')).toBe(false);
    expect(courseSlugRegex.test('')).toBe(false);
    expect(courseSlugRegex.test('Washington University in St. Louis')).toBe(true);
  });
});

describe('courseUtils.cleanupCourseSlugComponents', () => {
  test(
    'trims whitespace and collapses multispaces from the slug-related fields of a course object',
    () => {
      const course = {
        term: ' Fall      2015',
        school: '   University          of       Wikipedia ',
        title: '   Introduction      to      Editing     '
      };
      const cleanedCourse = courseUtils.cleanupCourseSlugComponents(course);
      expect(cleanedCourse.term).toBe('Fall 2015');
      expect(cleanedCourse.school).toBe('University of Wikipedia');
      expect(cleanedCourse.title).toBe('Introduction to Editing');
    }
  );
});

describe('courseUtils.i18n', () => {
  test('outputs an interface message based on a message key and prefix', () => {
    const message = courseUtils.i18n('students', 'courses_generic');
    expect(message).toBe('Editors');
  });

  test('defaults to the "courses" prefix if prefix is null', () => {
    const message = courseUtils.i18n('students', null);
    expect(message).toBe('Students');
  });

  test('takes an optional fallback prefix for if prefix is null', () => {
    const message = courseUtils.i18n('class', null, 'revisions');
    expect(message).toBe('Class');
  });
});

describe('courseUtils.articleFromTitleInput', () => {
  test('replaces underscores', () => {
    const input = 'Robot_selfie';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Robot selfie');
  });

  test('converts Wikipedia urls into titles', () => {
    const input = 'https://en.wikipedia.org/wiki/Robot_selfie';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Robot selfie');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('en');
    expect(output.article_url).toBe(input);
  });

  test('handles mobile urls correctly', () => {
    const input = 'https://en.m.wikipedia.org/wiki/Robot_selfie';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Robot selfie');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('en');
    expect(output.article_url).toBe(input);
  });

  test("correctly parses multilingual wikisource url's", () => {
    const input = 'https://wikisource.org/wiki/Heyder_Cansa';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Heyder Cansa');
    expect(output.project).toBe('wikisource');
    expect(output.language).toBe('www');
    expect(output.article_url).toBe(input);
  });

  test('correctly parses the wikimedia incubator url', () => {
    const input = 'https://incubator.wikimedia.org/wiki/Wp/kiu/Heyder_Cansa';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Wp/kiu/Heyder Cansa');
    expect(output.project).toBe('wikimedia');
    expect(output.language).toBe('incubator');
    expect(output.article_url).toBe(input);
  });

  test('handles url-encoded characters in Wikipedia urls', () => {
    const input = 'https://es.wikipedia.org/wiki/Jalape%C3%B1o';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Jalapeño');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('es');
    expect(output.article_url).toBe(input);
  });

  test('correctly parses Wikipedia redlinks', () => {
    const input = 'https://en.wikipedia.org/w/index.php?title=Redlink&action=edit&redlink=1';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Redlink');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('en');
    expect(output.article_url).toBe(input);
  });

  test('correctly parses wikipedia redlinks (variation: The edit link for an older revision)', () => {
    const input = 'https://en.wikipedia.org/w/index.php?title=72nd_Primetime_Emmy_Awards&oldid=980777920&action=edit';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('72nd Primetime Emmy Awards');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('en');
    expect(output.article_url).toBe(input);
  });

  test('correctly parses wikipedia redlinks (variation: Section edit link)', () => {
    const input = 'https://en.wikipedia.org/w/index.php?title=Sweetwater_Formation&action=edit&section=2';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Sweetwater Formation');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('en');
    expect(output.article_url).toBe(input);
  });

  test('correctly parses wikipedia redlinks (variation: Old version of page)', () => {
    const input = 'https://en.wikipedia.org/w/index.php?title=Smedsb%C3%B6le_Radio_Mast&oldid=479392613';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Smedsböle Radio Mast');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('en');
    expect(output.article_url).toBe(input);
  });

  test('correctly parses wikipedia redlinks (variation: Old version edit link using VisualEditor)', () => {
    const input = ' https://en.wikipedia.org/w/index.php?title=Christian_Social_Party_of_Obwalden&oldid=886780353&veaction=editsource';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Christian Social Party of Obwalden');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('en');
    expect(output.article_url).toBe(input);
  });

  test('correctly parses mobile Wikipedia redlinks', () => {
    const input = 'https://en.m.wikipedia.org/w/index.php?title=Red_link&action=edit&redlink=1';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Red link');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('en');
    expect(output.article_url).toBe(input);
  });

  test('correctly parses Wikimedia redlinks', () => {
    const input = 'https://incubator.wikimedia.org/w/index.php?title=Redlink&action=edit&redlink=1';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Redlink');
    expect(output.project).toBe('wikimedia');
    expect(output.language).toBe('incubator');
    expect(output.article_url).toBe(input);
  });

  test('handles url-encoded characters in Wikipedia redlinks -- #1', () => {
    const input = 'https://en.wikipedia.org/w/index.php?title=Jalape%C3%B1o&action=edit&redlink=1';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Jalapeño');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('en');
    expect(output.article_url).toBe(input);
  });

  test('handles url-encoded characters in Wikipedia redlinks -- #2', () => {
    const input = 'https://en.wikipedia.org/w/index.php?title=Mesut%20%C3%96zil:REDLINK&redirect=no';
    const output = courseUtils.articleFromTitleInput(input);
    expect(output.title).toBe('Mesut Özil');
    expect(output.project).toBe('wikipedia');
    expect(output.language).toBe('en');
    expect(output.article_url).toBe(input);
  });
});

describe('courseUtils.articleFromAssignment', () => {
  test(
    'returns an article object with the language, project, title, and url',
    () => {
      const assignment = {
        article_url: 'https://es.wikipedia.org/wiki/Autofoto',
        language: 'es',
        article_title: 'Autofoto',
        project: 'wikipedia'
      };
      const defaultWiki = {
        language: 'es',
        project: 'wikipedia'
      };
      const article = courseUtils.articleFromAssignment(assignment, defaultWiki);
      expect(article.url).toBe('https://es.wikipedia.org/wiki/Autofoto');
      expect(article.title).toBe('Autofoto');
      expect(article.language).toBe('es');
      expect(article.formatted_title).toBe('Autofoto');
    }
  );

  test(
    'returns an article object with the language, project, title, and url, comparing it to the default wiki',
    () => {
      const assignment = {
        article_url: 'https://es.wikipedia.org/wiki/Silvia_Federici',
        language: 'es',
        article_title: 'Silvia Federici',
        project: 'wikipedia'
      };
      const defaultWiki = {
        language: 'en',
        project: 'wikipedia'
      };
      const article = courseUtils.articleFromAssignment(assignment, defaultWiki);
      expect(article.url).toBe('https://es.wikipedia.org/wiki/Silvia_Federici');
      expect(article.title).toBe('Silvia Federici');
      expect(article.language).toBe('es');
      expect(article.formatted_title).toBe('es:Silvia Federici');
    }
  );

  test(
    'returns an article object with the language of the default wiki if no langaue is set',
    () => {
      const assignment = {
        article_url: 'https://es.wikipedia.org/wiki/Silvia_Federici',
        article_title: 'Silvia Federici',
        project: 'wikipedia'
      };
      const defaultWiki = {
        language: 'es',
        project: 'wikipedia'
      };
      const article = courseUtils.articleFromAssignment(assignment, defaultWiki);
      expect(article.url).toBe('https://es.wikipedia.org/wiki/Silvia_Federici');
      expect(article.title).toBe('Silvia Federici');
      expect(article.language).toBe('es');
      expect(article.formatted_title).toBe('Silvia Federici');
    }
  );

  test('sets wikipedia as the default project', () => {
    const assignment = {
      article_url: 'https://en.wikipedia.org/wiki/Selfie',
      article_title: 'Selfie'
    };
    const defaultWiki = {
      language: 'en'
    };
    const article = courseUtils.articleFromAssignment(assignment, defaultWiki);
    expect(article.project).toBe('wikipedia');
  });

  test('constructs a url if one is not included', () => {
    const assignment = {
      article_title: 'Palo para autofoto',
      language: 'es',
      project: 'wikipedia'
    };
    const defaultWiki = {
      language: 'en',
      project: 'wikipedia'
    };
    const article = courseUtils.articleFromAssignment(assignment, defaultWiki);
    expect(article.url).toBe('https://es.wikipedia.org/wiki/Palo_para_autofoto');
  });
});

describe('courseUtils.hasTrainings', () => {
  test('returns false for a weeks array with no trainings', () => {
    const weeks = [{ blocks: [{ training_module_ids: [] }, { training_module_ids: [] }] }];
    const output = courseUtils.hasTrainings(weeks);
    expect(output).toBe(false);
  });

  test('returns true for a weeks array with trainings', () => {
    const weeks = [{ blocks: [{ training_module_ids: [] }, { training_module_ids: [1] }] }];
    const output = courseUtils.hasTrainings(weeks);
    expect(output).toBe(true);
  });
});

describe('courseUtils.formattedArticleTitle', () => {
  test(
    'returns a formatted_article from the same project and language in article and defaultWiki',
    () => {
      const defaultWiki = {
        language: 'en',
        project: 'wikipedia'
      };
      const article = {
        title: 'Riot Grrrl',
        language: 'en',
        project: 'wikipedia'
      };
      article.formatted_title = courseUtils.formattedArticleTitle(article, defaultWiki);
      expect(article.formatted_title).toBe('Riot Grrrl');
    }
  );

  test(
    'returns a formatted_article from same project different language',
    () => {
      const defaultWiki = {
        language: 'en',
        project: 'wikipedia'
      };
      const article = {
        title: 'Virgine Despentes',
        language: 'fr',
        project: 'wikipedia'
      };
      article.formatted_title = courseUtils.formattedArticleTitle(article, defaultWiki);
      expect(article.formatted_title).toBe('fr:Virgine Despentes');
    }
  );

  test('returns a formatted_article from diferent project same language', () => {
    const defaultWiki = {
      language: 'en',
      project: 'wikipedia'
    };
    const article = {
      title: 'Virginia Woolf',
      language: 'en',
      project: 'wikiquote'
    };
    article.formatted_title = courseUtils.formattedArticleTitle(article, defaultWiki);
    expect(article.formatted_title).toBe('wikiquote:Virginia Woolf');
  });

  test(
    'returns a formatted_article from diferent project different language',
    () => {
      const defaultWiki = {
        language: 'en',
        project: 'wikipedia'
      };
      const article = {
        title: 'Clara Campoamor',
        language: 'es',
        project: 'wikiquote'
      };
      article.formatted_title = courseUtils.formattedArticleTitle(article, defaultWiki);
      expect(article.formatted_title).toBe('es:wikiquote:Clara Campoamor');
    }
  );

  test(
    'returns a formatted_article from diferent project and no language',
    () => {
      const defaultWiki = {
        language: 'en',
        project: 'wikipedia'
      };
      const article = {
        title: 'Judith Butler',
        language: null,
        project: 'wikidata'
      };
      article.formatted_title = courseUtils.formattedArticleTitle(article, defaultWiki);
      expect(article.formatted_title).toBe('wikidata:Judith Butler');
    }
  );

  describe('courseUtils.courseStatsToUpdate', () => {
    const course = {
      title: 'My Course',
      description: 'My Description',
      student_count: 0,
      upload_count: 0
    };

    const stats = {
      student_count: false,
      upload_count: false
    };

    test('should return an empty object if no stats should be updated', () => {
      const actual = courseUtils.courseStatsToUpdate(course, stats);
      const expected = {};
      expect(actual).toEqual(expected);
    });

    test(
      'should return key-value pairs of what stats to update in a course',
      () => {
        const courseData = { ...course, student_count: 99 };
        const newStats = { ...stats, student_count: true };

        const actual = courseUtils.courseStatsToUpdate(courseData, newStats);
        const expected = { student_count: 99 };
        expect(actual).toEqual(expected);
      }
    );
  });
});