Morph black box tests for system branches and workspaces ======================================================== Morph implements **system branches**, which are checked out and manipulated by the user in **workspaces**. See FIXME for more information. Workspace creation ------------------ The first thing a user needs to do is create a workspace. SCENARIO create and initialise a new workspace GIVEN no workspace WHEN the user initialises a workspace THEN an empty workspace exists The workspace directory may exist, if it is empty. SCENARIO initialise an empty workspace directory GIVEN an empty workspace directory WHEN the user initialises a workspace THEN an empty workspace exists However, the directory must really be empty. It must not be an empty, but initialised workspace. SCENARIO initialise an existing, empty workspace directory GIVEN no workspace WHEN the user initialises a workspace AND the user attempts to initialise a workspace THEN morph failed Likewise, if the directory exists, and is non-empty, but isn't an existing workspace, initialising it should fail. SCENARIO initialise a non-empty workspace directory GIVEN a non-empty workspace directory WHEN the user attempts to initialise a workspace THEN morph failed Checking out or branching system branches ----------------------------------------- Once we have a workspace, we can check out a system branch. SCENARIO check out an existing system branch GIVEN a workspace AND a git server WHEN the user checks out the system branch called master THEN the system branch master is checked out Checking out a system branch should fail, if the branch doesn't exist. SCENARIO checking out a system branch that doesn't exist GIVEN a workspace AND a git server WHEN the user attempts to check out the system branch called foo THEN morph failed We can, instead, create a new system branch, off master. SCENARIO branch off master GIVEN a workspace AND a git server WHEN the user creates a system branch called foo THEN the system branch foo is checked out We can also branch off another system branch. However, we need to first push the other branch to the git server, since Morph is not smart enough to check for that locally. SCENARIO branch off non-master GIVEN a workspace AND a git server WHEN the user creates a system branch called foo AND the user pushes the system branch called foo to the git server AND the user creates a system branch called bar, based on foo THEN the system branch bar is checked out Query commands in workspaces ---------------------------- `morph workspace` writes out the fully qualified path to the workspace directory, regardless of where the user is. There's a few cases. SCENARIO morph workspace works at root of empty workspace GIVEN a workspace WHEN the user reports the workspace from the directory . THEN the workspace is reported correctly Also check it in the root of a system branch checkout, and inside a git checkout inside that. SCENARIO morph workspace works in system branch checkouts GIVEN a workspace AND a git server WHEN the user checks out the system branch called master AND the user reports the workspace from the directory master THEN the workspace is reported correctly We leak a little bit of the implementation here, to keep things simple: the (mocked) git server the implementation sets up has the `test:morphs` repository, which is the system branch root repository. WHEN the user reports the workspace from the directory master/test/morphs THEN the workspace is reported correctly However, running it outside a workspace should fail. SCENARIO morph fails outside workspace GIVEN no workspace WHEN the user attempts to report the workspace from a non-workspace directory THEN morph failed `morph show-system-branch` should report the name of the system branch, when run anywhere in the system branch checkout. As a special case, if there is only one system branch checkout at or below the current working directory, it will find it and report it correctly. SCENARIO morph reports system branch GIVEN a workspace AND a git server WHEN the user checks out the system branch called master AND the user reports the system branch from the directory master THEN the system branch is reported as master WHEN the user reports the system branch from the directory master/test/morphs THEN the system branch is reported as master WHEN the user reports the system branch from the directory . THEN the system branch is reported as master However, if there's two system branches checked out below the current directory, things should fail. SCENARIO morph fails to report system branch with two checked out GIVEN a workspace AND a git server WHEN the user checks out the system branch called master AND the user creates a system branch called foo AND the user attempts to report the system branch from the directory . THEN morph failed `morph show-branch-root` reports the URL (possibly aliases) of the system branch root repository. It can be run inside a checkout, or somewhere outside a checkout, where exactly one checkout exists below. SCENARIO morph reports system branch root repository GIVEN a workspace AND a git server WHEN the user checks out the system branch called master AND the user reports the system branch root repository from the directory master THEN the system branch root repository is reported as test:morphs WHEN the user reports the system branch root repository from the directory . THEN the system branch root repository is reported as test:morphs However, it fails if run outside a checkout and there's no system branches checked out. SCENARIO morph fails to report system branch with none checked out GIVEN a workspace AND a git server WHEN the user attempts to report the system branch root repository from the directory . THEN morph failed Editing components ------------------ `morph edit` can edit refs for a stratum only, or it can do that for a chunk, and check out the chunk's repository. First of all, we verify that that when we create a system branch, all the refs are unchanged. SCENARIO morph branch does not edit refs GIVEN a workspace AND a git server WHEN the user creates a system branch called foo THEN in branch foo, stratum strata/test-stratum.morph refs test-chunk in master Edit the chunk. We make use of special knowledge here: `test:test-chunk` is a chunk repository created in the mocked git server, for testing purposes. WHEN the user edits the chunk test-chunk in branch foo THEN in branch foo, stratum strata/test-stratum.morph refs test-chunk in foo AND the edited chunk test:test-chunk has git branch foo Editing a morphology should not cause it to start having repo or ref fields when referring to strata, when it didn't before. AND in branch foo, system systems/test-system.morph refers to test-stratum without repo AND in branch foo, system systems/test-system.morph refers to test-stratum without ref Status of system branch checkout -------------------------------- `morph status` shows the status of all git repositories in a system branch checkout: only the ones that exist locally, not all the repositories referenced in the system branch. SCENARIO morph status reports changes correctly GIVEN a workspace AND a git server WHEN the user creates a system branch called foo THEN morph reports no outstanding changes in foo WHEN the user edits the chunk test-chunk in branch foo THEN morph reports changes in foo in test:morphs only WHEN creating file foo in test/test-chunk in branch foo THEN morph reports changes in foo in test:morphs only WHEN adding file foo in test:test-chunk in branch foo to git THEN morph reports changes in foo in test:morphs and test:test-chunk WHEN committing changes in test:morphs in branch foo THEN morph reports changes in foo in test:test-chunk only WHEN committing changes in test:test-chunk in branch foo THEN morph reports no outstanding changes in foo `morph foreach` -------------- `morph foreach` runs a shell command in each of the git repos in a system branch checkout. SCENARIO morph foreach runs command in each git repo GIVEN a workspace AND a git server WHEN the user creates a system branch called foo AND the user edits the chunk test-chunk in branch foo AND running shell command in each repo in foo THEN morph ran command in test/morphs in foo AND morph ran command in test/test-chunk in foo Explicit petrification ---------------------- We petrify branches explicitly (though this may later change so that `morph branch` does it automatically). To test this, we create a branch, petrify it, and verify that every ref looks like a SHA1. We then unpetrify and verify that we have all the same refs as before. SCENARIO morph petrifies and unpetrifies GIVEN a workspace AND a git server WHEN the user creates a system branch called foo AND the user pushes the system branch called foo to the git server AND remembering all refs in foo AND petrifying foo THEN foo is petrified Petrifying a morphology should not cause it to start having repo or ref fields when referring to strata, when it didn't before. AND in branch foo, system systems/test-system.morph refers to test-stratum without repo AND in branch foo, system systems/test-system.morph refers to test-stratum without ref Unpetrify must put the morphologies back in the same logical state they were in before. WHEN unpetrifying foo THEN foo refs are as remembered Unpetrifying a morphology should not cause it to start having repo or ref fields when referring to strata, when it didn't before. AND in branch foo, system systems/test-system.morph refers to test-stratum without repo AND in branch foo, system systems/test-system.morph refers to test-stratum without ref Generating a manifest works SCENARIO morph generates a manifest GIVEN a workspace AND a system artifact WHEN morph generates a manifest THEN the manifest is generated