@set-default-skin
Feature: Non-public site and work skins

  Scenario: A user should be able to create a skin with CSS
  Given I am logged in as "skinner"
    And the app name is "Example Archive"
  When I am on the new skin page
    And I fill in "Title" with "my blinking & skin"
    And I fill in "CSS" with "#title { text-decoration: blink;}"
    And I submit
  Then I should see "Skin was successfully created"
    And I should see "my blinking & skin skin by skinner"
    And I should see "text-decoration: blink;"
    And I should see "(No Description Provided)"
    And I should see "by skinner"
    But I should see a button with text "Use"
    And I should see "Delete"
    And I should see "Edit"
    And I should not see "Stop Using"
    And I should not see "(Approved)"
    And I should not see "(Not yet reviewed)"
    And I should see the page title "my blinking & skin | Example Archive"

  Scenario: A logged-out user should not be able to create skins.
  Given I am a visitor
  When I go to the new skin page
    Then I should see "Sorry, you don't have permission"

  Scenario: A user should be able to select one of their own non-public skins to use in
  their preferences
  Given I am logged in as "skinner"
    And I create the skin "my blinking skin" with css "#title { text-decoration: blink;}"
  When I am on skinner's preferences page
    And I select "my blinking skin" from "preference_skin_id"
    And I submit
  Then I should see "Your preferences were successfully updated."
    And I should see "#title {" in the page style
    And I should see "text-decoration: blink;" in the page style

  Scenario: A user should be able to select one of their own non-public skins to use in
  their My Skins page
  Given I am logged in as "skinner"
    And I create the skin "my blinking skin" with css "#title { text-decoration: blink;}"
  Then I should see "my blinking skin"
  When I press "Use"
  Then I should see "#title {" in the page style
    And I should see "text-decoration: blink;" in the page style

  Scenario: Skin titles should be unique
  Given I am logged in as "skinner"
  When I am on the new skin page
    And I fill in "Title" with "Default"
    And I submit
  Then I should see "must be unique"

  Scenario: The user who creates a skin should be able to edit it
  Given I am logged in as "skinner"
    And I create the skin "my skin"
  When I follow "Edit"
    And I fill in "CSS" with "#greeting { text-decoration: blink;}"
    And I submit
  Then I should see an update confirmation message

  Scenario: Users should be able to create and use a work skin
  Given I am logged in as "skinner"
    And the default ratings exist
  When I am on the new skin page
    And I select "Work Skin" from "skin_type"
    And I fill in "Title" with "Awesome Work Skin"
    And I fill in "Description" with "Great work skin"
    And I fill in "CSS" with "p {color: purple;}"
    And I submit
  Then I should see "Skin was successfully created"
    And I should see "#workskin p"
  When I go to the new work page
  Then I should see "Awesome Work Skin"
  When I set up the draft "Story With Awesome Skin"
    And I select "Awesome Work Skin" from "work_work_skin_id"
    And I press "Preview"
  Then I should see "Preview"
    And I should see "color: purple" in the page style
  When I press "Post"
  Then I should see "Story With Awesome Skin"
    And I should see "color: purple" in the page style
    And I should see "Hide Creator's Style"
  When I follow "Hide Creator's Style"
  Then I should see "Story With Awesome Skin"
    And I should not see "color: purple"
    And I should not see "Hide Creator's Style"
    And I should see "Show Creator's Style"
  Then the cache of the skin on "Awesome Work Skin" should expire after I save the skin

  Scenario: log out from my skins page (Issue 2271)
  Given I am logged in as "skinner"
    And I am on skinner's user page
  When I follow "Skins"
    And I log out
  Then I should be on the login page

  Scenario: Create a complex replacement skin using Archive skin components
  Given I have loaded site skins
    And I am logged in as "skinner"
  When I set up the skin "Complex"
    And I select "replace archive skin entirely" from "What it does:"
    And I check "Load Archive Skin Components"
    And I submit
  Then I should see a create confirmation message
    And I should see "We've added all the archive skin components as parents. You probably want to remove some of them now!"
  When I check "Load Archive Skin Components"
    And I submit
  Then I should see errors

  Scenario: Vendor-prefixed properties should be allowed
    Given basic skins
      And I am logged in as "skinner"
    When I am on the new skin page
      And I fill in "Title" with "skin with prefixed property"
      And I fill in "CSS" with ".myclass { -moz-box-sizing: border-box; -webkit-transition: opacity 2s; }"
      And I submit
    Then I should see "Skin was successfully created"
    Then the cache of the skin on "skin with prefixed property" should expire after I save the skin

  Scenario: #workskin selector prefixing
    Given basic skins
      And I am logged in as "skinner"
    When I am on the new skin page
      And I select "Work Skin" from "skin_type"
      And I fill in "Title" with "#worksin prefixing"
      And I fill in "CSS" with "#workskin, #workskin a, #workskin:hover, #workskin *, .prefixme, .prefixme:hover, * .prefixme { color: red; }"
      And I submit
    Then I should not see "#workskin #workskin,"
      And I should not see "#workskin #workskin a"
      And I should see ", #workskin a,"
      And I should not see "#workskin #workskin:hover"
      And I should see "#workskin .prefixme,"
      And I should see "#workskin .prefixme:hover"
      And I should see "#workskin * .prefixme"

  Scenario: New skin form should have the correct skin type pre-selected
    Given I am logged in as "skinner"
    When I am on the skins page
      And I follow "Create Site Skin"
    Then "Site Skin" should be selected within "skin_type"
    When I am on the skins page
      And I follow "My Work Skins"
      And I follow "Create Work Skin"
    Then "Work Skin" should be selected within "skin_type"

  Scenario: Skin type should persist and remain selectable if you encounter errors
  during creation
    Given I am logged in as "skinner"
    When I am on the skins page
      And I follow "My Work Skins"
      And I follow "Create Work Skin"
      And I fill in "Title" with "invalid skin"
      And I fill in "CSS" with "this is invalid css"
      And I submit
    Then I should see errors
      And "Work Skin" should be selected within "skin_type"
    When I select "Site Skin" from "skin_type"
      And I fill in "CSS" with "still invalid css"
      And I submit
    Then I should see errors
      And "Site Skin" should be selected within "skin_type"

  Scenario: View toggle buttons on skins (Issue 3197)
  Given basic skins
    And I am logged in as "skinner"
  When I am on skinner's skins page
  Then I should see "My Site Skins"
    And I should see "My Work Skins"
    And I should see "Public Site Skins"
    And I should see "Public Work Skins"

  Scenario: Toggle between user's work skins and site skins
  Given basic skins
    And I am logged in as "skinner"
    And I am on skinner's skins page
  When I follow "My Work Skins"
  Then I should see "My Work Skins"
    When I follow "My Site Skins"
  Then I should see "My Site Skins"

  Scenario: The cache should be flushed with a parent and not when unrelated
  Given I have loaded site skins
    And I am logged in as "skinner"
    And I have a skin "Child" with a parent "Parent"
   When I am on the new skin page
    And I fill in "Title" with "Unrelated"
    And I fill in "CSS" with "#title { text-decoration: blink;}"
    And I submit
  Then I should see "Skin was successfully created"
    And the cache of the skin on "Unrelated" should not expire after I save "Child"
    And the cache of the skin on "Child" should expire after I save a parent skin

  Scenario: Users should be able to create skins using @media queries
  Given I am logged in as "skinner"
    And I set up the skin "Media Query Test Skin"
    And I check "only screen and (max-width: 42em)"
    And I check "only screen and (max-width: 62em)"
  When I press "Submit"
  Then I should see a create confirmation message
    And I should see "only screen and (max-width: 42em), only screen and (max-width: 62em)"
  When I press "Use"
  Then the page should have a skin with the media query "only screen and (max-width: 42em), only screen and (max-width: 62em)"

  Scenario: A user should be able to delete a skin
  Given I am logged in as "skinner"
    And I create the skin "Ugly Skin"
  When I go to "Ugly Skin" skin page
    And I follow "Delete"
    And I press "Yes, Delete Skin"
  Then I should see "The skin was deleted."
    And I should be on skinner's skins page
    And I should not see "Ugly Skin"

  Scenario: A user's skin should be reset to the default if they delete the skin they
  are using
  Given I am logged in as "skinner"
    And I create the skin "Ugly Skin"
    And I change my skin to "Ugly Skin"
  When I go to skinner's skins page
    And I follow "Delete"
    And I press "Yes, Delete Skin"
  Then I should see "The skin was deleted."
  When I go to skinner's preferences page
  Then "Default" should be selected within "preference_skin_id"

  Scenario: A user can't make a skin with "Archive" in the title
  Given I am logged in as "skinner"
    And I set up the skin "My Archive Skin" with some css
    And I press "Submit"
  Then I should see "Sorry, titles including the word 'Archive' are reserved for official skins."

  Scenario: A user can't look at another user's skins
  Given the user "scully" exists and is activated
    And I am logged in as "skinner"
  When I go to scully's skins page
  Then I should see "You can only browse your own skins and approved public skins."
    And I should be on the public skins page

  Scenario: A user can't use fixed positioning in a work skin
  Given I am logged in as "skinner"
  When I set up the skin "Work Skin" with css ".selector {position: fixed; top: 0;}"
    And I select "Work Skin" from "Type"
    And I submit
  Then I should see "The position property in .selector cannot have the value fixed in work skins, sorry!"

  Scenario: User should be able to access their site and work skins from an
  individual skin's show page
  Given I am logged in as "skinner"
    And I create the skin "my skin"
  When I view the skin "my skin"
  Then I should see "My Site Skins"
    And I should see "My Work Skins"

  Scenario: User should be able to revert to the default skin from an individual
  skin's show page
  Given basic skins
    And I am logged in as "skinner"
    And I create the skin "my skin"
  When I view the skin "my skin"
  Then I should not see a "Revert to Default Skin" button
  When I press "Use"
    And I view the skin "my skin"
  Then I should see a "Revert to Default Skin" button
    And I should see "My Work Skins"

  Scenario: User should be able to access their site and work skins from an
  individual skin's edit page
  Given I am logged in as "skinner"
    And I create the skin "my skin"
  When I edit the skin "my skin"
  Then I should see "My Site Skins"
    And I should see "My Work Skins"

  Scenario: User should be able to revert to the default skin from an individual
  skin's edit page
  Given basic skins
    And I am logged in as "skinner"
    And I create the skin "my skin"
  When I edit the skin "my skin"
  Then I should not see a "Revert to Default Skin" button
  When I change my skin to "my skin"
    And I edit the skin "my skin"
  Then I should see a "Revert to Default Skin" button

  Scenario: When a cached skin is the child of a cached skin, and the parent is updated, the child reflects the changes to the parent
    Given I am logged in as "skin_maker"
      And I have a skin "Child Skin" with a parent "Parent Skin"
      And the skin "Child Skin" is cached
      And the skin "Parent Skin" is cached
      And I change my skin to "Child Skin"
    # Only admins can edit cached skins:
    When I am logged in as a "superadmin" admin
      And I edit the skin "Parent Skin"
      And I fill in "CSS" with "body { background: cyan; }"
      And I press "Update"
    Then the filesystem cache of the skin "Child Skin" should include "background: cyan;"
    When I am logged in as "skin_maker"
    Then the page should have the cached skin "Child Skin"

  Scenario: When a cached skin is the child of an uncached skin, and the parent is updated, the child reflects the changes to the parent
    Given I am logged in as "skin_maker"
      And I have a skin "Child Skin" with a parent "Parent Skin"
      And the skin "Child Skin" is cached
      And I change my skin to "Child Skin"
    When I edit the skin "Parent Skin"
      And I fill in "CSS" with "body { background: cyan; }"
      And I press "Update"
    Then the filesystem cache of the skin "Child Skin" should include "background: cyan;"
      And the page should have the cached skin "Child Skin"

  Scenario: When an uncached skin is the child of a cached skin, and the parent is updated, the child reflects the changes to the parent
    Given I am logged in as "skin_maker"
      And I have a skin "Child Skin" with a parent "Parent Skin"
      And the skin "Parent Skin" is cached
      And I change my skin to "Child Skin"
    # Only admins can edit cached skins:
    When I am logged in as a "superadmin" admin
      And I edit the skin "Parent Skin"
      And I fill in "CSS" with "body { background: cyan; }"
      And I press "Update"
    Then the filesystem cache of the skin "Parent Skin" should include "background: cyan;"
    When I am logged in as "skin_maker"
    Then the page should have the cached skin "Parent Skin"

  Scenario: When an uncached skin is the child of an uncached skin, and the parent is updated, the child reflects the changes to the parent
    Given I am logged in as "skin_maker"
      And I have a skin "Child Skin" with a parent "Parent Skin"
      And I change my skin to "Child Skin"
    When I edit the skin "Parent Skin"
      And I fill in "CSS" with "body { background: cyan; }"
      And I press "Update"
    Then I should see "background: cyan;"

  @javascript
  Scenario: User can add a parent skin using the Custom CSS form
    Given the skin "Dad" by "skinner"
      And I am logged in as "skinner"
    When I go to the new skin page
    Then I should see "Advanced"
    When I follow "Show ↓"
    Then I should see "Parent Skins"
    When I fill in "Title" with "Child"
      And I follow "Add parent skin"
      And it is currently 1 second from now
    Then I should see a parent skin text field
    When I enter "Dad" in the "skin_skin_parents_attributes_1_parent_skin_title_autocomplete" autocomplete field
      And I press "Submit"
    Then I should see "Parent Skins"
      And I should see "Dad"
