Advertisement
Guest User

Untitled

a guest
Aug 22nd, 2016
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 10.92 KB | None | 0 0
  1. package publisher.dashboard
  2.  
  3. import browser.AdaptiveBrowser
  4. import common.integration.dump.DBQuery
  5. import common.integration.dump.dumps.{C3MergedTables, PublisherDashboardDump}
  6. import infrastructure.FakeInfrastructureWithNodeJs
  7. import org.apache.commons.lang.time.DateUtils
  8. import org.joda.time.DateTime
  9. import org.openqa.selenium.JavascriptExecutor
  10. import page.publisher.dashboard.DataRange.DataRange
  11. import page.publisher.dashboard.{DataRange, ItemsPerPage, PublisherDashboard}
  12. import play.api.test.PlaySpecification
  13.  
  14. /**
  15.   * Created by olharuban on 7/22/16.
  16.   */
  17.  
  18. class PublisherDashboardSpec extends PlaySpecification with FakeInfrastructureWithNodeJs
  19.   with PublisherDashboardDump with DBQuery {
  20.  
  21.   import PublisherDashboard._
  22.  
  23.   lazy val publisherDashboard = PublisherDashboard(browser)
  24.   lazy val asserts: Asserts = new Asserts()
  25.  
  26.   s"\nPublisher dashboard" should {
  27.  
  28.     import DBHelper._
  29.  
  30.     sequential
  31.  
  32.     val now: DateTime = DateTime.now().minusDays(1)
  33.  
  34.     "display data for first media group" in {
  35.  
  36.       val mediaGroupName = "101 holidays Ltd"
  37.       val mediaGroupId = 137
  38.  
  39.       "have page loaded successfully" in {
  40.         maximizeScreen(browser)
  41.         publisherDashboard.goWithCookie()
  42.         publisherDashboard.isCurrentPage
  43.       }
  44.  
  45.       "display selected media group name" in {
  46.         publisherDashboard.selectMediaGroup(mediaGroupName)
  47.         publisherDashboard.currentMediaGroupName.getText must be equalTo mediaGroupName.toUpperCase
  48.       }
  49.  
  50.       Seq((DataRange.Yesterday, now, now),
  51.         (DataRange.WTD, now.withDayOfWeek(1), now),
  52.         (DataRange.MTD, now.withDayOfMonth(1), now),
  53.         (DataRange.YTD, now.withDayOfYear(1), now),
  54.         (DataRange.CUSTOM, now.minusDays(49), now.minusDays(49)
  55.           )
  56.       ).map {
  57.         case (range: DataRange, startDate: DateTime, endDate: DateTime) =>
  58.  
  59.           s"have the same data with DB for $range data range" in {
  60.  
  61.             "data picker and data range values" in {
  62.               if (range == DataRange.CUSTOM)
  63.                 publisherDashboard.setDatesWithJson(mediaGroupId.toString, startDate, endDate)
  64.               else
  65.                 publisherDashboard.selectDataRange(range)
  66.  
  67.               if (range == DataRange.WTD  &&
  68.                 now.getDayOfWeek == 1
  69.               ) {
  70.                 asserts.assertDataRange(DataRange.Yesterday)
  71.               } else {
  72.                 asserts.assertDataRange(range)
  73.               }
  74.               asserts.assertCurrentDataPicker(startDate, endDate)
  75.             }
  76.  
  77.             "table with same rows of impressions and revenues" in {
  78.               publisherDashboard.getTableValues.sorted should be equalTo
  79.                 getImpressionsAndRevenues(mediaGroupName, Some(startDate), Some(endDate)).sorted
  80.             }
  81.  
  82.             "unique users and unique keywords" in {
  83.               asserts.assertUniqueUsersAndUniqueSearchesEqualsWithDB(mediaGroupId)
  84.             }
  85.  
  86.             "total impressions server, total revenue and total keywords" in {
  87.               asserts.assertTotalValues(mediaGroupName, startDate, endDate)
  88.             }
  89.  
  90.           }
  91.  
  92.       }
  93.  
  94.       "have pagination and table expander" in {
  95.         publisherDashboard.selectDataRange(DataRange.YTD)
  96.         publisherDashboard.expandTable(ItemsPerPage._10)
  97.         publisherDashboard.tableParamsRows.size() aka "columns count" mustEqual 10
  98.         publisherDashboard.selectNextPage
  99.         publisherDashboard.tableParamsRows.size() aka "columns count" mustEqual 10
  100.         publisherDashboard.selectPreviousPage
  101.         publisherDashboard.selectPage(2)
  102.         publisherDashboard.expandTable(ItemsPerPage._25)
  103.         publisherDashboard.tableParamsRows.size() aka "columns count" mustEqual 20
  104.       }
  105.  
  106.       "display table for specific media group property" in {
  107.         browser.executeScript("scroll(0, -250);")
  108.         publisherDashboard.selectProperty("101HONEYMOONS.CO.UK")
  109.         publisherDashboard.getTableValues.sorted should be equalTo
  110.           getImpressionsAndRevenuesForProperty(11037, None, None).sorted
  111.  
  112.         publisherDashboard.selectProperty("101HOLIDAYS.CO.UK")
  113.         publisherDashboard.getTableValues.sorted should be equalTo
  114.           getImpressionsAndRevenuesForProperty(11036, None, None).sorted
  115.  
  116.       }
  117.  
  118.     }
  119.  
  120.     "display data when change media group" in {
  121.  
  122.       val mediaGroupName = "33 Across Inc."
  123.       val mediaGroupId = 227
  124.       val startDate = now.withDayOfYear(1)
  125.       val endDate = now
  126.  
  127.       "display selected media group name" in {
  128.         publisherDashboard.selectMediaGroup(mediaGroupName)
  129.         publisherDashboard.currentMediaGroupName.getText must be equalTo mediaGroupName.toUpperCase
  130.       }
  131.  
  132.       "table with same rows of impressions and revenues" in {
  133.         publisherDashboard.getTableValues.sorted should be equalTo
  134.           getImpressionsAndRevenues(mediaGroupName, Some(startDate), Some(endDate)).sorted
  135.       }
  136.  
  137.       "unique users and unique keywords" in {
  138.         asserts.assertUniqueUsersAndUniqueSearchesEqualsWithDB(mediaGroupId)
  139.       }
  140.  
  141.       "total impressions server, total revenue and total keywords" in {
  142.         asserts.assertTotalValues(mediaGroupName, startDate, endDate)
  143.       }
  144.  
  145.     }
  146.  
  147.   }
  148.  
  149.   class Asserts() {
  150.  
  151.     def assertUniqueUsersAndUniqueSearchesEqualsWithDB(mediaGroupId: Int) = {
  152.       val uniqueUsersAndUniqueSearches = DBHelper.getUniqueUsersAndUniqueSearches(mediaGroupId)
  153.       publisherDashboard.getUniqueUsers aka "Unique users" should be equalTo uniqueUsersAndUniqueSearches._1
  154.       publisherDashboard.getUniqueKeywords aka "Unique keywords" should be equalTo uniqueUsersAndUniqueSearches._2
  155.     }
  156.  
  157.     def assertTotalValues(mediaGroupName: String, startDate: DateTime, endDate: DateTime) = {
  158.       val totals = DBHelper.getTotalValues(mediaGroupName, Some(startDate), Some(endDate))
  159.       publisherDashboard.getTotalImpressionServed aka "Total Impression" should be equalTo totals._1
  160.       publisherDashboard.totalRevenue.getText aka "Total Revenue" must be equalTo totals._2
  161.       publisherDashboard.getTotalKeywords aka "Total Keywords" must be equalTo totals._3
  162.  
  163.       publisherDashboard.getTableTotalImpressions aka "Total Impression from table" should be equalTo totals._1
  164.       publisherDashboard.tableTotalRevenue.getText aka "Total Revenue from table" must be equalTo totals._2
  165.     }
  166.  
  167.     def assertCurrentDataPicker(startDate: DateTime, endDate: DateTime) = {
  168.       val startDateFormatted = datapickerStartDateFormat.print(startDate)
  169.       val endDateFormatted = datapickerEndDateFormat.print(endDate)
  170.       publisherDashboard.getCurrentDatapickerDate must beEqualTo(startDateFormatted + "-" + endDateFormatted).ignoreCase
  171.     }
  172.  
  173.     def assertDataRange(range: DataRange) = {
  174.       publisherDashboard.getCurrentDataRange must beEqualTo(range.toString)
  175.     }
  176.  
  177.   }
  178.  
  179.   object DBHelper {
  180.  
  181.     def getImpressionsAndRevenues(publisherName: String,
  182.                                   startDate: Option[DateTime] = None,
  183.                                   endDate: Option[DateTime] = None): List[(String, String, String)] = {
  184.  
  185.       val responseString =
  186.         s"""SELECT pub_dash_cube.day_start_utc::timestamp::date as day,
  187.        sum(impressions) as "impressions",
  188.        concat(sel_currency.symbol, cast(sum(revenues_property_currency) as decimal(10,2))) as "revenues"
  189.        FROM pub_dash_cube
  190.        JOIN media_group
  191.        ON media_group.id = pub_dash_cube.mediagroup_id
  192.        JOIN sel_currency
  193.        ON sel_currency.id = media_group.currency
  194.        WHERE media_group.name = '$publisherName' """ +
  195.           (for {
  196.             startDateVal <- startDate
  197.             endDateVal <- endDate
  198.           } yield {
  199.             s" AND cast(pub_dash_cube.day_start_utc as date) between '${dbDateFormat.print(startDate.get)}' " + s"and '${dbDateFormat.print(endDate.get)}'"
  200.           }).getOrElse("") +
  201.           """ GROUP BY day, sel_currency.symbol
  202.        ORDER BY day asc """
  203.       val rs = executeSQL(responseString)
  204.  
  205.       Iterator.continually((rs.next(), rs)).takeWhile(_._1)
  206.         .map { case (present, col) => (col.getString(1), col.getString(2), col.getString(3)) }.toList
  207.     }
  208.  
  209.     def getUniqueUsersAndUniqueSearches(publisherId: Int): (Int, Int) = {
  210.       getResponse(
  211.         s"""
  212.         SELECT unique_users, unique_searches
  213.         FROM pub_dash_cube_30days
  214.         WHERE mediagroup_id = '$publisherId'""") match {
  215.         case col => (col.getInt(1), col.getInt(2))
  216.       }
  217.     }
  218.  
  219.     def getTotalValues(publisherName: String,
  220.                        startDate: Option[DateTime] = None,
  221.                        endDate: Option[DateTime] = None): (Int, String, Int) = {
  222.       val responseString =
  223.         s"""
  224.          SELECT  sum(impressions) as "impressions",
  225.          concat(sel_currency.symbol, cast(sum(revenues_property_currency) as decimal(10,2))) as "revenues",
  226.          sum(searches) as "total_keywords"
  227.          FROM pub_dash_cube
  228.          JOIN media_group
  229.          ON media_group.id = pub_dash_cube.mediagroup_id
  230.          JOIN sel_currency
  231.          ON sel_currency.id = media_group.currency
  232.          WHERE media_group.name = '$publisherName' """ +
  233.           (for {
  234.             startDateVal <- startDate
  235.             endDateVal <- endDate
  236.           } yield {
  237.             s" AND cast(pub_dash_cube.day_start_utc as date) between '${dbDateFormat.print(startDate.get)}' and '${dbDateFormat.print(endDate.get)}'"
  238.           }).getOrElse("") +
  239.           " GROUP BY sel_currency.symbol "
  240.       getResponse(responseString) match {
  241.         case col => (col.getInt(1), col.getString(2), col.getInt(3))
  242.       }
  243.  
  244.     }
  245.  
  246.     def getImpressionsAndRevenuesForProperty(propertyId: Int,
  247.                                              startDate: Option[DateTime] = None,
  248.                                              endDate: Option[DateTime] = None): List[(String, String, String)] = {
  249.  
  250.       val responseString =
  251.         s"""SELECT pub_dash_cube.day_start_utc::timestamp::date as day,
  252.        sum(impressions) as "impressions",
  253.        concat(sel_currency.symbol, cast(sum(revenues_property_currency) as decimal(10,2))) as "revenues"
  254.        FROM pub_dash_cube
  255.        JOIN media_group
  256.        ON media_group.id = pub_dash_cube.mediagroup_id
  257.        JOIN sel_currency
  258.        ON sel_currency.id = media_group.currency
  259.        WHERE pub_dash_cube.property_id = '$propertyId' """ +
  260.           (for {
  261.             startDateVal <- startDate
  262.             endDateVal <- endDate
  263.           } yield {
  264.             s" AND cast(pub_dash_cube.day_start_utc as date) between '${dbDateFormat.print(startDate.get)}' " + s"and '${dbDateFormat.print(endDate.get)}'"
  265.           }).getOrElse("") +
  266.           """ GROUP BY day, sel_currency.symbol
  267.        ORDER BY day asc """
  268.       val rs = executeSQL(responseString)
  269.  
  270.       Iterator.continually((rs.next(), rs)).takeWhile(_._1)
  271.         .map { case (present, col) => (col.getString(1), col.getString(2), col.getString(3)) }.toList
  272.     }
  273.   }
  274.  
  275.  
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement