public void ShouldProduceDesignDocumentsWithIdFromEmptyDirectories()
		{
			var directory = Mock.Of<IDirectory>(
				d => d.EnumerateDirectories() == new[] { 
					Mock.Of<IDirectory>(
						d1 =>
							d1.EnumerateFiles() == EmptyFileArray &&
							d1.EnumerateDirectories() == EmptyDirectoryArray &&
							d1.Name == "first_doc"
					), 
					Mock.Of<IDirectory>(
						d1 =>
							d1.EnumerateFiles() == EmptyFileArray &&
							d1.EnumerateDirectories() == EmptyDirectoryArray &&
							d1.Name == "second_doc"
					)
				}
			);

			var generatedDocs = new DesignDocumentAssembler(directory).Assemble();

			Assert.Equal(2, generatedDocs.Count);
			var keys = generatedDocs.Keys.ToList();
			var designDocumentA = generatedDocs[keys[0]];
			var designDocumentB = generatedDocs[keys[1]];

			Assert.Equal("_design/first_doc", designDocumentA.Id);
			Assert.Null(designDocumentA.Revision);
			Assert.Equal(
				JsonValue.Parse(@"{ ""_id"": ""_design/first_doc"" }"),
				designDocumentA.RawJsonObject,
				new JsonObjectComparier());

			Assert.Equal("_design/second_doc", designDocumentB.Id); 
			Assert.Null(designDocumentB.Revision);
			Assert.Equal(
				JsonValue.Parse(@"{ ""_id"": ""_design/second_doc"" }"),
				designDocumentB.RawJsonObject,
				new JsonObjectComparier());
		}
		public void ShouldProduceDesignDocumentsWithIdFromSpecialFile()
		{
			var directory = Mock.Of<IDirectory>(
				d => d.EnumerateDirectories() == new[] {
					Mock.Of<IDirectory>(
						d1 =>
							d1.EnumerateFiles() == 
								new[] { File("_id.with-some-strange-extention", "some special ID\n\r" )} &&
							d1.EnumerateDirectories() == EmptyDirectoryArray &&
							d1.Name == "strange_name"
						)
				}
			);

			var generatedDocs = new DesignDocumentAssembler(directory).Assemble();
			
			Assert.Equal(1, generatedDocs.Count);
			var generatedDoc = generatedDocs.Values.First();

			Assert.Equal("_design/some special ID", generatedDoc.Id);
			Assert.Null(generatedDoc.Revision);
			Assert.Equal(
				JsonValue.Parse(@"{ ""_id"": ""_design/some special ID"" }"),
				generatedDoc.RawJsonObject,
				new JsonObjectComparier());
		}
		public void ShouldMapTextFilesInSubDirectoriesToSubobjectProperties()
		{
			var directory = Mock.Of<IDirectory>(
				d => d.EnumerateDirectories() == new[] {
					Mock.Of<IDirectory>(
						d1 =>
							d1.EnumerateFiles() == EmptyFileArray &&
							d1.Name == "doc1" &&
							d1.EnumerateDirectories() == new [] {
								Mock.Of<IDirectory>(
									d2 => 
										d2.EnumerateFiles() == EmptyFileArray &&
										d2.Name == "interObj1" &&
										d2.EnumerateDirectories() == new [] {
											Mock.Of<IDirectory>(
												d3 => 
													d3.EnumerateFiles() == EmptyFileArray &&
													d3.Name == "interObj2" &&
													d3.EnumerateDirectories() == new [] {
															Mock.Of<IDirectory>(
																d4 => 
																	d4.Name == "interObj3" &&
																	d4.EnumerateFiles() == 
																		new[] { 
																			File("prop1.txt", "prop1 value"), 
																			File("prop2.js", "prop2 value")
																		}
															)
													}
											)
										}
								)
							} 
						)
				}
			);

			var generatedDocs = new DesignDocumentAssembler(directory).Assemble();
			var generatedDoc = generatedDocs.Values.First();


			Assert.Equal(1, generatedDocs.Count);
			Assert.Equal("_design/doc1", generatedDoc.Id);
			Assert.Null(generatedDoc.Revision);
			
			Assert.Equal(
				JsonObject.Parse(@"{ 
					""_id"": ""_design/doc1"", 
					""interObj1"": {
						""interObj2"": {
							""interObj3"": {
								""prop1"": ""prop1 value"", 
								""prop2"": ""prop2 value"" 
							}
						}
					}
				}"),
				generatedDoc.RawJsonObject,
				new JsonObjectComparier());
		}
		public void ShouldMapTextFilesInDirectoryToDocumentProperties()
		{
			var directory = Mock.Of<IDirectory>(
				d => d.EnumerateDirectories() == new[] {
					Mock.Of<IDirectory>(
						d1 =>
							d1.EnumerateFiles() == new[] {
								File("prop1.txt", "prop1 value"),
								File("prop2.js", "prop2 value")
							} &&
							d1.EnumerateDirectories() == EmptyDirectoryArray &&
							d1.Name == "doc1"
						)
				}
			);

			var generatedDocs = new DesignDocumentAssembler(directory).Assemble();

			Assert.Equal(1, generatedDocs.Count);
			var generatedDoc = generatedDocs.Values.First();

			Assert.Equal("_design/doc1", generatedDoc.Id);
			Assert.Null(generatedDoc.Revision);
			Assert.Equal(
				JsonValue.Parse(@"{ ""_id"": ""_design/doc1"", ""prop1"": ""prop1 value"", ""prop2"": ""prop2 value"" }"),
				generatedDoc.RawJsonObject,
				new JsonObjectComparier());
		}